From 42ffd097cf4bba5c5df93bf95f30cf2ea859a695 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20Dj=C3=A4rv?= Date: Mon, 28 Jul 2008 07:15:44 +0000 Subject: [PATCH] (menu_nav_ended): Revert change from 2008-07-24. (create_menus): Connect selection-done to menu_nav_ended. --- src/ChangeLog | 5 +++++ src/gtkutil.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/ChangeLog b/src/ChangeLog index f60633e5183..3bf0a6a9b13 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2008-07-28 Jan Djärv + + * gtkutil.c (menu_nav_ended): Revert change from 2008-07-24. + (create_menus): Connect selection-done to menu_nav_ended. + 2008-07-27 Adrian Robert * nsfns.m (x-create-frame): Add copy of parms argument to beginning. diff --git a/src/gtkutil.c b/src/gtkutil.c index 7e2a05eed89..2d47068293b 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -2139,6 +2139,34 @@ xg_create_one_menuitem (item, f, select_cb, highlight_cb, cl_data, group) return w; } +/* Callback called when keyboard traversal (started by x-menu-bar-open) ends. + WMENU is the menu for which traversal has been done. DATA points to the + frame for WMENU. We must release grabs, some bad interaction between GTK + and Emacs makes the menus keep the grabs. */ + +static void +menu_nav_ended (wmenu, data) + GtkMenuShell *wmenu; + gpointer data; +{ + FRAME_PTR f = (FRAME_PTR) data; + + if (FRAME_X_OUTPUT (f)->menubar_widget) + { + GtkMenuShell *w = GTK_MENU_SHELL (FRAME_X_OUTPUT (f)->menubar_widget); + Display *dpy = FRAME_X_DISPLAY (f); + + BLOCK_INPUT; + gtk_menu_shell_deactivate (w); + gtk_menu_shell_deselect (w); + + XUngrabKeyboard (dpy, CurrentTime); + XUngrabPointer (dpy, CurrentTime); + UNBLOCK_INPUT; + } +} + + static GtkWidget *create_menus P_ ((widget_value *, FRAME_PTR, GCallback, GCallback, GCallback, int, int, int, GtkWidget *, xg_menu_cb_data *, char *)); @@ -2204,6 +2232,12 @@ create_menus (data, f, select_cb, deactivate_cb, highlight_cb, } else wmenu = gtk_menu_bar_new (); + /* Fix up grabs after keyboard traversal ends. */ + g_signal_connect (G_OBJECT (wmenu), + "selection-done", + G_CALLBACK (menu_nav_ended), + f); + /* Put cl_data on the top menu for easier access. */ cl_data = make_cl_data (cl_data, f, highlight_cb); g_object_set_data (G_OBJECT (wmenu), XG_FRAME_DATA, (gpointer)cl_data); -- 2.39.2