diff --git a/clutter/clutter/clutter-action-private.h b/clutter/clutter/clutter-action-private.h index 510c21cd8..97a1e6395 100644 --- a/clutter/clutter/clutter-action-private.h +++ b/clutter/clutter/clutter-action-private.h @@ -39,6 +39,10 @@ void clutter_action_set_phase (ClutterAction *action, gboolean clutter_action_handle_event (ClutterAction *action, const ClutterEvent *event); +void clutter_action_sequence_cancelled (ClutterAction *action, + ClutterInputDevice *device, + ClutterEventSequence *sequence); + G_END_DECLS #endif /* CLUTTER_ACTION_PRIVATE_H */ diff --git a/clutter/clutter/clutter-action.c b/clutter/clutter/clutter-action.c index 6ec54d374..5fcfde5ac 100644 --- a/clutter/clutter/clutter-action.c +++ b/clutter/clutter/clutter-action.c @@ -101,3 +101,14 @@ clutter_action_handle_event (ClutterAction *action, { return CLUTTER_ACTION_GET_CLASS (action)->handle_event (action, event); } + +void +clutter_action_sequence_cancelled (ClutterAction *action, + ClutterInputDevice *device, + ClutterEventSequence *sequence) +{ + ClutterActionClass *action_class = CLUTTER_ACTION_GET_CLASS (action); + + if (action_class->sequence_cancelled) + action_class->sequence_cancelled (action, device, sequence); +} diff --git a/clutter/clutter/clutter-action.h b/clutter/clutter/clutter-action.h index 3c017683a..542cd31d9 100644 --- a/clutter/clutter/clutter-action.h +++ b/clutter/clutter/clutter-action.h @@ -52,6 +52,10 @@ struct _ClutterActionClass gboolean (* handle_event) (ClutterAction *action, const ClutterEvent *event); + void (* sequence_cancelled) (ClutterAction *action, + ClutterInputDevice *device, + ClutterEventSequence *sequence); + void (* _clutter_action1) (void); void (* _clutter_action2) (void); void (* _clutter_action3) (void); diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c index 7b15b1c77..997f90c48 100644 --- a/clutter/clutter/clutter-stage.c +++ b/clutter/clutter/clutter-stage.c @@ -4289,7 +4289,12 @@ remove_all_actions_from_chain (PointerDeviceEntry *entry) &g_array_index (entry->event_emission_chain, EventReceiver, i); if (receiver->action) - g_clear_object (&receiver->action); + { + clutter_action_sequence_cancelled (receiver->action, + entry->device, + entry->sequence); + g_clear_object (&receiver->action); + } } } @@ -4339,6 +4344,7 @@ clutter_stage_maybe_lost_implicit_grab (ClutterStage *self, { ClutterStagePrivate *priv = self->priv; PointerDeviceEntry *entry = NULL; + unsigned int i; if (sequence != NULL) entry = g_hash_table_lookup (priv->touch_sequences, sequence); @@ -4350,6 +4356,15 @@ clutter_stage_maybe_lost_implicit_grab (ClutterStage *self, if (!entry->press_count) return; + for (i = 0; i < entry->event_emission_chain->len; i++) + { + EventReceiver *receiver = + &g_array_index (entry->event_emission_chain, EventReceiver, i); + + if (receiver->action) + clutter_action_sequence_cancelled (receiver->action, device, sequence); + } + sync_crossings_on_implicit_grab_end (self, entry); clutter_actor_set_implicitly_grabbed (entry->implicit_grab_actor, FALSE); @@ -4505,7 +4520,12 @@ cancel_implicit_grab_on_actor (PointerDeviceEntry *entry, clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (receiver->action)); if (!action_actor || action_actor == actor) - g_clear_object (&receiver->action); + { + clutter_action_sequence_cancelled (receiver->action, + entry->device, + entry->sequence); + g_clear_object (&receiver->action); + } } }