summaryrefslogtreecommitdiff
path: root/gtk/gtkmenu.c
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2009-07-09 16:48:22 +0200
committerAlexander Larsson <alexl@redhat.com>2009-07-09 17:06:46 +0200
commit9044ec9bb9b1d08bd6674f17c7ea25fdbe3ac1ab (patch)
tree42c54b2874aa54f89adabfddd8622e2ba9e2fbbf /gtk/gtkmenu.c
parent8031432c09c864d6fe635a8e8890c5221399fc4f (diff)
downloadgtk+-9044ec9bb9b1d08bd6674f17c7ea25fdbe3ac1ab.tar.gz
Correctly set enter/leave events as detail=nonlinear
If we get a nonlinear enter/leave notify on the toplevel we need to set nonlinear in all the events we send, even if the in-toplevel tree is linear. This fixes combobox menus popping down immediately when you click (not hold). (bug #587559)
Diffstat (limited to 'gtk/gtkmenu.c')
-rw-r--r--gtk/gtkmenu.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c
index 0fd5d3d4ad..98aeb212c9 100644
--- a/gtk/gtkmenu.c
+++ b/gtk/gtkmenu.c
@@ -3792,6 +3792,47 @@ gtk_menu_handle_scrolling (GtkMenu *menu,
}
}
+static char *mode[] = {
+ "GDK_CROSSING_NORMAL",
+ "GDK_CROSSING_GRAB",
+ "GDK_CROSSING_UNGRAB",
+ "GDK_CROSSING_GTK_GRAB",
+ "GDK_CROSSING_GTK_UNGRAB",
+ "GDK_CROSSING_STATE_CHANGED",
+ NULL
+};
+
+static char *detail[] = {
+ "GDK_NOTIFY_ANCESTOR",
+ "GDK_NOTIFY_VIRTUAL",
+ "GDK_NOTIFY_INFERIOR",
+ "GDK_NOTIFY_NONLINEAR",
+ "GDK_NOTIFY_NONLINEAR_VIRTUAL",
+ "GDK_NOTIFY_UNKNOWN",
+ NULL
+};
+
+char *
+get_window_name (GtkWidget *widget, GdkWindow *window)
+{
+ GtkMenu *menu;
+ gpointer w;
+ menu = GTK_MENU (widget);
+
+ if (window == widget->window)
+ return "widget->window";
+
+ if (window == menu->view_window)
+ return "menu->view_window";
+
+ if (window == menu->bin_window)
+ return "menu->bin_window";
+
+ gdk_window_get_user_data (window, &w);
+
+ return g_type_name_from_instance (w);
+}
+
static gboolean
gtk_menu_enter_notify (GtkWidget *widget,
GdkEventCrossing *event)
@@ -3804,6 +3845,10 @@ gtk_menu_enter_notify (GtkWidget *widget,
event->mode == GDK_CROSSING_STATE_CHANGED)
return TRUE;
+ g_print ("menu ENTER notify for %s mode: %s, detail %s\n",
+ get_window_name (widget, event->window),
+ mode[event->mode], detail[event->detail]);
+
g_object_get (gtk_widget_get_settings (widget),
"gtk-touchscreen-mode", &touchscreen_mode,
NULL);
@@ -3846,6 +3891,7 @@ gtk_menu_enter_notify (GtkWidget *widget,
* far enough away from the enter point. (see
* gtk_menu_motion_notify())
*/
+ g_print ("user-enter, not pop-under\n");
menu_shell->activate_time = 0;
}
}
@@ -3880,6 +3926,10 @@ gtk_menu_leave_notify (GtkWidget *widget,
event->mode == GDK_CROSSING_STATE_CHANGED)
return TRUE;
+ g_print ("menu LEAVE notify for %s mode: %s, detail %s\n",
+ get_window_name (widget, event->window),
+ mode[event->mode], detail[event->detail]);
+
menu = GTK_MENU (widget);
menu_shell = GTK_MENU_SHELL (widget);