From 57f27f7cc6a232827a774c3f36035d9290f3b6ce Mon Sep 17 00:00:00 2001 From: Isaac Freund Date: Thu, 2 Apr 2020 13:44:24 +0200 Subject: Implement tag assignment There are a few bugs with this, but the core logic is sound --- src/keyboard.zig | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) (limited to 'src/keyboard.zig') 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; + } + } } } -- cgit v1.2.3