clutter: Add clutter_stage_get_event_actor() API call

This is a small helper to retrieve the actor that is currently
beneath the device/sequence, meant to replace clutter_event_get_source().

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2311>
This commit is contained in:
Carlos Garnacho 2022-03-01 23:13:02 +01:00 committed by Marge Bot
parent b644ea1bce
commit 62bd0359a9
3 changed files with 70 additions and 1 deletions

View File

@ -3921,3 +3921,70 @@ clutter_stage_get_grab_actor (ClutterStage *stage)
/* Return active grab */
return priv->topmost_grab->actor;
}
/**
* clutter_stage_get_event_actor:
* @stage: a #ClutterStage
* @event: an event received on the stage
*
* Retrieves the current focus actor for an event. This is
* the key focus for key events and other events directed
* to the key focus, or the actor directly under the
* coordinates of a device or touch sequence.
*
* The actor is looked up at the time of calling this function,
* and may differ from the actor that the stage originally
* delivered the event to.
*
* Return value: (transfer none): a pointer to the #ClutterActor or %NULL
**/
ClutterActor *
clutter_stage_get_event_actor (ClutterStage *stage,
const ClutterEvent *event)
{
ClutterInputDevice *device;
ClutterEventSequence *sequence;
g_return_val_if_fail (CLUTTER_IS_STAGE (stage), NULL);
g_return_val_if_fail (event != NULL, NULL);
switch (event->type)
{
case CLUTTER_KEY_PRESS:
case CLUTTER_KEY_RELEASE:
case CLUTTER_PAD_BUTTON_PRESS:
case CLUTTER_PAD_BUTTON_RELEASE:
case CLUTTER_PAD_RING:
case CLUTTER_PAD_STRIP:
case CLUTTER_IM_COMMIT:
case CLUTTER_IM_DELETE:
case CLUTTER_IM_PREEDIT:
return clutter_stage_get_key_focus (stage);
case CLUTTER_MOTION:
case CLUTTER_ENTER:
case CLUTTER_LEAVE:
case CLUTTER_BUTTON_PRESS:
case CLUTTER_BUTTON_RELEASE:
case CLUTTER_SCROLL:
case CLUTTER_TOUCH_BEGIN:
case CLUTTER_TOUCH_UPDATE:
case CLUTTER_TOUCH_END:
case CLUTTER_TOUCH_CANCEL:
case CLUTTER_TOUCHPAD_PINCH:
case CLUTTER_TOUCHPAD_SWIPE:
case CLUTTER_TOUCHPAD_HOLD:
case CLUTTER_PROXIMITY_IN:
case CLUTTER_PROXIMITY_OUT:
device = clutter_event_get_device (event);
sequence = clutter_event_get_event_sequence (event);
return clutter_stage_get_device_actor (stage, device, sequence);
case CLUTTER_DEVICE_ADDED:
case CLUTTER_DEVICE_REMOVED:
case CLUTTER_NOTHING:
case CLUTTER_EVENT_LAST:
g_warn_if_reached ();
}
return NULL;
}

View File

@ -250,6 +250,9 @@ CLUTTER_EXPORT
ClutterActor * clutter_stage_get_device_actor (ClutterStage *stage,
ClutterInputDevice *device,
ClutterEventSequence *sequence);
CLUTTER_EXPORT
ClutterActor * clutter_stage_get_event_actor (ClutterStage *stage,
const ClutterEvent *event);
CLUTTER_EXPORT
ClutterGrab * clutter_stage_grab (ClutterStage *stage,

View File

@ -338,7 +338,6 @@ if have_tests
],
exe_wrapper: [
default_test_wrappers,
find_program('catchsegv'),
find_program('xvfb-run'), '-a', '-s', '+iglx -noreset',
],
timeout_multiplier: 10,