From cb41db85965698dcf34217f8d26d9163a72a2e70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 15 Sep 2020 18:44:54 +0200 Subject: [PATCH] =?UTF-8?q?input:=20don=E2=80=99t=20use=20stale=20keycodes?= =?UTF-8?q?=20for=20arrow-up/down?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The keycodes will change if the seat’s keymap changes. Make sure we only do alternate scrolling if the seat has a keyboard, and use the *current* layout’s keycodes for arrow up/down (instead of the *first* layout’s). --- input.c | 21 ++++++++++----------- wayland.h | 3 +++ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/input.c b/input.c index ab15fc46..e8c49d5d 100644 --- a/input.c +++ b/input.c @@ -498,6 +498,9 @@ keyboard_keymap(void *data, struct wl_keyboard *wl_keyboard, seat->kbd.mod_ctrl = xkb_keymap_mod_get_index(seat->kbd.xkb_keymap, "Control"); seat->kbd.mod_meta = xkb_keymap_mod_get_index(seat->kbd.xkb_keymap, "Mod4"); + seat->kbd.key_arrow_up = xkb_keymap_key_by_name(seat->kbd.xkb_keymap, "UP"); + seat->kbd.key_arrow_down = xkb_keymap_key_by_name(seat->kbd.xkb_keymap, "DOWN"); + /* Compose (dead keys) */ seat->kbd.xkb_compose_table = xkb_compose_table_new_from_locale( seat->kbd.xkb, setlocale(LC_CTYPE, NULL), XKB_COMPOSE_COMPILE_NO_FLAGS); @@ -1623,6 +1626,7 @@ mouse_scroll(struct seat *seat, int amount) amount = abs(amount); + if ((button == BTN_BACK || button == BTN_FORWARD) && term->grid == &term->alt && term->alt_scrolling && term->mouse_tracking == MOUSE_NONE) @@ -1632,19 +1636,14 @@ mouse_scroll(struct seat *seat, int amount) * "back"/"forward" to up/down keys */ - static xkb_keycode_t key_arrow_up = 0; - static xkb_keycode_t key_arrow_down = 0; + if (seat->wl_keyboard != NULL) { + xkb_keycode_t key = button == BTN_BACK + ? seat->kbd.key_arrow_up : seat->kbd.key_arrow_down; - if (key_arrow_up == 0) { - key_arrow_up = xkb_keymap_key_by_name(seat->kbd.xkb_keymap, "UP"); - key_arrow_down = xkb_keymap_key_by_name(seat->kbd.xkb_keymap, "DOWN"); + for (int i = 0; i < amount; i++) + keyboard_key(seat, NULL, seat->kbd.serial, 0, key - 8, XKB_KEY_DOWN); + keyboard_key(seat, NULL, seat->kbd.serial, 0, key - 8, XKB_KEY_UP); } - - xkb_keycode_t key = button == BTN_BACK ? key_arrow_up : key_arrow_down; - - for (int i = 0; i < amount; i++) - keyboard_key(seat, NULL, seat->kbd.serial, 0, key - 8, XKB_KEY_DOWN); - keyboard_key(seat, NULL, seat->kbd.serial, 0, key - 8, XKB_KEY_UP); } else { if (!term_mouse_grabbed(term, seat) && seat->mouse.col >= 0 && seat->mouse.row >= 0) diff --git a/wayland.h b/wayland.h index 430d6b66..7d512ba0 100644 --- a/wayland.h +++ b/wayland.h @@ -149,6 +149,9 @@ struct seat { xkb_mod_index_t mod_ctrl; xkb_mod_index_t mod_meta; + xkb_keycode_t key_arrow_up; + xkb_keycode_t key_arrow_down; + /* Enabled modifiers */ bool shift; bool alt;