///////////////////////////////////////////////////////
| 63 | |
| 64 | //////////////////////////////////////////////////////////// |
| 65 | sf::Keyboard::Scancode translateKeyCode(Display* display, KeyCode keycode) |
| 66 | { |
| 67 | if (!isValidKeycode(keycode)) |
| 68 | return sf::Keyboard::Scan::Unknown; |
| 69 | |
| 70 | // Try secondary keysym, for numeric keypad keys |
| 71 | // Note: This way we always force "NumLock = ON", which is intentional |
| 72 | // since the returned key code should correspond to a physical location. |
| 73 | KeySym keySym = XkbKeycodeToKeysym(display, keycode, 0, 1); |
| 74 | |
| 75 | // clang-format off |
| 76 | switch (keySym) |
| 77 | { |
| 78 | case XK_KP_0: return sf::Keyboard::Scan::Numpad0; |
| 79 | case XK_KP_1: return sf::Keyboard::Scan::Numpad1; |
| 80 | case XK_KP_2: return sf::Keyboard::Scan::Numpad2; |
| 81 | case XK_KP_3: return sf::Keyboard::Scan::Numpad3; |
| 82 | case XK_KP_4: return sf::Keyboard::Scan::Numpad4; |
| 83 | case XK_KP_5: return sf::Keyboard::Scan::Numpad5; |
| 84 | case XK_KP_6: return sf::Keyboard::Scan::Numpad6; |
| 85 | case XK_KP_7: return sf::Keyboard::Scan::Numpad7; |
| 86 | case XK_KP_8: return sf::Keyboard::Scan::Numpad8; |
| 87 | case XK_KP_9: return sf::Keyboard::Scan::Numpad9; |
| 88 | case XK_KP_Separator: return sf::Keyboard::Scan::NumpadDecimal; |
| 89 | case XK_KP_Decimal: return sf::Keyboard::Scan::NumpadDecimal; |
| 90 | case XK_KP_Equal: return sf::Keyboard::Scan::NumpadEqual; |
| 91 | case XK_KP_Enter: return sf::Keyboard::Scan::NumpadEnter; |
| 92 | default: break; |
| 93 | } |
| 94 | // clang-format on |
| 95 | |
| 96 | // Now try primary keysym for function keys (non-printable keys) |
| 97 | // These should not depend on the current keyboard layout |
| 98 | keySym = XkbKeycodeToKeysym(display, keycode, 0, 0); |
| 99 | |
| 100 | // clang-format off |
| 101 | switch (keySym) |
| 102 | { |
| 103 | case XK_Return: return sf::Keyboard::Scan::Enter; |
| 104 | case XK_Escape: return sf::Keyboard::Scan::Escape; |
| 105 | case XK_BackSpace: return sf::Keyboard::Scan::Backspace; |
| 106 | case XK_Tab: return sf::Keyboard::Scan::Tab; |
| 107 | case XK_Shift_L: return sf::Keyboard::Scan::LShift; |
| 108 | case XK_Shift_R: return sf::Keyboard::Scan::RShift; |
| 109 | case XK_Control_L: return sf::Keyboard::Scan::LControl; |
| 110 | case XK_Control_R: return sf::Keyboard::Scan::RControl; |
| 111 | case XK_Alt_L: return sf::Keyboard::Scan::LAlt; |
| 112 | case XK_ISO_Level3_Shift: // AltGr on at least some machines |
| 113 | case XK_Alt_R: return sf::Keyboard::Scan::RAlt; |
| 114 | case XK_Meta_L: |
| 115 | case XK_Super_L: return sf::Keyboard::Scan::LSystem; |
| 116 | case XK_Meta_R: |
| 117 | case XK_Super_R: return sf::Keyboard::Scan::RSystem; |
| 118 | case XK_Menu: return sf::Keyboard::Scan::Menu; |
| 119 | |
| 120 | case XK_Num_Lock: return sf::Keyboard::Scan::NumLock; |
| 121 | case XK_Caps_Lock: return sf::Keyboard::Scan::CapsLock; |
| 122 | case XK_Execute: return sf::Keyboard::Scan::Execute; |
no test coverage detected