@@ -459,6 +459,9 @@ messageFromNetbeans(gpointer clientData,
459459 static void
460460channel_gui_register_one (channel_T * channel , int part )
461461{
462+ if (!CH_HAS_GUI )
463+ return ;
464+
462465# ifdef FEAT_GUI_X11
463466 /* Tell notifier we are interested in being called
464467 * when there is input on the editor connection socket. */
@@ -499,12 +502,9 @@ channel_gui_register_one(channel_T *channel, int part)
499502# endif
500503}
501504
502- void
505+ static void
503506channel_gui_register (channel_T * channel )
504507{
505- if (!CH_HAS_GUI )
506- return ;
507-
508508 if (channel -> CH_SOCK_FD != INVALID_FD )
509509 channel_gui_register_one (channel , PART_SOCK );
510510# ifdef CHANNEL_PIPES
@@ -528,6 +528,30 @@ channel_gui_register_all(void)
528528 channel_gui_register (channel );
529529}
530530
531+ static void
532+ channel_gui_unregister_one (channel_T * channel , int part )
533+ {
534+ # ifdef FEAT_GUI_X11
535+ if (channel -> ch_part [part ].ch_inputHandler != (XtInputId )NULL )
536+ {
537+ XtRemoveInput (channel -> ch_part [part ].ch_inputHandler );
538+ channel -> ch_part [part ].ch_inputHandler = (XtInputId )NULL ;
539+ }
540+ # else
541+ # ifdef FEAT_GUI_GTK
542+ if (channel -> ch_part [part ].ch_inputHandler != 0 )
543+ {
544+ # if GTK_CHECK_VERSION (3 ,0 ,0 )
545+ g_source_remove (channel -> ch_part [part ].ch_inputHandler );
546+ # else
547+ gdk_input_remove (channel -> ch_part [part ].ch_inputHandler );
548+ # endif
549+ channel -> ch_part [part ].ch_inputHandler = 0 ;
550+ }
551+ # endif
552+ # endif
553+ }
554+
531555 static void
532556channel_gui_unregister (channel_T * channel )
533557{
@@ -539,25 +563,7 @@ channel_gui_unregister(channel_T *channel)
539563 part = PART_SOCK ;
540564#endif
541565 {
542- # ifdef FEAT_GUI_X11
543- if (channel -> ch_part [part ].ch_inputHandler != (XtInputId )NULL )
544- {
545- XtRemoveInput (channel -> ch_part [part ].ch_inputHandler );
546- channel -> ch_part [part ].ch_inputHandler = (XtInputId )NULL ;
547- }
548- # else
549- # ifdef FEAT_GUI_GTK
550- if (channel -> ch_part [part ].ch_inputHandler != 0 )
551- {
552- # if GTK_CHECK_VERSION (3 ,0 ,0 )
553- g_source_remove (channel -> ch_part [part ].ch_inputHandler );
554- # else
555- gdk_input_remove (channel -> ch_part [part ].ch_inputHandler );
556- # endif
557- channel -> ch_part [part ].ch_inputHandler = 0 ;
558- }
559- # endif
560- # endif
566+ channel_gui_unregister_one (channel , part );
561567 }
562568}
563569
@@ -830,19 +836,53 @@ channel_open(
830836 channel -> ch_nb_close_cb = nb_close_cb ;
831837
832838#ifdef FEAT_GUI
833- channel_gui_register (channel );
839+ channel_gui_register_one (channel , PART_SOCK );
834840#endif
835841
836842 return channel ;
837843}
838844
839845#if defined(CHANNEL_PIPES ) || defined(PROTO )
846+ static void
847+ may_close_part (sock_T * fd )
848+ {
849+ if (* fd != INVALID_FD )
850+ {
851+ fd_close (* fd );
852+ * fd = INVALID_FD ;
853+ }
854+ }
855+
840856 void
841857channel_set_pipes (channel_T * channel , sock_T in , sock_T out , sock_T err )
842858{
843- channel -> CH_IN_FD = in ;
844- channel -> CH_OUT_FD = out ;
845- channel -> CH_ERR_FD = err ;
859+ if (in != INVALID_FD )
860+ {
861+ may_close_part (& channel -> CH_IN_FD );
862+ channel -> CH_IN_FD = in ;
863+ }
864+ if (out != INVALID_FD )
865+ {
866+ # if defined(FEAT_GUI )
867+ channel_gui_unregister_one (channel , PART_OUT );
868+ # endif
869+ may_close_part (& channel -> CH_OUT_FD );
870+ channel -> CH_OUT_FD = out ;
871+ # if defined(FEAT_GUI )
872+ channel_gui_register_one (channel , PART_OUT );
873+ # endif
874+ }
875+ if (err != INVALID_FD )
876+ {
877+ # if defined(FEAT_GUI )
878+ channel_gui_unregister_one (channel , PART_ERR );
879+ # endif
880+ may_close_part (& channel -> CH_ERR_FD );
881+ channel -> CH_ERR_FD = err ;
882+ # if defined(FEAT_GUI )
883+ channel_gui_register_one (channel , PART_ERR );
884+ # endif
885+ }
846886}
847887#endif
848888
@@ -1912,21 +1952,9 @@ channel_close(channel_T *channel, int invoke_close_cb)
19121952 channel -> CH_SOCK_FD = INVALID_FD ;
19131953 }
19141954#if defined(CHANNEL_PIPES )
1915- if (channel -> CH_IN_FD != INVALID_FD )
1916- {
1917- fd_close (channel -> CH_IN_FD );
1918- channel -> CH_IN_FD = INVALID_FD ;
1919- }
1920- if (channel -> CH_OUT_FD != INVALID_FD )
1921- {
1922- fd_close (channel -> CH_OUT_FD );
1923- channel -> CH_OUT_FD = INVALID_FD ;
1924- }
1925- if (channel -> CH_ERR_FD != INVALID_FD )
1926- {
1927- fd_close (channel -> CH_ERR_FD );
1928- channel -> CH_ERR_FD = INVALID_FD ;
1929- }
1955+ may_close_part (& channel -> CH_IN_FD );
1956+ may_close_part (& channel -> CH_OUT_FD );
1957+ may_close_part (& channel -> CH_ERR_FD );
19301958#endif
19311959
19321960 if (invoke_close_cb && channel -> ch_close_cb != NULL )
0 commit comments