diff options
author | Alexander Larsson <alexl@redhat.com> | 2009-07-09 16:48:22 +0200 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2009-07-09 17:06:46 +0200 |
commit | 9044ec9bb9b1d08bd6674f17c7ea25fdbe3ac1ab (patch) | |
tree | 42c54b2874aa54f89adabfddd8622e2ba9e2fbbf /gtk/gtkmenu.c | |
parent | 8031432c09c864d6fe635a8e8890c5221399fc4f (diff) | |
download | gtk+-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.c | 50 |
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); |