From 827d0b3f7f124389899e65df62b61b9c70ba8a7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Wed, 1 Nov 2017 10:53:59 +0800 Subject: [PATCH] keybindings: Only add multiple keycodes from the same level The reason why multiple keycodes could be mapped to a single keysym was to support having both KEY_FAVORITES and KEY_BOOKMARK map to XF86Favorites. However, iterating through all layout levels adding all key codes has severe consequences on layouts with levels that map things like numbers and arrow. The result is that keybindings that should only have been added for keycodes from the first level, are replaced by some unexpected keycode where the same keysym was found on another level. An example of this is the up-arrow key and l symbol. Normally you'd find both the up-arrow symbol and the l symbol on the first level and be done with it. However, on the German Neo-2 layout, layout level 4 maps the KEY_E to the l symbol, while layout level 4 maps KEY_E to up-arrow. Which ever gets to take priority is arbitrary, but for this particular case KEY_E incorrectly mapped to up-arrow instead of the l symbol, causing the keyboard shortcut Super+l, which would normally lock the screen, to trigger the workspace-up (Super+up-arrow) key binding. https://bugzilla.gnome.org/show_bug.cgi?id=789300 --- src/core/keybindings.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/keybindings.c b/src/core/keybindings.c index f2ef07697..f2d66d037 100644 --- a/src/core/keybindings.c +++ b/src/core/keybindings.c @@ -349,7 +349,9 @@ add_keysym_keycodes_from_layout (int keysym, { xkb_level_index_t layout_level; - for (layout_level = 0; layout_level < layout->n_levels; layout_level++) + for (layout_level = 0; + layout_level < layout->n_levels && keycodes->len == 0; + layout_level++) { FindKeysymData search_data = (FindKeysymData) { .keycodes = keycodes,