diff src/gtkutil.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 07507204ac6f
children 507549811e3e 051595eb9b58
line wrap: on
line diff
--- a/src/gtkutil.c	Wed Jul 14 10:40:52 2010 +0300
+++ b/src/gtkutil.c	Wed Jul 14 12:05:53 2010 +0200
@@ -2990,6 +2990,38 @@
     }
 }
 
+int
+xg_event_is_for_menubar (FRAME_PTR f, XEvent *event)
+{
+  struct x_output *x = f->output_data.x;
+
+  if (! x->menubar_widget) return 0;
+
+  if (! (event->xbutton.x >= 0
+         && event->xbutton.x < FRAME_PIXEL_WIDTH (f)
+         && event->xbutton.y >= 0
+         && event->xbutton.y < f->output_data.x->menubar_height
+         && event->xbutton.same_screen))
+    return 0;
+
+  GList *list = gtk_container_get_children (GTK_CONTAINER (x->menubar_widget));
+  if (! list) return 0;
+  GList *iter;
+  GdkRectangle rec;
+  rec.x = event->xbutton.x;
+  rec.y = event->xbutton.y;
+  rec.width = 1;
+  rec.height = 1;
+  for (iter = list ; iter; iter = g_list_next (iter))
+    {
+      GtkWidget *w = GTK_WIDGET (iter->data);
+      if (GTK_WIDGET_MAPPED (w) && gtk_widget_intersect (w, &rec, NULL))
+        break;
+    }
+  g_list_free (list);
+  return iter == 0 ? 0 : 1;
+}
+
 
 
 /***********************************************************************