From: Jan Djärv Date: Thu, 3 Feb 2005 19:49:43 +0000 (+0000) Subject: * xmenu.c (menubar_selection_callback): Force out GTK buffered X-Git-Tag: ttn-vms-21-2-B4~2425 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=81f098775c8dad4293a137c0f6f52ce3743a6cde;p=emacs.git * 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. --- 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,