diff src/xfns.c @ 109327:60266cf487b0

Fix menus as per bug 6499 and 6608. * gtkutil.c (xg_event_is_for_menubar): New function (Bug#6499). * gtkutil.h (xg_event_is_for_menubar): Declare. * xfns.c (x_menubar_window_to_frame): Take XEvent as second parameter instead of Window. Call xg_event_is_for_menubar when USE_GTK (Bug#6499). * xmenu.c (x_activate_menubar): Revert previous fix for Bug#6499, i.e. don't put back ButtonRelease (Bug#6608). * xterm.c (handle_one_xevent): Pass event to x_menubar_window_to_frame. * xterm.h (x_menubar_window_to_frame): Second parameter is XEvent*.
author Jan D <jan.h.d@swipnet.se>
date Wed, 14 Jul 2010 12:05:53 +0200
parents 1b5ca039f5f2
children 051595eb9b58 2cf388f16cae
line wrap: on
line diff
--- a/src/xfns.c	Wed Jul 14 10:40:52 2010 +0300
+++ b/src/xfns.c	Wed Jul 14 12:05:53 2010 +0200
@@ -404,10 +404,11 @@
 /* Likewise, but consider only the menu bar widget.  */
 
 struct frame *
-x_menubar_window_to_frame (dpyinfo, wdesc)
+x_menubar_window_to_frame (dpyinfo, event)
      struct x_display_info *dpyinfo;
-     int wdesc;
+     XEvent *event;
 {
+  Window wdesc = event->xany.window;
   Lisp_Object tail, frame;
   struct frame *f;
   struct x_output *x;
@@ -423,21 +424,11 @@
       if (!FRAME_X_P (f) || FRAME_X_DISPLAY_INFO (f) != dpyinfo)
 	continue;
       x = f->output_data.x;
+#ifdef USE_GTK
+      if (x->menubar_widget && xg_event_is_for_menubar (f, event))
+        return f;
+#else
       /* Match if the window is this frame's menubar.  */
-#ifdef USE_GTK
-      if (x->menubar_widget)
-        {
-          GtkWidget *gwdesc = xg_win_to_widget (dpyinfo->display, wdesc);
-
-	  /* This gives false positives, but the rectangle check in xterm.c
-	     where this is called takes care of that.  */
-          if (gwdesc != 0
-              && (gwdesc == x->menubar_widget
-                  || gtk_widget_is_ancestor (x->menubar_widget, gwdesc)
-		  || gtk_widget_is_ancestor (gwdesc, x->menubar_widget)))
-            return f;
-        }
-#else
       if (x->menubar_widget
 	  && lw_window_is_in_menubar (wdesc, x->menubar_widget))
 	return f;