From b3de22440623434b095d3f2b76a8f0739d46b1b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= Date: Fri, 8 Apr 2022 20:37:59 +0200 Subject: [PATCH] clutter/stage: Allow claiming sequence outside of event handling context Another baby step just like the last commit: This commit takes care of the opposite case: An action handling a sequence event stops further emission of events to actors. Since sequences remain around for longer than the context of just a single event, it makes sense to provide a way to "claim" those sequences even when outside of event handling context, so introduce API for that. Part-of: --- clutter/clutter/clutter-stage-private.h | 4 +++ clutter/clutter/clutter-stage.c | 33 +++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/clutter/clutter/clutter-stage-private.h b/clutter/clutter/clutter-stage-private.h index c49caf8fb..df0e7872e 100644 --- a/clutter/clutter/clutter-stage-private.h +++ b/clutter/clutter/clutter-stage-private.h @@ -178,6 +178,10 @@ void clutter_stage_maybe_lost_implicit_grab (ClutterStage *self, void clutter_stage_implicit_grab_actor_unmapped (ClutterStage *self, ClutterActor *actor); +void clutter_stage_notify_action_implicit_grab (ClutterStage *self, + ClutterInputDevice *device, + ClutterEventSequence *sequence); + G_END_DECLS #endif /* __CLUTTER_STAGE_PRIVATE_H__ */ diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c index e9538f82b..7b15b1c77 100644 --- a/clutter/clutter/clutter-stage.c +++ b/clutter/clutter/clutter-stage.c @@ -4263,6 +4263,21 @@ free_event_receiver (EventReceiver *receiver) g_clear_object (&receiver->action); } +static void +remove_all_actors_from_chain (PointerDeviceEntry *entry) +{ + unsigned int i; + + for (i = 0; i < entry->event_emission_chain->len; i++) + { + EventReceiver *receiver = + &g_array_index (entry->event_emission_chain, EventReceiver, i); + + if (receiver->actor) + g_clear_object (&receiver->actor); + } +} + static void remove_all_actions_from_chain (PointerDeviceEntry *entry) { @@ -4528,3 +4543,21 @@ clutter_stage_implicit_grab_actor_unmapped (ClutterStage *self, cancel_implicit_grab_on_actor (entry, actor); } } + +void +clutter_stage_notify_action_implicit_grab (ClutterStage *self, + ClutterInputDevice *device, + ClutterEventSequence *sequence) +{ + ClutterStagePrivate *priv = self->priv; + PointerDeviceEntry *entry; + + if (sequence != NULL) + entry = g_hash_table_lookup (priv->touch_sequences, sequence); + else + entry = g_hash_table_lookup (priv->pointer_devices, device); + + g_assert (entry->press_count > 0); + + remove_all_actors_from_chain (entry); +}