Mercurial > vim
diff src/channel.c @ 8491:daebcbd87bd3 v7.4.1536
commit https://github.com/vim/vim/commit/de27989157f35172b25f9e01e0c147ed8f6ae3ce
Author: Bram Moolenaar <Bram@vim.org>
Date: Fri Mar 11 22:19:44 2016 +0100
patch 7.4.1536
Problem: Cannot re-use a channel for another job.
Solution: Add the "channel" option to job_start().
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Fri, 11 Mar 2016 22:30:04 +0100 |
parents | 8924d7adbc22 |
children | caed4b2d305f |
line wrap: on
line diff
--- a/src/channel.c +++ b/src/channel.c @@ -459,6 +459,9 @@ messageFromNetbeans(gpointer clientData, static void channel_gui_register_one(channel_T *channel, int part) { + if (!CH_HAS_GUI) + return; + # ifdef FEAT_GUI_X11 /* Tell notifier we are interested in being called * when there is input on the editor connection socket. */ @@ -499,12 +502,9 @@ channel_gui_register_one(channel_T *chan # endif } - void + static void channel_gui_register(channel_T *channel) { - if (!CH_HAS_GUI) - return; - if (channel->CH_SOCK_FD != INVALID_FD) channel_gui_register_one(channel, PART_SOCK); # ifdef CHANNEL_PIPES @@ -529,6 +529,30 @@ channel_gui_register_all(void) } static void +channel_gui_unregister_one(channel_T *channel, int part) +{ +# ifdef FEAT_GUI_X11 + if (channel->ch_part[part].ch_inputHandler != (XtInputId)NULL) + { + XtRemoveInput(channel->ch_part[part].ch_inputHandler); + channel->ch_part[part].ch_inputHandler = (XtInputId)NULL; + } +# else +# ifdef FEAT_GUI_GTK + if (channel->ch_part[part].ch_inputHandler != 0) + { +# if GTK_CHECK_VERSION(3,0,0) + g_source_remove(channel->ch_part[part].ch_inputHandler); +# else + gdk_input_remove(channel->ch_part[part].ch_inputHandler); +# endif + channel->ch_part[part].ch_inputHandler = 0; + } +# endif +# endif +} + + static void channel_gui_unregister(channel_T *channel) { int part; @@ -539,25 +563,7 @@ channel_gui_unregister(channel_T *channe part = PART_SOCK; #endif { -# ifdef FEAT_GUI_X11 - if (channel->ch_part[part].ch_inputHandler != (XtInputId)NULL) - { - XtRemoveInput(channel->ch_part[part].ch_inputHandler); - channel->ch_part[part].ch_inputHandler = (XtInputId)NULL; - } -# else -# ifdef FEAT_GUI_GTK - if (channel->ch_part[part].ch_inputHandler != 0) - { -# if GTK_CHECK_VERSION(3,0,0) - g_source_remove(channel->ch_part[part].ch_inputHandler); -# else - gdk_input_remove(channel->ch_part[part].ch_inputHandler); -# endif - channel->ch_part[part].ch_inputHandler = 0; - } -# endif -# endif + channel_gui_unregister_one(channel, part); } } @@ -830,19 +836,53 @@ channel_open( channel->ch_nb_close_cb = nb_close_cb; #ifdef FEAT_GUI - channel_gui_register(channel); + channel_gui_register_one(channel, PART_SOCK); #endif return channel; } #if defined(CHANNEL_PIPES) || defined(PROTO) + static void +may_close_part(sock_T *fd) +{ + if (*fd != INVALID_FD) + { + fd_close(*fd); + *fd = INVALID_FD; + } +} + void channel_set_pipes(channel_T *channel, sock_T in, sock_T out, sock_T err) { - channel->CH_IN_FD = in; - channel->CH_OUT_FD = out; - channel->CH_ERR_FD = err; + if (in != INVALID_FD) + { + may_close_part(&channel->CH_IN_FD); + channel->CH_IN_FD = in; + } + if (out != INVALID_FD) + { +# if defined(FEAT_GUI) + channel_gui_unregister_one(channel, PART_OUT); +# endif + may_close_part(&channel->CH_OUT_FD); + channel->CH_OUT_FD = out; +# if defined(FEAT_GUI) + channel_gui_register_one(channel, PART_OUT); +# endif + } + if (err != INVALID_FD) + { +# if defined(FEAT_GUI) + channel_gui_unregister_one(channel, PART_ERR); +# endif + may_close_part(&channel->CH_ERR_FD); + channel->CH_ERR_FD = err; +# if defined(FEAT_GUI) + channel_gui_register_one(channel, PART_ERR); +# endif + } } #endif @@ -1912,21 +1952,9 @@ channel_close(channel_T *channel, int in channel->CH_SOCK_FD = INVALID_FD; } #if defined(CHANNEL_PIPES) - if (channel->CH_IN_FD != INVALID_FD) - { - fd_close(channel->CH_IN_FD); - channel->CH_IN_FD = INVALID_FD; - } - if (channel->CH_OUT_FD != INVALID_FD) - { - fd_close(channel->CH_OUT_FD); - channel->CH_OUT_FD = INVALID_FD; - } - if (channel->CH_ERR_FD != INVALID_FD) - { - fd_close(channel->CH_ERR_FD); - channel->CH_ERR_FD = INVALID_FD; - } + may_close_part(&channel->CH_IN_FD); + may_close_part(&channel->CH_OUT_FD); + may_close_part(&channel->CH_ERR_FD); #endif if (invoke_close_cb && channel->ch_close_cb != NULL)