aboutsummaryrefslogtreecommitdiffstats
path: root/src/gtkutil.c
diff options
context:
space:
mode:
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 b8d37df2214..2a6ed9d1524 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)
1970 return w; 1970 return w;
1971} 1971}
1972 1972
1973/* Callback called when keyboard traversal (started by menu-bar-open) 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
1985 if (FRAME_X_OUTPUT (f)->menubar_widget)
1986 {
1987 GtkMenuShell *w = GTK_MENU_SHELL (FRAME_X_OUTPUT (f)->menubar_widget);
1988 Display *dpy = FRAME_X_DISPLAY (f);
1989
1990 BLOCK_INPUT;
1991 gtk_menu_shell_deactivate (w);
1992 gtk_menu_shell_deselect (w);
1993
1994 XUngrabKeyboard (dpy, CurrentTime);
1995 XUngrabPointer (dpy, CurrentTime);
1996 UNBLOCK_INPUT;
1997 }
1998}
1999
2000
1973static GtkWidget *create_menus P_ ((widget_value *, FRAME_PTR, GCallback, 2001static GtkWidget *create_menus P_ ((widget_value *, FRAME_PTR, GCallback,
1974 GCallback, GCallback, int, int, int, 2002 GCallback, GCallback, int, int, int,
1975 GtkWidget *, xg_menu_cb_data *, char *)); 2003 GtkWidget *, xg_menu_cb_data *, char *));
@@ -2024,6 +2052,12 @@ create_menus (data, f, select_cb, deactivate_cb, highlight_cb,
2024 } 2052 }
2025 else wmenu = gtk_menu_bar_new (); 2053 else wmenu = gtk_menu_bar_new ();
2026 2054
2055 /* Fix up grabs after keyboard traversal ends. */
2056 g_signal_connect (G_OBJECT (wmenu),
2057 "selection-done",
2058 G_CALLBACK (menu_nav_ended),
2059 f);
2060
2027 /* Put cl_data on the top menu for easier access. */ 2061 /* Put cl_data on the top menu for easier access. */
2028 cl_data = make_cl_data (cl_data, f, highlight_cb); 2062 cl_data = make_cl_data (cl_data, f, highlight_cb);
2029 g_object_set_data (G_OBJECT (wmenu), XG_FRAME_DATA, (gpointer)cl_data); 2063 g_object_set_data (G_OBJECT (wmenu), XG_FRAME_DATA, (gpointer)cl_data);