From 81f098775c8dad4293a137c0f6f52ce3743a6cde Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20Dj=C3=A4rv?= Date: Thu, 3 Feb 2005 19:49:43 +0000 Subject: [PATCH] * 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. --- src/xmenu.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/xmenu.c b/src/xmenu.c index 57f184e121..af26e29118 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, -- 2.20.1