patch 9.2.0548: GTK4: terminal and pty job output is not processed

Commit: 
https://github.com/vim/vim/commit/af8845e3afa8746290bcc91eeac7a8629dd96d7e
Author: Foxe Chen <[email protected]>
Date:   Thu May 28 19:29:55 2026 +0000

    patch 9.2.0548: GTK4: terminal and pty job output is not processed
    
    Problem:  GTK4: terminal and pty job output is not processed
    Solution: When there is at least one channel with the keep_open flag,
              arm a 20ms timer that calls channel_handle_events() and
              parse_queued_messages(), matching the behaviour of the GTK2/3
              backend (Foxe Chen).
    
    fixes:  #20345
    closes: #20350
    
    Signed-off-by: Foxe Chen <[email protected]>
    Signed-off-by: Christian Brabandt <[email protected]>

diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c
index 2b09ce1ce..e87733728 100644
--- a/src/gui_gtk4.c
+++ b/src/gui_gtk4.c
@@ -2132,6 +2132,18 @@ gui_mch_update(void)
        g_main_context_iteration(NULL, TRUE);
 }
 
+#ifdef FEAT_JOB_CHANNEL
+    static timeout_cb_type
+channel_poll_cb(gpointer data UNUSED)
+{
+    // Using an event handler for a channel that may be disconnected does
+    // not work, it hangs.  Instead poll for messages.
+    channel_handle_events(TRUE);
+    parse_queued_messages();
+    return TRUE; // Keep repeating
+}
+#endif
+
     int
 gui_mch_wait_for_chars(long wtime)
 {
@@ -2139,6 +2151,9 @@ gui_mch_wait_for_chars(long wtime)
     guint      timer;
     static int timed_out;
     int                retval = FAIL;
+#ifdef FEAT_JOB_CHANNEL
+    guint      channel_timer = 0;
+#endif
 
     timed_out = FALSE;
 
@@ -2148,6 +2163,13 @@ gui_mch_wait_for_chars(long wtime)
     else
        timer = 0;
 
+#ifdef FEAT_JOB_CHANNEL
+    // If there is a channel with the keep_open flag we need to poll for input
+    // on them.
+    if (channel_any_keep_open())
+       channel_timer = timeout_add(20, channel_poll_cb, NULL);
+#endif
+
     focus = gui.in_focus;
 
     do
@@ -2203,6 +2225,10 @@ gui_mch_wait_for_chars(long wtime)
 theend:
     if (timer != 0 && !timed_out)
        timeout_remove(timer);
+#ifdef FEAT_JOB_CHANNEL
+    if (channel_timer != 0)
+       timeout_remove(channel_timer);
+#endif
 
     return retval;
 }
diff --git a/src/version.c b/src/version.c
index 5fda77f1b..7b71661ea 100644
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    548,
 /**/
     547,
 /**/

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/E1wSgfp-00BPVr-Sy%40256bit.org.

Raspunde prin e-mail lui