summaryrefslogtreecommitdiff
path: root/src/xmenu.c
diff options
context:
space:
mode:
authorJan Djärv <jan.h.d@swipnet.se>2005-02-03 19:49:43 +0000
committerJan Djärv <jan.h.d@swipnet.se>2005-02-03 19:49:43 +0000
commit81f098775c8dad4293a137c0f6f52ce3743a6cde (patch)
treede5f6a1c7fd201d8abe116e9c6cd3ad15bc68c62 /src/xmenu.c
parent0e95095bfb71948bc9f076578e31c434aba94e8a (diff)
downloademacs-81f098775c8dad4293a137c0f6f52ce3743a6cde.tar.gz
* 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.
Diffstat (limited to 'src/xmenu.c')
-rw-r--r--src/xmenu.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/xmenu.c b/src/xmenu.c
index 57f184e121f..af26e291187 100644
--- a/src/xmenu.c
+++ b/src/xmenu.c
@@ -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,