aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Djärv2006-05-29 07:11:05 +0000
committerJan Djärv2006-05-29 07:11:05 +0000
commit31c5f81f89f54ffe03dcbe3df26a3f9560d68cbf (patch)
treed9163f0242e829a16a3cf1dce7c404aaa9c575e5
parent345b3483786cefe059d06c07ea79b2e329f45bf7 (diff)
downloademacs-31c5f81f89f54ffe03dcbe3df26a3f9560d68cbf.tar.gz
emacs-31c5f81f89f54ffe03dcbe3df26a3f9560d68cbf.zip
Connect menu_nav_ended to "selection-done" to fix grabs
-rw-r--r--src/gtkutil.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/gtkutil.c b/src/gtkutil.c
index b8d37df2214..a5022c7cfe5 100644
--- a/src/gtkutil.c
+++ b/src/gtkutil.c
@@ -1970,6 +1970,30 @@ xg_create_one_menuitem (item, f, select_cb, highlight_cb, cl_data, group)
1970 return w; 1970 return w;
1971} 1971}
1972 1972
1973/* Callback called when keyboard traversal (started by x-menu-bar-start) ends.
1974 WMENU is the menu for which traversal has been done. DATA points to the
1975 frame for WMENU. We must release grabs, some bad interaction between GTK
1976 and Emacs makes the menus keep the grabs. */
1977
1978static void
1979menu_nav_ended (wmenu, data)
1980 GtkMenuShell *wmenu;
1981 gpointer data;
1982{
1983 FRAME_PTR f = (FRAME_PTR) data;
1984 Display *dpy = FRAME_X_DISPLAY (f);
1985
1986 BLOCK_INPUT;
1987 GtkMenuShell *w = GTK_MENU_SHELL (FRAME_X_OUTPUT (f)->menubar_widget);
1988 gtk_menu_shell_deactivate (w);
1989 gtk_menu_shell_deselect (w);
1990
1991 XUngrabKeyboard (dpy, CurrentTime);
1992 XUngrabPointer (dpy, CurrentTime);
1993 UNBLOCK_INPUT;
1994}
1995
1996
1973static GtkWidget *create_menus P_ ((widget_value *, FRAME_PTR, GCallback, 1997static GtkWidget *create_menus P_ ((widget_value *, FRAME_PTR, GCallback,
1974 GCallback, GCallback, int, int, int, 1998 GCallback, GCallback, int, int, int,
1975 GtkWidget *, xg_menu_cb_data *, char *)); 1999 GtkWidget *, xg_menu_cb_data *, char *));
@@ -2024,6 +2048,12 @@ create_menus (data, f, select_cb, deactivate_cb, highlight_cb,
2024 } 2048 }
2025 else wmenu = gtk_menu_bar_new (); 2049 else wmenu = gtk_menu_bar_new ();
2026 2050
2051 /* Fix up grabs after keyboard traversal ends. */
2052 g_signal_connect (G_OBJECT (wmenu),
2053 "selection-done",
2054 G_CALLBACK (menu_nav_ended),
2055 f);
2056
2027 /* Put cl_data on the top menu for easier access. */ 2057 /* Put cl_data on the top menu for easier access. */
2028 cl_data = make_cl_data (cl_data, f, highlight_cb); 2058 cl_data = make_cl_data (cl_data, f, highlight_cb);
2029 g_object_set_data (G_OBJECT (wmenu), XG_FRAME_DATA, (gpointer)cl_data); 2059 g_object_set_data (G_OBJECT (wmenu), XG_FRAME_DATA, (gpointer)cl_data);