diff src/xmenu.c @ 59912:ef2f9fc4fd42

* xmenu.c (menubar_selection_callback): Force out GTK buffered events so the menu event comes after them. This is to prevent sit-for from exiting on buffered events directly after a menu selection, lisp code for Help => About Emacs uses sit-for.
author Jan Djärv <jan.h.d@swipnet.se>
date Thu, 03 Feb 2005 19:49:43 +0000
parents 72adb36e240f
children fdb9ecc63088
line wrap: on
line diff
--- a/src/xmenu.c	Thu Feb 03 19:48:59 2005 +0000
+++ b/src/xmenu.c	Thu Feb 03 19:49:43 2005 +0000
@@ -1445,9 +1445,9 @@
 /* Find the menu selection and store it in the keyboard buffer.
    F is the frame the menu is on.
    MENU_BAR_ITEMS_USED is the length of VECTOR.
-   VECTOR is an array of menu events for the whole menu.
- */
-void
+   VECTOR is an array of menu events for the whole menu.  */
+
+static void
 find_and_call_menu_selection (f, menu_bar_items_used, vector, client_data)
      FRAME_PTR f;
      int menu_bar_items_used;
@@ -1464,6 +1464,8 @@
   prefix = Qnil;
   i = 0;
 
+  while (gtk_events_pending ())
+    gtk_main_iteration ();
   while (i < menu_bar_items_used)
     {
       if (EQ (XVECTOR (vector)->contents[i], Qnil))
@@ -1554,6 +1556,17 @@
   if (! cb_data || ! cb_data->cl_data || ! cb_data->cl_data->f)
     return;
 
+  /* When a menu is popped down, X generates a focus event (i.e. focus
+     goes back to the frame below the menu).  Since GTK buffers events,
+     we force it out here before the menu selection event.  Otherwise
+     sit-for will exit at once if the focus event follows the menu selection
+     event.  */
+
+  BLOCK_INPUT;
+  while (gtk_events_pending ())
+    gtk_main_iteration ();
+  UNBLOCK_INPUT;
+
   find_and_call_menu_selection (cb_data->cl_data->f,
                                 cb_data->cl_data->menu_bar_items_used,
                                 cb_data->cl_data->menu_bar_vector,