forked from aniani/vim
patch 7.4.1355
Problem: Win32 console and GUI handle channels differently. Solution: Consolidate code between Win32 console and GUI.
This commit is contained in:
@@ -1508,17 +1508,11 @@ channel_free_all(void)
|
|||||||
static int
|
static int
|
||||||
channel_wait(channel_T *channel, sock_T fd, int timeout)
|
channel_wait(channel_T *channel, sock_T fd, int timeout)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_SELECT) && !defined(FEAT_GUI_W32)
|
|
||||||
struct timeval tval;
|
|
||||||
fd_set rfds;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (timeout > 0)
|
if (timeout > 0)
|
||||||
ch_logn(channel, "Waiting for up to %d msec", timeout);
|
ch_logn(channel, "Waiting for up to %d msec", timeout);
|
||||||
|
|
||||||
|
|
||||||
# ifdef WIN32
|
# ifdef WIN32
|
||||||
if (channel->CH_SOCK == CHAN_FD_INVALID)
|
if (fd != channel->CH_SOCK)
|
||||||
{
|
{
|
||||||
DWORD nread;
|
DWORD nread;
|
||||||
int diff;
|
int diff;
|
||||||
@@ -1537,9 +1531,19 @@ channel_wait(channel_T *channel, sock_T fd, int timeout)
|
|||||||
* TODO: increase the sleep time when looping more often */
|
* TODO: increase the sleep time when looping more often */
|
||||||
Sleep(5);
|
Sleep(5);
|
||||||
}
|
}
|
||||||
return FAIL;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
#endif
|
#endif
|
||||||
|
{
|
||||||
|
#if defined(FEAT_GUI_W32)
|
||||||
|
/* Can't check socket for Win32 GUI, always return OK. */
|
||||||
|
ch_log(channel, "Can't check, assuming there is something to read");
|
||||||
|
return OK;
|
||||||
|
#else
|
||||||
|
# if defined(HAVE_SELECT)
|
||||||
|
struct timeval tval;
|
||||||
|
fd_set rfds;
|
||||||
|
int ret;
|
||||||
|
|
||||||
FD_ZERO(&rfds);
|
FD_ZERO(&rfds);
|
||||||
FD_SET((int)fd, &rfds);
|
FD_SET((int)fd, &rfds);
|
||||||
@@ -1549,33 +1553,27 @@ channel_wait(channel_T *channel, sock_T fd, int timeout)
|
|||||||
{
|
{
|
||||||
ret = select((int)fd + 1, &rfds, NULL, NULL, &tval);
|
ret = select((int)fd + 1, &rfds, NULL, NULL, &tval);
|
||||||
# ifdef EINTR
|
# ifdef EINTR
|
||||||
|
SOCK_ERRNO;
|
||||||
if (ret == -1 && errno == EINTR)
|
if (ret == -1 && errno == EINTR)
|
||||||
continue;
|
continue;
|
||||||
# endif
|
# endif
|
||||||
if (ret <= 0)
|
if (ret > 0)
|
||||||
{
|
return OK;
|
||||||
ch_log(channel, "Nothing to read");
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
# else
|
# else
|
||||||
# ifdef HAVE_POLL
|
|
||||||
struct pollfd fds;
|
struct pollfd fds;
|
||||||
|
|
||||||
if (timeout > 0)
|
|
||||||
ch_logn(channel, "Waiting for %d msec", timeout);
|
|
||||||
fds.fd = fd;
|
fds.fd = fd;
|
||||||
fds.events = POLLIN;
|
fds.events = POLLIN;
|
||||||
if (poll(&fds, 1, timeout) <= 0)
|
if (poll(&fds, 1, timeout) > 0)
|
||||||
{
|
return OK;
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
ch_log(channel, "Nothing to read");
|
ch_log(channel, "Nothing to read");
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return a unique ID to be used in a message.
|
* Return a unique ID to be used in a message.
|
||||||
@@ -1667,8 +1665,9 @@ channel_read(channel_T *channel, int which, char *func)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Reading a socket disconnection (readlen == 0), or a socket error. */
|
/* Reading a socket disconnection (readlen == 0), or a socket error.
|
||||||
if (readlen <= 0)
|
* TODO: call error callback. */
|
||||||
|
if (readlen <= 0 && channel->ch_job == NULL)
|
||||||
{
|
{
|
||||||
/* Queue a "DETACH" netbeans message in the command queue in order to
|
/* Queue a "DETACH" netbeans message in the command queue in order to
|
||||||
* terminate the netbeans session later. Do not end the session here
|
* terminate the netbeans session later. Do not end the session here
|
||||||
@@ -1836,6 +1835,35 @@ channel_fd2channel(sock_T fd, int *whichp)
|
|||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
channel_handle_events(void)
|
||||||
|
{
|
||||||
|
channel_T *channel;
|
||||||
|
int which;
|
||||||
|
static int loop = 0;
|
||||||
|
|
||||||
|
/* Skip heavily polling */
|
||||||
|
if (loop++ % 2)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (channel = first_channel; channel != NULL; channel = channel->ch_next)
|
||||||
|
{
|
||||||
|
# ifdef FEAT_GUI_W32
|
||||||
|
/* only check the pipes */
|
||||||
|
for (which = CHAN_OUT; which < CHAN_ERR; ++which)
|
||||||
|
# else
|
||||||
|
# ifdef CHANNEL_PIPES
|
||||||
|
/* check the socket and pipes */
|
||||||
|
for (which = CHAN_SOCK; which < CHAN_ERR; ++which)
|
||||||
|
# else
|
||||||
|
/* only check the socket */
|
||||||
|
which = CHAN_SOCK;
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
channel_read(channel, which, "channel_handle_events");
|
||||||
|
}
|
||||||
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1969,7 +1997,7 @@ channel_poll_check(int ret_in, void *fds_in)
|
|||||||
}
|
}
|
||||||
# endif /* UNIX && !HAVE_SELECT */
|
# endif /* UNIX && !HAVE_SELECT */
|
||||||
|
|
||||||
# if (!defined(FEAT_GUI_W32) && defined(HAVE_SELECT)) || defined(PROTO)
|
# if (!defined(WIN32) && defined(HAVE_SELECT)) || defined(PROTO)
|
||||||
/*
|
/*
|
||||||
* The type of "rfds" is hidden to avoid problems with the function proto.
|
* The type of "rfds" is hidden to avoid problems with the function proto.
|
||||||
*/
|
*/
|
||||||
@@ -2034,7 +2062,7 @@ channel_select_check(int ret_in, void *rfds_in)
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
# endif /* !FEAT_GUI_W32 && HAVE_SELECT */
|
# endif /* !WIN32 && HAVE_SELECT */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Execute queued up commands.
|
* Execute queued up commands.
|
||||||
|
|||||||
@@ -14635,14 +14635,14 @@ f_job_start(typval_T *argvars UNUSED, typval_T *rettv)
|
|||||||
ga_concat(&ga, (char_u *)" ");
|
ga_concat(&ga, (char_u *)" ");
|
||||||
ga_concat(&ga, (char_u *)argv[i]);
|
ga_concat(&ga, (char_u *)argv[i]);
|
||||||
}
|
}
|
||||||
ch_logs(NULL, "Starting job: %s", ga.ga_data);
|
ch_logs(NULL, "Starting job: %s", (char *)ga.ga_data);
|
||||||
ga_clear(&ga);
|
ga_clear(&ga);
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
mch_start_job(argv, job, &options);
|
mch_start_job(argv, job, &options);
|
||||||
#else
|
#else
|
||||||
# ifdef FEAT_CHANNEL
|
# ifdef FEAT_CHANNEL
|
||||||
ch_logs(NULL, "Starting job: %s", cmd);
|
ch_logs(NULL, "Starting job: %s", (char *)cmd);
|
||||||
# endif
|
# endif
|
||||||
mch_start_job((char *)cmd, job, &options);
|
mch_start_job((char *)cmd, job, &options);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -2099,6 +2099,10 @@ gui_mch_wait_for_chars(int wtime)
|
|||||||
parse_queued_messages();
|
parse_queued_messages();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef FEAT_CHANNEL
|
||||||
|
channel_handle_events();
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Don't use gui_mch_update() because then we will spin-lock until a
|
* Don't use gui_mch_update() because then we will spin-lock until a
|
||||||
* char arrives, instead we use GetMessage() to hang until an
|
* char arrives, instead we use GetMessage() to hang until an
|
||||||
|
|||||||
@@ -1128,30 +1128,6 @@ mch_setmouse(int on)
|
|||||||
SetConsoleMode(g_hConIn, cmodein);
|
SetConsoleMode(g_hConIn, cmodein);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FEAT_CHANNEL
|
|
||||||
static int
|
|
||||||
handle_channel_event(void)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
fd_set rfds;
|
|
||||||
int maxfd;
|
|
||||||
|
|
||||||
FD_ZERO(&rfds);
|
|
||||||
maxfd = channel_select_setup(-1, &rfds);
|
|
||||||
if (maxfd >= 0)
|
|
||||||
{
|
|
||||||
struct timeval tv;
|
|
||||||
|
|
||||||
tv.tv_sec = 0;
|
|
||||||
tv.tv_usec = 0;
|
|
||||||
ret = select(maxfd + 1, &rfds, NULL, NULL, &tv);
|
|
||||||
if (ret > 0 && channel_select_check(ret, &rfds) > 0)
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Decode a MOUSE_EVENT. If it's a valid event, return MOUSE_LEFT,
|
* Decode a MOUSE_EVENT. If it's a valid event, return MOUSE_LEFT,
|
||||||
* MOUSE_MIDDLE, or MOUSE_RIGHT for a click; MOUSE_DRAG for a mouse
|
* MOUSE_MIDDLE, or MOUSE_RIGHT for a click; MOUSE_DRAG for a mouse
|
||||||
@@ -1495,8 +1471,7 @@ WaitForChar(long msec)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FEAT_CHANNEL
|
#ifdef FEAT_CHANNEL
|
||||||
if (handle_channel_event())
|
channel_handle_events();
|
||||||
return TRUE;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (0
|
if (0
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ void channel_read(channel_T *channel, int which, char *func);
|
|||||||
char_u *channel_read_block(channel_T *channel);
|
char_u *channel_read_block(channel_T *channel);
|
||||||
int channel_read_json_block(channel_T *channel, int id, typval_T **rettv);
|
int channel_read_json_block(channel_T *channel, int id, typval_T **rettv);
|
||||||
channel_T *channel_fd2channel(sock_T fd, int *whichp);
|
channel_T *channel_fd2channel(sock_T fd, int *whichp);
|
||||||
|
void channel_handle_events(void);
|
||||||
int channel_send(channel_T *channel, char_u *buf, char *fun);
|
int channel_send(channel_T *channel, char_u *buf, char *fun);
|
||||||
int channel_poll_setup(int nfd_in, void *fds_in);
|
int channel_poll_setup(int nfd_in, void *fds_in);
|
||||||
int channel_poll_check(int ret_in, void *fds_in);
|
int channel_poll_check(int ret_in, void *fds_in);
|
||||||
|
|||||||
@@ -747,6 +747,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1355,
|
||||||
/**/
|
/**/
|
||||||
1354,
|
1354,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
Reference in New Issue
Block a user