diff --git a/input.c b/input.c index c429984f..e8650cc7 100644 --- a/input.c +++ b/input.c @@ -363,11 +363,9 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, "effective=0x%08x, repeats=%d", sym, mods, consumed, significant, effective_mods, should_repeat); - enum modifier keymap_mods = MOD_NONE; - keymap_mods |= wayl->kbd.shift ? MOD_SHIFT : MOD_NONE; - keymap_mods |= wayl->kbd.alt ? MOD_ALT : MOD_NONE; - keymap_mods |= wayl->kbd.ctrl ? MOD_CTRL : MOD_NONE; - keymap_mods |= wayl->kbd.meta ? MOD_META : MOD_NONE; + /* + * Builtin shortcuts + */ if (effective_mods == shift) { if (sym == XKB_KEY_Page_Up) { @@ -404,6 +402,16 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, } } + /* + * Keys generating escape sequences + */ + + enum modifier keymap_mods = MOD_NONE; + keymap_mods |= wayl->kbd.shift ? MOD_SHIFT : MOD_NONE; + keymap_mods |= wayl->kbd.alt ? MOD_ALT : MOD_NONE; + keymap_mods |= wayl->kbd.ctrl ? MOD_CTRL : MOD_NONE; + keymap_mods |= wayl->kbd.meta ? MOD_META : MOD_NONE; + const struct key_data *keymap = keymap_lookup(term, sym, keymap_mods); if (keymap != NULL) { term_to_slave(term, keymap->seq, strlen(keymap->seq)); @@ -413,6 +421,10 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, goto maybe_repeat; } + /* + * Compose, and maybe emit "normal" character + */ + uint8_t buf[64] = {0}; int count = 0; @@ -427,55 +439,55 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, wayl->kbd.xkb_state, key, (char *)buf, sizeof(buf)); } - if (count > 0) { + if (count == 0) + goto maybe_repeat; #define is_control_key(x) ((x) >= 0x40 && (x) <= 0x7f) #define IS_CTRL(x) ((x) < 0x20 || ((x) >= 0x7f && (x) <= 0x9f)) - if ((keymap_mods & MOD_CTRL) && - !is_control_key(sym) && - (count == 1 && !IS_CTRL(buf[0])) && - sym < 256) - { - static const int mod_param_map[32] = { - [MOD_SHIFT] = 2, - [MOD_ALT] = 3, - [MOD_SHIFT | MOD_ALT] = 4, - [MOD_CTRL] = 5, - [MOD_SHIFT | MOD_CTRL] = 6, - [MOD_ALT | MOD_CTRL] = 7, - [MOD_SHIFT | MOD_ALT | MOD_CTRL] = 8, - [MOD_META] = 9, - [MOD_META | MOD_SHIFT] = 10, - [MOD_META | MOD_ALT] = 11, - [MOD_META | MOD_SHIFT | MOD_ALT] = 12, - [MOD_META | MOD_CTRL] = 13, - [MOD_META | MOD_SHIFT | MOD_CTRL] = 14, - [MOD_META | MOD_ALT | MOD_CTRL] = 15, - [MOD_META | MOD_SHIFT | MOD_ALT | MOD_CTRL] = 16, - }; + if ((keymap_mods & MOD_CTRL) && + !is_control_key(sym) && + (count == 1 && !IS_CTRL(buf[0])) && + sym < 256) + { + static const int mod_param_map[32] = { + [MOD_SHIFT] = 2, + [MOD_ALT] = 3, + [MOD_SHIFT | MOD_ALT] = 4, + [MOD_CTRL] = 5, + [MOD_SHIFT | MOD_CTRL] = 6, + [MOD_ALT | MOD_CTRL] = 7, + [MOD_SHIFT | MOD_ALT | MOD_CTRL] = 8, + [MOD_META] = 9, + [MOD_META | MOD_SHIFT] = 10, + [MOD_META | MOD_ALT] = 11, + [MOD_META | MOD_SHIFT | MOD_ALT] = 12, + [MOD_META | MOD_CTRL] = 13, + [MOD_META | MOD_SHIFT | MOD_CTRL] = 14, + [MOD_META | MOD_ALT | MOD_CTRL] = 15, + [MOD_META | MOD_SHIFT | MOD_ALT | MOD_CTRL] = 16, + }; - assert(keymap_mods < sizeof(mod_param_map) / sizeof(mod_param_map[0])); - int modify_param = mod_param_map[keymap_mods]; - assert(modify_param != 0); + assert(keymap_mods < sizeof(mod_param_map) / sizeof(mod_param_map[0])); + int modify_param = mod_param_map[keymap_mods]; + assert(modify_param != 0); - char reply[1024]; - snprintf(reply, sizeof(reply), "\x1b[27;%d;%d~", modify_param, sym); - term_to_slave(term, reply, strlen(reply)); - } + char reply[1024]; + snprintf(reply, sizeof(reply), "\x1b[27;%d;%d~", modify_param, sym); + term_to_slave(term, reply, strlen(reply)); + } - else { - if (effective_mods & alt) - term_to_slave(term, "\x1b", 1); + else { + if (effective_mods & alt) + term_to_slave(term, "\x1b", 1); - term_to_slave(term, buf, count); - } + term_to_slave(term, buf, count); + } - clock_gettime( - term->wl->presentation_clock_id, &term->render.input_time); - term_reset_view(term); - selection_cancel(term); - } + clock_gettime( + term->wl->presentation_clock_id, &term->render.input_time); + term_reset_view(term); + selection_cancel(term); maybe_repeat: if (should_repeat)