aboutsummaryrefslogtreecommitdiff
path: root/src/keyboard.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/keyboard.zig')
-rw-r--r--src/keyboard.zig40
1 files changed, 33 insertions, 7 deletions
diff --git a/src/keyboard.zig b/src/keyboard.zig
index 6e4138c..57f1d37 100644
--- a/src/keyboard.zig
+++ b/src/keyboard.zig
@@ -81,11 +81,29 @@ pub const Keyboard = struct {
// Translate libinput keycode -> xkbcommon
const keycode = event.keycode + 8;
- // Get a list of keysyms based on the keymap for this keyboard
- var syms: ?[*]c.xkb_keysym_t = undefined;
- const nsyms = c.xkb_state_key_get_syms(wlr_keyboard.xkb_state, keycode, &syms);
+
+ // Get a list of keysyms as xkb reports them
+ var translated_keysyms: ?[*]c.xkb_keysym_t = undefined;
+ const translated_keysyms_len = c.xkb_state_key_get_syms(
+ wlr_keyboard.xkb_state,
+ keycode,
+ &translated_keysyms,
+ );
+
+ // Get a list of keysyms ignoring modifiers (e.g. 1 instead of !)
+ // Important for bindings like Mod+Shift+1
+ var raw_keysyms: ?[*]c.xkb_keysym_t = undefined;
+ const layout_index = c.xkb_state_key_get_layout(wlr_keyboard.xkb_state, keycode);
+ const raw_keysyms_len = c.xkb_keymap_key_get_syms_by_level(
+ wlr_keyboard.keymap,
+ keycode,
+ layout_index,
+ 0,
+ &raw_keysyms,
+ );
var handled = false;
+ // TODO: These modifiers aren't properly handled, see sway's code
const modifiers = c.wlr_keyboard_get_modifiers(wlr_keyboard);
if (modifiers & @intCast(u32, c.WLR_MODIFIER_LOGO) != 0 and
event.state == c.enum_wlr_key_state.WLR_KEY_PRESSED)
@@ -93,12 +111,20 @@ pub const Keyboard = struct {
// If mod is held down and this button was _pressed_, we attempt to
// process it as a compositor keybinding.
var i: usize = 0;
- while (i < nsyms) {
- handled = keyboard.seat.server.handleKeybinding(syms.?[i], modifiers);
- if (handled) {
+ while (i < translated_keysyms_len) : (i += 1) {
+ if (keyboard.seat.server.handleKeybinding(translated_keysyms.?[i], modifiers)) {
+ handled = true;
break;
}
- i += 1;
+ }
+ if (!handled) {
+ i = 0;
+ while (i < raw_keysyms_len) : (i += 1) {
+ if (keyboard.seat.server.handleKeybinding(raw_keysyms.?[i], modifiers)) {
+ handled = true;
+ break;
+ }
+ }
}
}