]> code.delx.au - gnu-emacs/commitdiff
* xmenu.c (menubar_selection_callback): Force out GTK buffered
authorJan Djärv <jan.h.d@swipnet.se>
Thu, 3 Feb 2005 19:49:43 +0000 (19:49 +0000)
committerJan Djärv <jan.h.d@swipnet.se>
Thu, 3 Feb 2005 19:49:43 +0000 (19:49 +0000)
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.

src/xmenu.c

index 57f184e121f374e6928aba0d421cd58dd9001dac..af26e2911875885b623f84ff722820fb1118bb4b 100644 (file)
@@ -1445,9 +1445,9 @@ menu_highlight_callback (widget, id, call_data)
 /* 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 @@ find_and_call_menu_selection (f, menu_bar_items_used, vector, client_data)
   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 @@ menubar_selection_callback (widget, client_data)
   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,