input/seat: locally compute drag icon offset

References: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3861
This commit is contained in:
Simon Ser 2022-11-15 14:48:28 +01:00 committed by Kirill Primak
parent e1be46875d
commit 024c3e4428
2 changed files with 8 additions and 4 deletions

View file

@ -72,6 +72,7 @@ struct sway_drag_icon {
struct wl_list link; // sway_root::drag_icons struct wl_list link; // sway_root::drag_icons
double x, y; // in layout-local coordinates double x, y; // in layout-local coordinates
int dx, dy; // offset in surface-local coordinates
struct wl_listener surface_commit; struct wl_listener surface_commit;
struct wl_listener map; struct wl_listener map;

View file

@ -382,8 +382,8 @@ void drag_icon_update_position(struct sway_drag_icon *icon) {
case WLR_DRAG_GRAB_KEYBOARD: case WLR_DRAG_GRAB_KEYBOARD:
return; return;
case WLR_DRAG_GRAB_KEYBOARD_POINTER: case WLR_DRAG_GRAB_KEYBOARD_POINTER:
icon->x = cursor->x + wlr_icon->surface->sx; icon->x = cursor->x + icon->dx;
icon->y = cursor->y + wlr_icon->surface->sy; icon->y = cursor->y + icon->dy;
break; break;
case WLR_DRAG_GRAB_KEYBOARD_TOUCH:; case WLR_DRAG_GRAB_KEYBOARD_TOUCH:;
struct wlr_touch_point *point = struct wlr_touch_point *point =
@ -391,8 +391,8 @@ void drag_icon_update_position(struct sway_drag_icon *icon) {
if (point == NULL) { if (point == NULL) {
return; return;
} }
icon->x = seat->touch_x + wlr_icon->surface->sx; icon->x = seat->touch_x + icon->dx;
icon->y = seat->touch_y + wlr_icon->surface->sy; icon->y = seat->touch_y + icon->dy;
} }
drag_icon_damage_whole(icon); drag_icon_damage_whole(icon);
@ -402,6 +402,9 @@ static void drag_icon_handle_surface_commit(struct wl_listener *listener,
void *data) { void *data) {
struct sway_drag_icon *icon = struct sway_drag_icon *icon =
wl_container_of(listener, icon, surface_commit); wl_container_of(listener, icon, surface_commit);
struct wlr_drag_icon *wlr_icon = icon->wlr_drag_icon;
icon->dx += wlr_icon->surface->current.dx;
icon->dy += wlr_icon->surface->current.dy;
drag_icon_update_position(icon); drag_icon_update_position(icon);
} }