input: use xkb_keymap_key_repeats() to determine if we should start repeat timer

This commit is contained in:
Daniel Eklöf 2019-11-22 22:19:00 +01:00
parent fd82ffdf52
commit 937fd6933b
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F

38
input.c
View file

@ -178,6 +178,7 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
} }
key += 8; key += 8;
bool should_repeat = xkb_keymap_key_repeats(wayl->kbd.xkb_keymap, key);
xkb_keysym_t sym = xkb_state_key_get_one_sym(wayl->kbd.xkb_state, key); xkb_keysym_t sym = xkb_state_key_get_one_sym(wayl->kbd.xkb_state, key);
#if 0 #if 0
@ -190,8 +191,10 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
enum xkb_compose_status compose_status = xkb_compose_state_get_status( enum xkb_compose_status compose_status = xkb_compose_state_get_status(
wayl->kbd.xkb_compose_state); wayl->kbd.xkb_compose_state);
if (compose_status == XKB_COMPOSE_COMPOSING) if (compose_status == XKB_COMPOSE_COMPOSING) {
/* TODO: goto maybe_repeat? */
return; return;
}
xkb_mod_mask_t mods = xkb_state_serialize_mods( xkb_mod_mask_t mods = xkb_state_serialize_mods(
wayl->kbd.xkb_state, XKB_STATE_MODS_DEPRESSED); wayl->kbd.xkb_state, XKB_STATE_MODS_DEPRESSED);
@ -201,7 +204,8 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
xkb_mod_mask_t effective_mods = mods & ~consumed & significant; xkb_mod_mask_t effective_mods = mods & ~consumed & significant;
if (term->is_searching) { if (term->is_searching) {
start_repeater(wayl, key - 8); if (should_repeat)
start_repeater(wayl, key - 8);
search_input(term, key, sym, effective_mods); search_input(term, key, sym, effective_mods);
return; return;
} }
@ -215,10 +219,8 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
#endif #endif
LOG_DBG("sym=%u, mod=0x%08x, consumed=0x%08x, significant=0x%08x, " LOG_DBG("sym=%u, mod=0x%08x, consumed=0x%08x, significant=0x%08x, "
"effective=0x%08x", "effective=0x%08x, repeats=%d",
sym, mods, consumed, significant, effective_mods); sym, mods, consumed, significant, effective_mods, should_repeat);
bool found_map = false;
enum modifier keymap_mods = MOD_NONE; enum modifier keymap_mods = MOD_NONE;
keymap_mods |= wayl->kbd.shift ? MOD_SHIFT : MOD_NONE; keymap_mods |= wayl->kbd.shift ? MOD_SHIFT : MOD_NONE;
@ -229,37 +231,33 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
if (effective_mods == shift) { if (effective_mods == shift) {
if (sym == XKB_KEY_Page_Up) { if (sym == XKB_KEY_Page_Up) {
cmd_scrollback_up(term, term->rows); cmd_scrollback_up(term, term->rows);
found_map = true; goto maybe_repeat;
} }
else if (sym == XKB_KEY_Page_Down) { else if (sym == XKB_KEY_Page_Down) {
cmd_scrollback_down(term, term->rows); cmd_scrollback_down(term, term->rows);
found_map = true; goto maybe_repeat;
} }
} }
else if (effective_mods == (shift | ctrl)) { else if (effective_mods == (shift | ctrl)) {
if (sym == XKB_KEY_C) { if (sym == XKB_KEY_C) {
selection_to_clipboard(term, serial); selection_to_clipboard(term, serial);
found_map = true; goto maybe_repeat;
} }
else if (sym == XKB_KEY_V) { else if (sym == XKB_KEY_V) {
selection_from_clipboard(term, serial); selection_from_clipboard(term, serial);
term_reset_view(term); term_reset_view(term);
found_map = true; goto maybe_repeat;
} }
else if (sym == XKB_KEY_R) { else if (sym == XKB_KEY_R) {
search_begin(term); search_begin(term);
found_map = true; goto maybe_repeat;
} }
} }
if (found_map) {
start_repeater(wayl, key - 8);
return;
}
for (size_t i = 0; i < sizeof(key_map) / sizeof(key_map[0]); i++) { for (size_t i = 0; i < sizeof(key_map) / sizeof(key_map[0]); i++) {
const struct key_map *k = &key_map[i]; const struct key_map *k = &key_map[i];
@ -283,8 +281,7 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
term_reset_view(term); term_reset_view(term);
selection_cancel(term); selection_cancel(term);
start_repeater(wayl, key - 8); goto maybe_repeat;
return;
} }
} }
@ -346,9 +343,12 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
term_reset_view(term); term_reset_view(term);
selection_cancel(term); selection_cancel(term);
start_repeater(wayl, key - 8);
return;
} }
maybe_repeat:
if (should_repeat)
start_repeater(wayl, key - 8);
} }
static void static void