[mutter/wip/carlosg/unthrottled-wayland: 7/20] clutter: Unify picking and device updating
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/carlosg/unthrottled-wayland: 7/20] clutter: Unify picking and device updating
- Date: Tue, 7 Dec 2021 16:51:56 +0000 (UTC)
commit 3555807d8afccb9e86dc4d22cb449a0f6914f196
Author: Carlos Garnacho <carlosg gnome org>
Date: Fri Jun 25 19:50:26 2021 +0200
clutter: Unify picking and device updating
Add a clutter_stage_pick_and_update_device() method that is the only
single entry point for updating a device position as seen by the
stage.
Also, update all callers to use it.
clutter/clutter/clutter-main.c | 41 +++++++-------------
clutter/clutter/clutter-stage-private.h | 12 ++++++
clutter/clutter/clutter-stage.c | 69 +++++++++++++++++++--------------
3 files changed, 67 insertions(+), 55 deletions(-)
---
diff --git a/clutter/clutter/clutter-main.c b/clutter/clutter/clutter-main.c
index 45fb9fa6af..a8ba30242c 100644
--- a/clutter/clutter/clutter-main.c
+++ b/clutter/clutter/clutter-main.c
@@ -768,28 +768,22 @@ update_device_for_event (ClutterStage *stage,
{
ClutterInputDevice *device = clutter_event_get_device (event);
ClutterEventSequence *sequence = clutter_event_get_event_sequence (event);
- ClutterActor *new_actor;
+ ClutterDeviceUpdateFlags flags = CLUTTER_DEVICE_UPDATE_NONE;
graphene_point_t point;
uint32_t time_ms;
clutter_event_get_coords (event, &point.x, &point.y);
time_ms = clutter_event_get_time (event);
- new_actor =
- clutter_stage_get_actor_at_pos (stage, CLUTTER_PICK_REACTIVE,
- point.x, point.y);
+ if (emit_crossing)
+ flags |= CLUTTER_DEVICE_UPDATE_EMIT_CROSSING;
- /* Picking should never fail, but if it does, we bail out here */
- g_return_val_if_fail (new_actor != NULL, NULL);
-
- clutter_stage_update_device (stage,
- device, sequence,
- point,
- time_ms,
- new_actor,
- emit_crossing);
-
- return new_actor;
+ return clutter_stage_pick_and_update_device (stage,
+ device,
+ sequence,
+ flags,
+ point,
+ time_ms);
}
/**
@@ -982,19 +976,14 @@ clutter_stage_repick_device (ClutterStage *stage,
ClutterInputDevice *device)
{
graphene_point_t point;
- ClutterActor *new_actor;
clutter_stage_get_device_coords (stage, device, NULL, &point);
- new_actor =
- clutter_stage_get_actor_at_pos (stage, CLUTTER_PICK_REACTIVE,
- point.x, point.y);
-
- clutter_stage_update_device (stage,
- device, NULL,
- point,
- CLUTTER_CURRENT_TIME,
- new_actor,
- TRUE);
+ clutter_stage_pick_and_update_device (stage,
+ device,
+ NULL,
+ CLUTTER_DEVICE_UPDATE_EMIT_CROSSING,
+ point,
+ CLUTTER_CURRENT_TIME);
}
static void
diff --git a/clutter/clutter/clutter-stage-private.h b/clutter/clutter/clutter-stage-private.h
index a71b5df826..0fc4711b03 100644
--- a/clutter/clutter/clutter-stage-private.h
+++ b/clutter/clutter/clutter-stage-private.h
@@ -31,6 +31,12 @@
G_BEGIN_DECLS
+typedef enum
+{
+ CLUTTER_DEVICE_UPDATE_NONE = 0,
+ CLUTTER_DEVICE_UPDATE_EMIT_CROSSING = 1 << 0,
+} ClutterDeviceUpdateFlags;
+
/* stage */
ClutterStageWindow *_clutter_stage_get_default_window (void);
@@ -134,6 +140,12 @@ void clutter_stage_update_device_entry (ClutterStage *self,
void clutter_stage_remove_device_entry (ClutterStage *self,
ClutterInputDevice *device,
ClutterEventSequence *sequence);
+ClutterActor * clutter_stage_pick_and_update_device (ClutterStage *stage,
+ ClutterInputDevice *device,
+ ClutterEventSequence *sequence,
+ ClutterDeviceUpdateFlags flags,
+ graphene_point_t point,
+ uint32_t time_ms);
G_END_DECLS
diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c
index cae0ed330d..cd3e858a25 100644
--- a/clutter/clutter/clutter-stage.c
+++ b/clutter/clutter/clutter-stage.c
@@ -170,10 +170,6 @@ static void clutter_stage_update_view_perspective (ClutterStage *stage);
static void clutter_stage_set_viewport (ClutterStage *stage,
float width,
float height);
-static ClutterActor * _clutter_stage_do_pick (ClutterStage *stage,
- float x,
- float y,
- ClutterPickMode mode);
G_DEFINE_TYPE_WITH_PRIVATE (ClutterStage, clutter_stage, CLUTTER_TYPE_ACTOR)
@@ -914,22 +910,16 @@ clutter_stage_update_devices (ClutterStage *stage,
{
ClutterInputDevice *device = l->data;
PointerDeviceEntry *entry = NULL;
- ClutterActor *new_actor;
entry = g_hash_table_lookup (priv->pointer_devices, device);
g_assert (entry != NULL);
- new_actor = _clutter_stage_do_pick (stage,
- entry->coords.x,
- entry->coords.y,
- CLUTTER_PICK_REACTIVE);
-
- clutter_stage_update_device (stage,
- device, NULL,
- entry->coords,
- CLUTTER_CURRENT_TIME,
- new_actor,
- TRUE);
+ clutter_stage_pick_and_update_device (stage,
+ device,
+ NULL,
+ CLUTTER_DEVICE_UPDATE_EMIT_CROSSING,
+ entry->coords,
+ CLUTTER_CURRENT_TIME);
}
}
@@ -3256,22 +3246,15 @@ on_device_actor_reactive_changed (ClutterActor *actor,
PointerDeviceEntry *entry)
{
ClutterStage *self = entry->stage;
- ClutterActor *new_device_actor;
g_assert (!clutter_actor_get_reactive (actor));
- new_device_actor =
- _clutter_stage_do_pick (self,
- entry->coords.x,
- entry->coords.y,
- CLUTTER_PICK_REACTIVE);
-
- clutter_stage_update_device (self,
- entry->device, entry->sequence,
- entry->coords,
- CLUTTER_CURRENT_TIME,
- new_device_actor,
- TRUE);
+ clutter_stage_pick_and_update_device (self,
+ entry->device,
+ entry->sequence,
+ CLUTTER_DEVICE_UPDATE_EMIT_CROSSING,
+ entry->coords,
+ CLUTTER_CURRENT_TIME);
}
static void
@@ -3445,3 +3428,31 @@ clutter_stage_get_device_coords (ClutterStage *stage,
if (entry && coords)
*coords = entry->coords;
}
+
+ClutterActor *
+clutter_stage_pick_and_update_device (ClutterStage *stage,
+ ClutterInputDevice *device,
+ ClutterEventSequence *sequence,
+ ClutterDeviceUpdateFlags flags,
+ graphene_point_t point,
+ uint32_t time_ms)
+{
+ ClutterActor *new_actor;
+
+ new_actor = _clutter_stage_do_pick (stage,
+ point.x,
+ point.y,
+ CLUTTER_PICK_REACTIVE);
+
+ /* Picking should never fail, but if it does, we bail out here */
+ g_return_val_if_fail (new_actor != NULL, NULL);
+
+ clutter_stage_update_device (stage,
+ device, sequence,
+ point,
+ time_ms,
+ new_actor,
+ !!(flags & CLUTTER_DEVICE_UPDATE_EMIT_CROSSING));
+
+ return new_actor;
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]