From 6cb23ec5be60f68d6a82df629243459fb547c61e Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Wed, 5 May 2021 21:58:54 -0400 Subject: [PATCH] Tidy up and comment. --- OSBindings/Qt/keyboard.cpp | 135 +++++++++++++++++++------------------ 1 file changed, 69 insertions(+), 66 deletions(-) diff --git a/OSBindings/Qt/keyboard.cpp b/OSBindings/Qt/keyboard.cpp index b8e1d4a6e..45210e3fd 100644 --- a/OSBindings/Qt/keyboard.cpp +++ b/OSBindings/Qt/keyboard.cpp @@ -5,7 +5,7 @@ // Qt is the worst. // -// Assume your keyboard has a key labelled both . and >, as they do on US and UK keyboards. Call it the dot key. +// Assume your keyboard has a key labelled both . and >, as on US and UK keyboards. Call it the dot key. // Perform the following: // 1. press dot key; // 2. press shift key; @@ -27,8 +27,7 @@ // // So how can you track the physical keys on a keyboard via Qt? // -// You can't. Qt is the worst. SDL doesn't have this problem, including in X11, but I'm not sure I want the extra -// dependency. I may need to reassess. +// You can't. Qt is the worst. SDL doesn't have this problem, including in X11, but I don't want the non-Qt dependency. #ifdef Q_OS_LINUX #define HAS_X11 @@ -50,92 +49,96 @@ KeyboardMapper::KeyboardMapper() { using Key = Inputs::Keyboard::Key; constexpr DesiredMapping mappings[] = { - {XK_Escape, Key::Escape}, - {XK_F1, Key::F1}, {XK_F2, Key::F2}, {XK_F3, Key::F3}, {XK_F4, Key::F4}, {XK_F5, Key::F5}, - {XK_F6, Key::F6}, {XK_F7, Key::F7}, {XK_F8, Key::F8}, {XK_F9, Key::F9}, {XK_F10, Key::F10}, - {XK_F11, Key::F11}, {XK_F12, Key::F12}, - {XK_Sys_Req, Key::PrintScreen}, - {XK_Scroll_Lock, Key::ScrollLock}, - {XK_Pause, Key::Pause}, + {XK_Escape, Key::Escape}, + {XK_F1, Key::F1}, {XK_F2, Key::F2}, {XK_F3, Key::F3}, {XK_F4, Key::F4}, {XK_F5, Key::F5}, + {XK_F6, Key::F6}, {XK_F7, Key::F7}, {XK_F8, Key::F8}, {XK_F9, Key::F9}, {XK_F10, Key::F10}, + {XK_F11, Key::F11}, {XK_F12, Key::F12}, + {XK_Sys_Req, Key::PrintScreen}, + {XK_Scroll_Lock, Key::ScrollLock}, + {XK_Pause, Key::Pause}, - {XK_grave, Key::BackTick}, - {XK_1, Key::k1}, {XK_2, Key::k2}, {XK_3, Key::k3}, {XK_4, Key::k4}, {XK_5, Key::k5}, - {XK_6, Key::k6}, {XK_7, Key::k7}, {XK_8, Key::k8}, {XK_9, Key::k9}, {XK_0, Key::k0}, - {XK_minus, Key::Hyphen}, - {XK_equal, Key::Equals}, - {XK_BackSpace, Key::Backspace}, + {XK_grave, Key::BackTick}, + {XK_1, Key::k1}, {XK_2, Key::k2}, {XK_3, Key::k3}, {XK_4, Key::k4}, {XK_5, Key::k5}, + {XK_6, Key::k6}, {XK_7, Key::k7}, {XK_8, Key::k8}, {XK_9, Key::k9}, {XK_0, Key::k0}, + {XK_minus, Key::Hyphen}, + {XK_equal, Key::Equals}, + {XK_BackSpace, Key::Backspace}, - {XK_Tab, Key::Tab}, - {XK_Q, Key::Q}, {XK_W, Key::W}, {XK_E, Key::E}, {XK_R, Key::R}, {XK_T, Key::T}, - {XK_Y, Key::Y}, {XK_U, Key::U}, {XK_I, Key::I}, {XK_O, Key::O}, {XK_P, Key::P}, - {XK_bracketleft, Key::OpenSquareBracket}, - {XK_bracketright, Key::CloseSquareBracket}, - {XK_backslash, Key::Backslash}, + {XK_Tab, Key::Tab}, + {XK_Q, Key::Q}, {XK_W, Key::W}, {XK_E, Key::E}, {XK_R, Key::R}, {XK_T, Key::T}, + {XK_Y, Key::Y}, {XK_U, Key::U}, {XK_I, Key::I}, {XK_O, Key::O}, {XK_P, Key::P}, + {XK_bracketleft, Key::OpenSquareBracket}, + {XK_bracketright, Key::CloseSquareBracket}, + {XK_backslash, Key::Backslash}, - {XK_Caps_Lock, Key::CapsLock}, - {XK_A, Key::A}, {XK_S, Key::S}, {XK_D, Key::D}, {XK_F, Key::F}, {XK_G, Key::G}, - {XK_H, Key::H}, {XK_J, Key::J}, {XK_K, Key::K}, {XK_L, Key::L}, - {XK_semicolon, Key::Semicolon}, - {XK_apostrophe, Key::Quote}, - {XK_Return, Key::Enter}, + {XK_Caps_Lock, Key::CapsLock}, + {XK_A, Key::A}, {XK_S, Key::S}, {XK_D, Key::D}, {XK_F, Key::F}, {XK_G, Key::G}, + {XK_H, Key::H}, {XK_J, Key::J}, {XK_K, Key::K}, {XK_L, Key::L}, + {XK_semicolon, Key::Semicolon}, + {XK_apostrophe, Key::Quote}, + {XK_Return, Key::Enter}, - {XK_Shift_L, Key::LeftShift}, - {XK_Z, Key::Z}, {XK_X, Key::X}, {XK_C, Key::C}, {XK_V, Key::V}, - {XK_B, Key::B}, {XK_N, Key::N}, {XK_M, Key::M}, - {XK_comma, Key::Comma}, - {XK_period, Key::FullStop}, - {XK_slash, Key::ForwardSlash}, - {XK_Shift_R, Key::RightShift}, + {XK_Shift_L, Key::LeftShift}, + {XK_Z, Key::Z}, {XK_X, Key::X}, {XK_C, Key::C}, {XK_V, Key::V}, + {XK_B, Key::B}, {XK_N, Key::N}, {XK_M, Key::M}, + {XK_comma, Key::Comma}, + {XK_period, Key::FullStop}, + {XK_slash, Key::ForwardSlash}, + {XK_Shift_R, Key::RightShift}, - {XK_Control_L, Key::LeftControl}, - {XK_Control_R, Key::RightControl}, - {XK_Alt_L, Key::LeftOption}, - {XK_Alt_R, Key::RightOption}, - {XK_Meta_L, Key::LeftMeta}, - {XK_Meta_R, Key::RightMeta}, - {XK_space, Key::Space}, + {XK_Control_L, Key::LeftControl}, + {XK_Control_R, Key::RightControl}, + {XK_Alt_L, Key::LeftOption}, + {XK_Alt_R, Key::RightOption}, + {XK_Meta_L, Key::LeftMeta}, + {XK_Meta_R, Key::RightMeta}, + {XK_space, Key::Space}, - {XK_Left, Key::Left}, {XK_Right, Key::Right}, {XK_Up, Key::Up}, {XK_Down, Key::Down}, + {XK_Left, Key::Left}, {XK_Right, Key::Right}, {XK_Up, Key::Up}, {XK_Down, Key::Down}, - {XK_Insert, Key::Insert}, - {XK_Delete, Key::Delete}, - {XK_Home, Key::Home}, - {XK_End, Key::End}, + {XK_Insert, Key::Insert}, + {XK_Delete, Key::Delete}, + {XK_Home, Key::Home}, + {XK_End, Key::End}, - {XK_Num_Lock, Key::NumLock}, + {XK_Num_Lock, Key::NumLock}, - {XK_KP_Divide, Key::KeypadSlash}, - {XK_KP_Multiply, Key::KeypadAsterisk}, - {XK_KP_Delete, Key::KeypadDelete}, - {XK_KP_7, Key::Keypad7}, {XK_KP_8, Key::Keypad8}, {XK_KP_9, Key::Keypad9}, {XK_KP_Add, Key::KeypadPlus}, - {XK_KP_4, Key::Keypad4}, {XK_KP_5, Key::Keypad5}, {XK_KP_6, Key::Keypad6}, {XK_KP_Subtract, Key::KeypadMinus}, - {XK_KP_1, Key::Keypad1}, {XK_KP_2, Key::Keypad2}, {XK_KP_3, Key::Keypad3}, {XK_KP_Enter, Key::KeypadEnter}, - {XK_KP_0, Key::Keypad0}, - {XK_KP_Decimal, Key::KeypadDecimalPoint}, - {XK_KP_Equal, Key::KeypadEquals}, + {XK_KP_Divide, Key::KeypadSlash}, + {XK_KP_Multiply, Key::KeypadAsterisk}, + {XK_KP_Delete, Key::KeypadDelete}, + {XK_KP_7, Key::Keypad7}, {XK_KP_8, Key::Keypad8}, {XK_KP_9, Key::Keypad9}, {XK_KP_Add, Key::KeypadPlus}, + {XK_KP_4, Key::Keypad4}, {XK_KP_5, Key::Keypad5}, {XK_KP_6, Key::Keypad6}, {XK_KP_Subtract, Key::KeypadMinus}, + {XK_KP_1, Key::Keypad1}, {XK_KP_2, Key::Keypad2}, {XK_KP_3, Key::Keypad3}, {XK_KP_Enter, Key::KeypadEnter}, + {XK_KP_0, Key::Keypad0}, + {XK_KP_Decimal, Key::KeypadDecimalPoint}, + {XK_KP_Equal, Key::KeypadEquals}, - {XK_Help, Key::Help}, + {XK_Help, Key::Help}, - {0} + {0} }; + // Extra level of nonsense here: + // + // (1) assume a PC-esque keyboard, with a close-to-US/UK layout; + // (2) from there, use any of the X11 KeySyms I'd expect to be achievable from each physical key to + // look up the X11 KeyCode; + // (3) henceforth, map from X11 KeyCode to the Inputs::Keyboard::Key. const DesiredMapping *mapping = mappings; while(mapping->source != 0) { - const auto sym = XKeysymToKeycode(QX11Info::display(), mapping->source); - keyByKeySym[sym] = mapping->destination; + const auto code = XKeysymToKeycode(QX11Info::display(), mapping->source); + keyByKeySym[code] = mapping->destination; ++mapping; } #endif } std::optional KeyboardMapper::keyForEvent(QKeyEvent *event) { - // Workaround for X11: assume PC-esque mapping. - #ifdef HAS_X11 if(QGuiApplication::platformName() == QLatin1String("xcb")) { - const auto sym = keyByKeySym.find(event->nativeScanCode()); - if(sym == keyByKeySym.end()) return std::nullopt; - return sym->second; + const auto key = keyByKeySym.find(event->nativeScanCode()); + if(key == keyByKeySym.end()) return std::nullopt; + return key->second; } #endif