From fbe00573d72e76bc6ff35da102901eddeee24505 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Thu, 5 Dec 2024 15:05:26 +0100 Subject: [PATCH] xwayland/dnd: Handle stage to protocol transformations We'd send stage coordinates via the Xdnd X11 protocol, but X11 clients expect X11 protocol coordinates. Make sure to transform these accordingly. The same applies to the size of our DND cover window, which needs to be move/resize:ed in protocol coordinates. Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3815 Part-of: --- src/wayland/meta-xwayland-dnd.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/wayland/meta-xwayland-dnd.c b/src/wayland/meta-xwayland-dnd.c index 7f352cb6b..97ef4761b 100644 --- a/src/wayland/meta-xwayland-dnd.c +++ b/src/wayland/meta-xwayland-dnd.c @@ -341,10 +341,12 @@ xdnd_send_position (MetaXWaylandDnd *dnd, int y) { MetaWaylandCompositor *compositor = dnd->manager->compositor; + MetaXWaylandManager *manager = &compositor->xwayland_manager; MetaWaylandDataSource *source = compositor->seat->data_device.dnd_data_source; MetaX11Display *x11_display = x11_display_from_dnd (dnd); Display *xdisplay = x11_display->xdisplay; uint32_t action = 0, user_action, actions; + int protocol_x, protocol_y; XEvent xev = { 0 }; user_action = meta_wayland_data_source_get_user_action (source); @@ -360,9 +362,13 @@ xdnd_send_position (MetaXWaylandDnd *dnd, xev.xclient.format = 32; xev.xclient.window = dest; + meta_xwayland_stage_to_protocol_point (manager, + x, y, + &protocol_x, &protocol_y); + xev.xclient.data.l[0] = x11_display->selection.xwindow; xev.xclient.data.l[1] = 0; - xev.xclient.data.l[2] = (x << 16) | y; + xev.xclient.data.l[2] = (protocol_x << 16) | protocol_y; xev.xclient.data.l[3] = time; xev.xclient.data.l[4] = action_to_atom (action); @@ -800,11 +806,11 @@ repick_drop_surface (MetaWaylandCompositor *compositor, const ClutterEvent *event) { MetaXWaylandDnd *dnd = compositor->xwayland_manager.dnd; + MetaXWaylandManager *manager = &compositor->xwayland_manager; MetaX11Display *x11_display = x11_display_from_dnd (dnd); Display *xdisplay = meta_x11_display_get_xdisplay (x11_display); MetaWaylandSurface *focus = NULL; MetaWindow *focus_window; - MtkRectangle frame_rect; focus = pick_drop_surface (compositor, event); if (dnd->focus_surface == focus) @@ -821,12 +827,18 @@ repick_drop_surface (MetaWaylandCompositor *compositor, focus_window->client_type == META_WINDOW_CLIENT_TYPE_WAYLAND) { Window dnd_window; + MtkRectangle frame_rect; hide_dnd_window (dnd, x11_display, dnd->current_dnd_window); dnd_window = next_dnd_window (dnd); XMapRaised (xdisplay, dnd_window); + frame_rect = meta_window_config_get_rect (focus_window->config); + meta_xwayland_stage_to_protocol_rect (manager, + &frame_rect, + &frame_rect); + XMoveResizeWindow (xdisplay, dnd_window, frame_rect.x, frame_rect.y,