From e7f436bc39edad20797c98857569d2b8b92bc6d4 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Tue, 21 Nov 2023 23:27:12 +0100 Subject: [PATCH] compositor: Refactor MetaDnD wayland event handling Hook MetaDnD event delivery in the case of Wayland DnD ops directly in the Wayland code, instead of indirectly in core/ code. Part-of: --- src/backends/meta-dnd-private.h | 7 +++--- src/compositor/meta-compositor-server.c | 6 ----- src/compositor/meta-dnd.c | 29 +------------------------ src/core/events.c | 5 ----- src/wayland/meta-wayland-data-device.c | 17 +++++++++++++-- 5 files changed, 20 insertions(+), 44 deletions(-) diff --git a/src/backends/meta-dnd-private.h b/src/backends/meta-dnd-private.h index 03503e511..fb6d4928a 100644 --- a/src/backends/meta-dnd-private.h +++ b/src/backends/meta-dnd-private.h @@ -39,8 +39,9 @@ void meta_dnd_init_xdnd (MetaX11Display *x11_display); #ifdef HAVE_WAYLAND void meta_dnd_wayland_handle_begin_modal (MetaCompositor *compositor); -void meta_dnd_wayland_handle_end_modal (MetaCompositor *compositor); -void meta_dnd_wayland_maybe_handle_event (MetaDnd *dnd, - const ClutterEvent *event); +void meta_dnd_wayland_handle_end_modal (MetaCompositor *compositor); + +void meta_dnd_wayland_on_motion_event (MetaDnd *dnd, + const ClutterEvent *event); #endif diff --git a/src/compositor/meta-compositor-server.c b/src/compositor/meta-compositor-server.c index 55f360a80..2cf4ce575 100644 --- a/src/compositor/meta-compositor-server.c +++ b/src/compositor/meta-compositor-server.c @@ -44,17 +44,11 @@ meta_compositor_server_monotonic_to_high_res_xserver_time (MetaCompositor *compo static void meta_compositor_server_grab_begin (MetaCompositor *compositor) { -#ifdef HAVE_WAYLAND - meta_dnd_wayland_handle_begin_modal (compositor); -#endif } static void meta_compositor_server_grab_end (MetaCompositor *compositor) { -#ifdef HAVE_WAYLAND - meta_dnd_wayland_handle_end_modal (compositor); -#endif } static MetaCompositorView * diff --git a/src/compositor/meta-dnd.c b/src/compositor/meta-dnd.c index 65cab815d..c0205fde9 100644 --- a/src/compositor/meta-dnd.c +++ b/src/compositor/meta-dnd.c @@ -241,18 +241,7 @@ meta_dnd_handle_xdnd_event (MetaBackend *backend, #endif #ifdef HAVE_WAYLAND -static MetaWaylandDataDevice * -data_device_from_dnd (MetaDnd *dnd) -{ - MetaDndPrivate *priv = meta_dnd_get_instance_private (dnd); - MetaContext *context = meta_backend_get_context (priv->backend); - MetaWaylandCompositor *compositor = - meta_context_get_wayland_compositor (context); - - return &compositor->seat->data_device; -} - -static void +void meta_dnd_wayland_on_motion_event (MetaDnd *dnd, const ClutterEvent *event) { @@ -264,22 +253,6 @@ meta_dnd_wayland_on_motion_event (MetaDnd *dnd, meta_dnd_notify_dnd_position_change (dnd, (int)event_x, (int)event_y); } -void -meta_dnd_wayland_maybe_handle_event (MetaDnd *dnd, - const ClutterEvent *event) -{ - MetaWaylandDataDevice *data_device = data_device_from_dnd (dnd); - ClutterEventType event_type; - - if (!meta_wayland_data_device_get_current_grab (data_device)) - return; - - event_type = clutter_event_type (event); - - if (event_type == CLUTTER_MOTION) - meta_dnd_wayland_on_motion_event (dnd, event); -} - void meta_dnd_wayland_handle_begin_modal (MetaCompositor *compositor) { diff --git a/src/core/events.c b/src/core/events.c index ead8f8cd8..d9b1a35fb 100644 --- a/src/core/events.c +++ b/src/core/events.c @@ -456,11 +456,6 @@ meta_display_handle_event (MetaDisplay *display, if (stage_has_grab (display)) { -#ifdef HAVE_WAYLAND - if (wayland_compositor) - meta_dnd_wayland_maybe_handle_event (meta_backend_get_dnd (backend), event); -#endif - bypass_wayland = TRUE; bypass_clutter = FALSE; goto out; diff --git a/src/wayland/meta-wayland-data-device.c b/src/wayland/meta-wayland-data-device.c index e77fdfb2f..ddd00d903 100644 --- a/src/wayland/meta-wayland-data-device.c +++ b/src/wayland/meta-wayland-data-device.c @@ -34,6 +34,7 @@ #include #include +#include "backends/meta-dnd-private.h" #include "compositor/meta-dnd-actor-private.h" #include "core/meta-selection-private.h" #include "meta/meta-selection-source-memory.h" @@ -364,6 +365,8 @@ static void data_device_end_drag_grab (MetaWaylandDragGrab *drag_grab) { MetaWaylandDataDevice *data_device = &drag_grab->seat->data_device; + MetaDisplay *display = display_from_data_device (data_device); + MetaCompositor *compositor = meta_display_get_compositor (display); meta_wayland_drag_grab_set_source (drag_grab, NULL); meta_wayland_drag_grab_set_focus (drag_grab, NULL); @@ -397,6 +400,8 @@ data_device_end_drag_grab (MetaWaylandDragGrab *drag_grab) drag_grab->handler = NULL; } + meta_dnd_wayland_handle_end_modal (compositor); + g_free (drag_grab); } @@ -482,6 +487,10 @@ drag_grab_motion (MetaWaylandEventHandler *handler, gpointer user_data) { MetaWaylandDragGrab *drag_grab = user_data; + MetaWaylandCompositor *compositor = + meta_wayland_seat_get_compositor (drag_grab->seat); + MetaContext *context = meta_wayland_compositor_get_context (compositor); + MetaBackend *backend = meta_context_get_backend (context); graphene_point_t point; uint32_t time_ms; @@ -503,6 +512,8 @@ drag_grab_motion (MetaWaylandEventHandler *handler, event); } + meta_dnd_wayland_on_motion_event (meta_backend_get_dnd (backend), event); + return CLUTTER_EVENT_STOP; } @@ -672,6 +683,8 @@ meta_wayland_data_device_start_drag (MetaWaylandDataDevice *data_devic graphene_point_t drag_start) { MetaWaylandSeat *seat = wl_container_of (data_device, seat, data_device); + MetaDisplay *display = display_from_data_device (data_device); + MetaCompositor *compositor = meta_display_get_compositor (display); MetaWaylandDragGrab *drag_grab; graphene_point_t pos, surface_pos; ClutterModifierType modifiers; @@ -715,8 +728,6 @@ meta_wayland_data_device_start_drag (MetaWaylandDataDevice *data_devic if (icon_surface) { - MetaDisplay *display = display_from_data_device (data_device); - MetaCompositor *compositor = meta_display_get_compositor (display); ClutterActor *drag_surface_actor; drag_grab->drag_surface = icon_surface; @@ -748,6 +759,8 @@ meta_wayland_data_device_start_drag (MetaWaylandDataDevice *data_devic TRUE, drag_grab); meta_wayland_data_source_set_seat (source, seat); + + meta_dnd_wayland_handle_begin_modal (compositor); } void