aboutsummaryrefslogtreecommitdiffstats
path: root/src/gtkutil.c
diff options
context:
space:
mode:
authorKaroly Lorentey <[email protected]>2006-06-12 07:27:12 +0000
committerKaroly Lorentey <[email protected]>2006-06-12 07:27:12 +0000
commit476e9367ec1f440aa23904b7bc482ea4a3b8041c (patch)
tree4f7f5a5e9a6668f908834bb6e216c8fa3727d4b3 /src/gtkutil.c
parenta13f8f50d4cc544d3bbfa78568e82ce09e68bded (diff)
parent6b519504c3297595101628e823e72c91e562ab45 (diff)
Merged from [email protected].
Patches applied: * [email protected]/emacs--devo--0--patch-294 Update from CVS * [email protected]/emacs--devo--0--patch-295 Merge from gnus--rel--5.10 * [email protected]/emacs--devo--0--patch-296 Update from CVS: admin/FOR-RELEASE: Update refcard section. * [email protected]/emacs--devo--0--patch-297 Update from CVS * [email protected]/emacs--devo--0--patch-298 Update from CVS * [email protected]/emacs--devo--0--patch-299 Update from CVS * [email protected]/emacs--devo--0--patch-300 Update from CVS * [email protected]/emacs--devo--0--patch-301 Update from CVS * [email protected]/emacs--devo--0--patch-302 Update from CVS * [email protected]/emacs--devo--0--patch-303 Update from CVS * [email protected]/emacs--devo--0--patch-304 Update from CVS * [email protected]/gnus--rel--5.10--patch-103 Update from CVS * [email protected]/gnus--rel--5.10--patch-104 Update from CVS git-archimport-id: [email protected]/emacs--multi-tty--0--patch-570
Diffstat (limited to 'src/gtkutil.c')
-rw-r--r--src/gtkutil.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/gtkutil.c b/src/gtkutil.c
index ec886b52fa..f4a2b4d3f5 100644
--- a/src/gtkutil.c
+++ b/src/gtkutil.c
@@ -1970,6 +1970,34 @@ xg_create_one_menuitem (item, f, select_cb, highlight_cb, cl_data, group)
return w;
}
+/* Callback called when keyboard traversal (started by 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 *));
@@ -2024,6 +2052,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);