git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commitab7653e3cd983b0dc2c12216ff3676e27f3bef9f
parent66666e79aa
authorLucas Galante <[email protected]>
date2026-09-17 12:28
fix(input): read the Super-held state from the group keyboard's modifiers

`refresh_adjust_held` hung off the DEVICE keyboard's modifiers signal,
which never fires on the DRM backend: real keyboards get no keymap
there (`should_set_keymap` is wl/x11 only), so their xkb state never
changes. The group keyboard is what carries the modifier state, and
its handler already pushes modifiers to the seat — the refresh now
runs there, after `wlr_seat_set_keyboard`, so the mask it reads is
the one just notified. The shadow tests had held Super through
`ccectl key-down`, which sets the injected flag and never exercised
the device path; verified this time with a virtual-keyboard client
holding evdev 125: the ring appears and a body drag moves the window.

Co-Authored-By: Claude Fable 5.1 <[email protected]>

 src/server/keyboard_group.rs | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/src/server/keyboard_group.rs b/src/server/keyboard_group.rs
index 56f7eb8..a3eed0f 100644
--- a/src/server/keyboard_group.rs
+++ b/src/server/keyboard_group.rs
@@ -592,6 +592,11 @@ unsafe extern "C" fn handle_group_modifiers(listener: *mut ffi::wl_listener, _da
         ffi::wlr_seat_set_keyboard((*group.seat).wlr_seat, &mut group.wlr_keyboard);
         ffi::wlr_seat_keyboard_notify_modifiers((*group.seat).wlr_seat, &mut group.wlr_keyboard.modifiers);
     }
+    // Window-adjust mode (Super held) reads the seat keyboard's mask, which
+    // is this group's — the DEVICE keyboard has no keymap on the DRM
+    // backend (see keyboard::should_set_keymap), so its own modifiers
+    // signal never fires there; this one does for every real key.
+    (*(*group.seat).server).wm.refresh_adjust_held();
 
     group.send_state();
 }