From dcd2dba38414ec0a7bef64baf2f7dd0e133f1a88 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Tue, 1 Nov 2011 02:54:03 +0100 Subject: [PATCH] entry: Handle ::grab-notify Store the device, and unset private fields whenever the device is shadowed by another GTK+ grab, so popping up menus while selecting (i.e. press-and-hold) doesn't leave it in a confused state. --- gtk/gtkentry.c | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index 3d76e8c728..70edb99e15 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -147,6 +147,8 @@ struct _GtkEntryPrivate GtkShadowType shadow_type; GtkWidget *popup_menu; + GdkDevice *device; + GdkDevice *completion_device; GdkWindow *text_area; @@ -548,6 +550,8 @@ static void gtk_entry_do_popup (GtkEntry *entry, GdkEventButton *event); static gboolean gtk_entry_mnemonic_activate (GtkWidget *widget, gboolean group_cycling); +static void gtk_entry_grab_notify (GtkWidget *widget, + gboolean was_grabbed); static void gtk_entry_check_cursor_blink (GtkEntry *entry); static void gtk_entry_pend_cursor_blink (GtkEntry *entry); static void gtk_entry_reset_blink_time (GtkEntry *entry); @@ -692,6 +696,7 @@ gtk_entry_class_init (GtkEntryClass *class) widget_class->state_flags_changed = gtk_entry_state_flags_changed; widget_class->screen_changed = gtk_entry_screen_changed; widget_class->mnemonic_activate = gtk_entry_mnemonic_activate; + widget_class->grab_notify = gtk_entry_grab_notify; widget_class->drag_drop = gtk_entry_drag_drop; widget_class->drag_motion = gtk_entry_drag_motion; @@ -3771,7 +3776,8 @@ gtk_entry_button_press (GtkWidget *widget, gtk_entry_reset_blink_time (entry); priv->button = event->button; - + priv->device = gdk_event_get_device ((GdkEvent *) event); + if (!gtk_widget_has_focus (widget)) { priv->in_click = TRUE; @@ -3785,6 +3791,7 @@ gtk_entry_button_press (GtkWidget *widget, { gtk_entry_do_popup (entry, event); priv->button = 0; /* Don't wait for release, since the menu will gtk_grab_add */ + priv->device = NULL; return TRUE; } @@ -3962,9 +3969,10 @@ gtk_entry_button_release (GtkWidget *widget, priv->in_drag = 0; } - + priv->button = 0; - + priv->device = NULL; + gtk_entry_update_primary_selection (entry); return TRUE; @@ -4073,7 +4081,8 @@ gtk_entry_motion_notify (GtkWidget *widget, priv->in_drag = FALSE; priv->button = 0; - + priv->device = NULL; + gtk_target_list_unref (target_list); } } @@ -8542,6 +8551,26 @@ gtk_entry_mnemonic_activate (GtkWidget *widget, return TRUE; } +static void +gtk_entry_grab_notify (GtkWidget *widget, + gboolean was_grabbed) +{ + GtkEntryPrivate *priv; + + priv = GTK_ENTRY (widget)->priv; + + if (priv->device && + gtk_widget_device_is_shadowed (widget, priv->device)) + { + /* Unset button so we don't expect + * a button release anymore + */ + priv->button = 0; + priv->device = NULL; + priv->in_drag = FALSE; + } +} + static void append_action_signal (GtkEntry *entry, GtkWidget *menu,