emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/gtkutil.c,v


From: Jan Djärv
Subject: [Emacs-diffs] Changes to emacs/src/gtkutil.c,v
Date: Mon, 28 Jul 2008 07:15:35 +0000

CVSROOT:        /cvsroot/emacs
Module name:    emacs
Changes by:     Jan Djärv <jhd>        08/07/28 07:15:35

Index: gtkutil.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/gtkutil.c,v
retrieving revision 1.135
retrieving revision 1.136
diff -u -b -r1.135 -r1.136
--- gtkutil.c   24 Jul 2008 08:36:14 -0000      1.135
+++ gtkutil.c   28 Jul 2008 07:15:34 -0000      1.136
@@ -2139,6 +2139,34 @@
   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 @@
       }
       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);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]