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 the entry in a confused state.
This commit is contained in:

committed by
Matthias Clasen

parent
d95b5308ea
commit
367cc4fc0f
@ -147,6 +147,8 @@ struct _GtkEntryPrivate
|
||||
GtkShadowType shadow_type;
|
||||
GtkWidget *popup_menu;
|
||||
|
||||
GdkDevice *device;
|
||||
|
||||
GdkDevice *completion_device;
|
||||
GdkWindow *text_area;
|
||||
|
||||
@ -547,6 +549,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);
|
||||
@ -691,6 +695,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;
|
||||
@ -3830,7 +3835,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;
|
||||
@ -3844,6 +3850,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;
|
||||
}
|
||||
@ -4021,9 +4028,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;
|
||||
@ -4132,7 +4140,8 @@ gtk_entry_motion_notify (GtkWidget *widget,
|
||||
|
||||
priv->in_drag = FALSE;
|
||||
priv->button = 0;
|
||||
|
||||
priv->device = NULL;
|
||||
|
||||
gtk_target_list_unref (target_list);
|
||||
}
|
||||
}
|
||||
@ -8572,6 +8581,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,
|
||||
|
Reference in New Issue
Block a user