Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
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();
}