From 4af9578ab794b10ea6742db0dc8d528646beee07 Mon Sep 17 00:00:00 2001 From: Christian Rauch Date: Wed, 6 May 2020 10:20:32 +1000 Subject: Fix T76429: GHOST/Wayland event's don't correspond to physical keys --- intern/ghost/intern/GHOST_SystemWayland.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'intern/ghost') diff --git a/intern/ghost/intern/GHOST_SystemWayland.cpp b/intern/ghost/intern/GHOST_SystemWayland.cpp index 666515ed088..d0c29efad16 100644 --- a/intern/ghost/intern/GHOST_SystemWayland.cpp +++ b/intern/ghost/intern/GHOST_SystemWayland.cpp @@ -330,7 +330,8 @@ static GHOST_TKey xkb_map_gkey(const xkb_keysym_t &sym) GXMAP(gkey, XKB_KEY_XF86AudioPrev, GHOST_kKeyMediaFirst); GXMAP(gkey, XKB_KEY_XF86AudioNext, GHOST_kKeyMediaLast); default: - GHOST_PRINT("unhandled key: " << sym << std::endl); + GHOST_PRINT("unhandled key: " << std::hex << std::showbase << sym << std::dec << " (" + << sym << ")" << std::endl); gkey = GHOST_kKeyUnknown; } #undef GXMAP @@ -942,6 +943,20 @@ static void keyboard_leave(void * /*data*/, /* pass */ } +/** + * A version of #xkb_state_key_get_one_sym which returns the key without any modifiers pressed. + * Needed because #GHOST_TKey uses these values as key-codes. + */ +static xkb_keysym_t xkb_state_key_get_one_sym_without_modifiers(struct xkb_state *xkb_state, + xkb_keycode_t key) +{ + /* Use an empty keyboard state to access key symbol without modifiers. */ + struct xkb_state *xkb_state_empty = xkb_state_new(xkb_state_get_keymap(xkb_state)); + const xkb_keysym_t sym = xkb_state_key_get_one_sym(xkb_state_empty, key); + xkb_state_unref(xkb_state_empty); + return sym; +} + static void keyboard_key(void *data, struct wl_keyboard * /*wl_keyboard*/, uint32_t serial, @@ -961,7 +976,8 @@ static void keyboard_key(void *data, break; } - const xkb_keysym_t sym = xkb_state_key_get_one_sym(input->xkb_state, key + 8); + const xkb_keysym_t sym = xkb_state_key_get_one_sym_without_modifiers(input->xkb_state, key + 8); + if (sym == XKB_KEY_NoSymbol) { return; } -- cgit v1.2.3