emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 81b174cace: Prevent events from being lost waiting for selections


From: Po Lu
Subject: master 81b174cace: Prevent events from being lost waiting for selections on GTK
Date: Mon, 30 May 2022 20:47:43 -0400 (EDT)

branch: master
commit 81b174cace56af924de93b4c32bf18273253b71f
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Prevent events from being lost waiting for selections on GTK
    
    * src/xterm.c (x_wait_for_cell_change): Use GTK to iterate the
    main loop so events reach the toolkit.
---
 src/xterm.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/src/xterm.c b/src/xterm.c
index 777a6c4daf..f6bb97b2f8 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -14858,6 +14858,7 @@ x_wait_for_cell_change (Lisp_Object cell, struct 
timespec timeout)
       for (dpyinfo = x_display_list; dpyinfo;
           dpyinfo = dpyinfo->next)
        {
+#ifndef USE_GTK
          if (XPending (dpyinfo->display))
            {
              EVENT_INIT (hold_quit);
@@ -14873,6 +14874,7 @@ x_wait_for_cell_change (Lisp_Object cell, struct 
timespec timeout)
              if (!NILP (XCAR (cell)))
                return;
            }
+#endif
 
          fd = XConnectionNumber (dpyinfo->display);
 
@@ -14883,6 +14885,33 @@ x_wait_for_cell_change (Lisp_Object cell, struct 
timespec timeout)
          FD_SET (XConnectionNumber (dpyinfo->display), &fds);
        }
 
+      /* Prevent events from being lost (from GTK's point of view) by
+        using GDK to run the event loop.  */
+#ifdef USE_GTK
+      while (gtk_events_pending ())
+       {
+         EVENT_INIT (hold_quit);
+         current_count = 0;
+         current_hold_quit = &hold_quit;
+         current_finish = X_EVENT_NORMAL;
+
+         gtk_main_iteration ();
+
+         current_count = -1;
+         current_hold_quit = NULL;
+
+         /* Make us quit now.  */
+         if (hold_quit.kind != NO_EVENT)
+           kbd_buffer_store_event (&hold_quit);
+
+         if (!NILP (XCAR (cell)))
+           return;
+
+         if (current_finish == X_EVENT_GOTO_OUT)
+           break;
+       }
+#endif
+
       eassert (maxfd >= 0);
 
       current = current_timespec ();



reply via email to

[Prev in Thread] Current Thread [Next in Thread]