diff --git a/input.c b/input.c index 110bd378..bc28bbf2 100644 --- a/input.c +++ b/input.c @@ -770,8 +770,8 @@ keymap_data_for_sym(xkb_keysym_t sym, size_t *count) switch (sym) { case XKB_KEY_Escape: *count = ALEN(key_escape); return key_escape; case XKB_KEY_Return: *count = ALEN(key_return); return key_return; - case XKB_KEY_Tab: /* FALLTHROUGH */ - case XKB_KEY_ISO_Left_Tab: *count = ALEN(key_tab); return key_tab; + case XKB_KEY_ISO_Left_Tab: *count = ALEN(key_iso_left_tab); return key_iso_left_tab; + case XKB_KEY_Tab: *count = ALEN(key_tab); return key_tab; case XKB_KEY_BackSpace: *count = ALEN(key_backspace); return key_backspace; case XKB_KEY_Up: *count = ALEN(key_up); return key_up; case XKB_KEY_Down: *count = ALEN(key_down); return key_down; diff --git a/keymap.h b/keymap.h index 8a8c968e..f1b4a0ea 100644 --- a/keymap.h +++ b/keymap.h @@ -78,6 +78,25 @@ static const struct key_data key_tab[] = { {MOD_ANY, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\t"}, }; +/* + * Shift+Tab produces ISO_Left_Tab + * + * However, all combos (except Shift+Tab) acts as if we pressed + * mods+shift+tab. XKB “consumes” shift for us, hence MOD_SHIFT isn’t + * present in any of the entries below. However, the entries still map + * to sequences that indicate shift has been pressed. + */ +static const struct key_data key_iso_left_tab[] = { + {MOD_ALT, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033[27;4;9~"}, + {MOD_CTRL, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033[27;6;9~"}, + {MOD_ALT | MOD_CTRL, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033[27;8;9~"}, + {MOD_META, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033[27;10;9~"}, + {MOD_META | MOD_ALT, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033[27;12;9~"}, + {MOD_META | MOD_CTRL, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033[27;14;9~"}, + {MOD_META | MOD_ALT | MOD_CTRL, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033[27;16;9~"}, + {MOD_ANY, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033[Z"}, +}; + static const struct key_data key_backspace[] = { {MOD_SHIFT, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\x7f"}, {MOD_ALT, CURSOR_KEYS_DONTCARE, KEYPAD_DONTCARE, "\033\x7f"},