diff options
author | Jan Djärv <jan.h.d@swipnet.se> | 2005-02-03 19:49:43 +0000 |
---|---|---|
committer | Jan Djärv <jan.h.d@swipnet.se> | 2005-02-03 19:49:43 +0000 |
commit | 81f098775c8dad4293a137c0f6f52ce3743a6cde (patch) | |
tree | de5f6a1c7fd201d8abe116e9c6cd3ad15bc68c62 /src/xmenu.c | |
parent | 0e95095bfb71948bc9f076578e31c434aba94e8a (diff) | |
download | emacs-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.c | 19 |
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, |