From 87ed6976a582d4a6e6809a973103a38b065a13a3 Mon Sep 17 00:00:00 2001 From: Ollie Date: Fri, 29 May 2026 08:26:28 +0200 Subject: [PATCH] wl_backend: use correct cursor in wl_pointer_grab (not always left_ptr) --- ROADMAP.md | 2 +- src/backend/wayland/wl_backend.c | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 499bbc9..cd0889a 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -75,7 +75,7 @@ XWayland bridge auto-syncs. Needs verification. | `client_snapshot` | ✅ Done — buffer read for native, XGetImage for XWayland | | `window_set_border` | ✅ No-op (borders drawn into frame buffer) | | `client_synth_configure` | ✅ Done — XDG configure + XWayland configure | -| `pointer_change_grab` | ⚠️ No-op — menu tracking may need this | +| `pointer_change_grab` | ✅ Done — updates cursor during move/resize | --- diff --git a/src/backend/wayland/wl_backend.c b/src/backend/wayland/wl_backend.c index 820a2ce..34a5723 100644 --- a/src/backend/wayland/wl_backend.c +++ b/src/backend/wayland/wl_backend.c @@ -6293,8 +6293,19 @@ wl_pointer_grab(WNativeWindow grab_win, WNativeWindow confine_to, if (wl_state.seat) wlr_seat_pointer_clear_focus(wl_state.seat); } - if (cursor_id > 0) - wl_set_cursor_image("left_ptr"); + if (cursor_id > 0) { + /* Map WCUR_* cursor IDs to xcursor names (same as pointer_change_grab) */ + switch (cursor_id) { + case WCUR_MOVE: wl_set_cursor_image("fleur"); break; + case WCUR_TOPLEFTRESIZE: wl_set_cursor_image("nw-resize"); break; + case WCUR_TOPRIGHTRESIZE: wl_set_cursor_image("ne-resize"); break; + case WCUR_BOTTOMLEFTRESIZE: wl_set_cursor_image("sw-resize"); break; + case WCUR_BOTTOMRIGHTRESIZE: wl_set_cursor_image("se-resize"); break; + case WCUR_VERTICALRESIZE: wl_set_cursor_image("n-resize"); break; + case WCUR_HORIZONRESIZE: wl_set_cursor_image("e-resize"); break; + default: wl_set_cursor_image("left_ptr"); break; + } + } return 1; /* success */ }