From 77510ca72d48b6cae491b2da7ec36de4ba40f67e Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Wed, 2 Aug 2023 20:10:52 +0200 Subject: [PATCH] wayland: Avoid getting the ClutterStage through ClutterEvents Fetch the ClutterStage through other means, as that field will go away from events. Part-of: --- src/wayland/meta-wayland-pointer.c | 5 ++++- src/wayland/meta-wayland-tablet-tool.c | 4 +++- src/wayland/meta-wayland-text-input.c | 17 ++++++++++++++++- src/wayland/meta-wayland-touch.c | 18 +++++++++++++++++- 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c index 8fa46a9c7..0a4658b44 100644 --- a/src/wayland/meta-wayland-pointer.c +++ b/src/wayland/meta-wayland-pointer.c @@ -650,7 +650,10 @@ repick_for_event (MetaWaylandPointer *pointer, } else { - actor = clutter_stage_get_device_actor (clutter_event_get_stage (for_event), + MetaBackend *backend = backend_from_pointer (pointer); + ClutterStage *stage = CLUTTER_STAGE (meta_backend_get_stage (backend)); + + actor = clutter_stage_get_device_actor (stage, clutter_event_get_device (for_event), clutter_event_get_event_sequence (for_event)); } diff --git a/src/wayland/meta-wayland-tablet-tool.c b/src/wayland/meta-wayland-tablet-tool.c index 8c7e45953..d207ae745 100644 --- a/src/wayland/meta-wayland-tablet-tool.c +++ b/src/wayland/meta-wayland-tablet-tool.c @@ -581,9 +581,11 @@ static void repick_for_event (MetaWaylandTabletTool *tool, const ClutterEvent *for_event) { + MetaBackend *backend = backend_from_tool (tool); + ClutterStage *stage = CLUTTER_STAGE (meta_backend_get_stage (backend)); ClutterActor *actor; - actor = clutter_stage_get_device_actor (clutter_event_get_stage (for_event), + actor = clutter_stage_get_device_actor (stage, clutter_event_get_device (for_event), clutter_event_get_event_sequence (for_event)); diff --git a/src/wayland/meta-wayland-text-input.c b/src/wayland/meta-wayland-text-input.c index c9e5b07dc..8cc57d878 100644 --- a/src/wayland/meta-wayland-text-input.c +++ b/src/wayland/meta-wayland-text-input.c @@ -96,6 +96,16 @@ G_DECLARE_FINAL_TYPE (MetaWaylandTextInputFocus, meta_wayland_text_input_focus, G_DEFINE_TYPE (MetaWaylandTextInputFocus, meta_wayland_text_input_focus, CLUTTER_TYPE_INPUT_FOCUS) +static MetaBackend * +backend_from_text_input (MetaWaylandTextInput *text_input) +{ + MetaWaylandSeat *seat = text_input->seat; + MetaWaylandCompositor *compositor = meta_wayland_seat_get_compositor (seat); + MetaContext *context = meta_wayland_compositor_get_context (compositor); + + return meta_context_get_backend (context); +} + static void meta_wayland_text_input_focus_request_surrounding (ClutterInputFocus *focus) { @@ -836,9 +846,14 @@ meta_wayland_text_input_handle_event (MetaWaylandTextInput *text_input, event->type == CLUTTER_TOUCH_BEGIN) { MetaWaylandSurface *surface = NULL; + MetaBackend *backend; + ClutterStage *stage; ClutterActor *actor; - actor = clutter_stage_get_device_actor (clutter_event_get_stage (event), + backend = backend_from_text_input (text_input); + stage = CLUTTER_STAGE (meta_backend_get_stage (backend)); + + actor = clutter_stage_get_device_actor (stage, clutter_event_get_device (event), clutter_event_get_event_sequence (event)); diff --git a/src/wayland/meta-wayland-touch.c b/src/wayland/meta-wayland-touch.c index 37e1a611c..6126e2850 100644 --- a/src/wayland/meta-wayland-touch.c +++ b/src/wayland/meta-wayland-touch.c @@ -54,6 +54,17 @@ struct _MetaWaylandTouchInfo guint begin_delivered : 1; }; +static MetaBackend * +backend_from_touch (MetaWaylandTouch *touch) +{ + MetaWaylandInputDevice *input_device = META_WAYLAND_INPUT_DEVICE (touch); + MetaWaylandSeat *seat = meta_wayland_input_device_get_seat (input_device); + MetaWaylandCompositor *compositor = meta_wayland_seat_get_compositor (seat); + MetaContext *context = meta_wayland_compositor_get_context (compositor); + + return meta_context_get_backend (context); +} + static void move_resources (struct wl_list *destination, struct wl_list *source) { @@ -218,9 +229,14 @@ meta_wayland_touch_update (MetaWaylandTouch *touch, if (event->type == CLUTTER_TOUCH_BEGIN) { MetaWaylandSurface *surface = NULL; + MetaBackend *backend; + ClutterStage *stage; ClutterActor *actor; - actor = clutter_stage_get_device_actor (clutter_event_get_stage (event), + backend = backend_from_touch (touch); + stage = CLUTTER_STAGE (meta_backend_get_stage (backend)); + + actor = clutter_stage_get_device_actor (stage, clutter_event_get_device (event), clutter_event_get_event_sequence (event));