clutter: Propagate events only inside the grab

The grab actor becomes the "root" of the events being handled, events
inside propagate normally, but become silenced when falling outside
the grab area.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2068>
This commit is contained in:
Carlos Garnacho 2021-10-27 00:13:35 +02:00 committed by Marge Bot
parent ba895ca8e2
commit ec3b8fe85b
3 changed files with 18 additions and 1 deletions

View File

@ -683,7 +683,9 @@ emit_event_chain (ClutterEvent *event)
return; return;
} }
_clutter_actor_handle_event (event->any.source, NULL, event); _clutter_actor_handle_event (event->any.source,
clutter_stage_get_grab_actor (event->any.stage),
event);
} }
/* /*

View File

@ -3846,3 +3846,15 @@ clutter_grab_dismiss (ClutterGrab *grab)
g_free (grab); g_free (grab);
} }
ClutterActor *
clutter_stage_get_grab_actor (ClutterStage *stage)
{
ClutterStagePrivate *priv = stage->priv;
if (!priv->topmost_grab)
return NULL;
/* Return active grab */
return priv->topmost_grab->actor;
}

View File

@ -274,6 +274,9 @@ CLUTTER_EXPORT
ClutterGrab * clutter_stage_grab (ClutterStage *stage, ClutterGrab * clutter_stage_grab (ClutterStage *stage,
ClutterActor *actor); ClutterActor *actor);
CLUTTER_EXPORT
ClutterActor * clutter_stage_get_grab_actor (ClutterStage *stage);
G_END_DECLS G_END_DECLS
#endif /* __CLUTTER_STAGE_H__ */ #endif /* __CLUTTER_STAGE_H__ */