From 52182e6493d047dca4a95b4ecda5856a7c86d4f1 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Wed, 30 Aug 2023 10:14:16 +0200 Subject: [PATCH] st: Drop explicit Clutter grab in StButton Nowadays, Clutter knows what an implicit grab is, which gives us already the feel that we are after with buttons (e.g. press and drag on the button will not enter other actors meanwhile). ClutterGrab was only added to provide that feel meanwhile, and it's also slightly more intense (e.g. altering keyboard focus, or triggering leave events on all parents of the button) which may trigger side effects. An example is the IBus candidates popup, where the pagination buttons may indirectly trigger dismissing of the entire popup when interacted, by stealing the keyboard focus to the client/actor doing IM. Related: https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2497 Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2244 Part-of: --- src/st/st-button.c | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/src/st/st-button.c b/src/st/st-button.c index 687a54d23..a958c1491 100644 --- a/src/st/st-button.c +++ b/src/st/st-button.c @@ -78,7 +78,6 @@ struct _StButtonPrivate ClutterInputDevice *device; ClutterEventSequence *press_sequence; - ClutterGrab *grab; guint button_mask : 3; guint is_toggle : 1; @@ -195,13 +194,6 @@ st_button_button_press (ClutterActor *actor, if (priv->button_mask & mask) { - ClutterActor *stage; - - stage = clutter_actor_get_stage (actor); - - if (priv->grabbed == 0) - priv->grab = clutter_stage_grab (CLUTTER_STAGE (stage), actor); - priv->grabbed |= mask; st_button_press (button, device, mask, NULL); @@ -234,11 +226,6 @@ st_button_button_release (ClutterActor *actor, st_button_release (button, device, mask, is_click ? button_nr : 0, NULL); priv->grabbed &= ~mask; - if (priv->grab && priv->grabbed == 0) - { - clutter_grab_dismiss (priv->grab); - g_clear_pointer (&priv->grab, clutter_grab_unref); - } return TRUE; } @@ -266,7 +253,8 @@ st_button_touch_event (ClutterActor *actor, sequence = clutter_event_get_event_sequence (event); event_type = clutter_event_type (event); - if (event_type == CLUTTER_TOUCH_BEGIN && !priv->grab && !priv->press_sequence) + if (event_type == CLUTTER_TOUCH_BEGIN && + priv->grabbed == 0 && !priv->press_sequence) { st_button_press (button, device, 0, sequence); return CLUTTER_EVENT_STOP; @@ -923,12 +911,6 @@ st_button_fake_release (StButton *button) priv = st_button_get_instance_private (button); - if (priv->grab) - { - clutter_grab_dismiss (priv->grab); - g_clear_pointer (&priv->grab, clutter_grab_unref); - } - priv->grabbed = 0; if (priv->pressed || priv->press_sequence)