| 1 | /* | 
|---|
| 2 | Simple DirectMedia Layer | 
|---|
| 3 | Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org> | 
|---|
| 4 |  | 
|---|
| 5 | This software is provided 'as-is', without any express or implied | 
|---|
| 6 | warranty.  In no event will the authors be held liable for any damages | 
|---|
| 7 | arising from the use of this software. | 
|---|
| 8 |  | 
|---|
| 9 | Permission is granted to anyone to use this software for any purpose, | 
|---|
| 10 | including commercial applications, and to alter it and redistribute it | 
|---|
| 11 | freely, subject to the following restrictions: | 
|---|
| 12 |  | 
|---|
| 13 | 1. The origin of this software must not be misrepresented; you must not | 
|---|
| 14 | claim that you wrote the original software. If you use this software | 
|---|
| 15 | in a product, an acknowledgment in the product documentation would be | 
|---|
| 16 | appreciated but is not required. | 
|---|
| 17 | 2. Altered source versions must be plainly marked as such, and must not be | 
|---|
| 18 | misrepresented as being the original software. | 
|---|
| 19 | 3. This notice may not be removed or altered from any source distribution. | 
|---|
| 20 | */ | 
|---|
| 21 | #include "SDL_internal.h" | 
|---|
| 22 |  | 
|---|
| 23 | #if defined(SDL_VIDEO_DRIVER_WAYLAND) || defined(SDL_VIDEO_DRIVER_X11) | 
|---|
| 24 |  | 
|---|
| 25 | #include "SDL_keyboard_c.h" | 
|---|
| 26 | #include "SDL_scancode_tables_c.h" | 
|---|
| 27 | #include "SDL_keysym_to_scancode_c.h" | 
|---|
| 28 |  | 
|---|
| 29 | /* *INDENT-OFF* */ // clang-format off | 
|---|
| 30 | static const struct { | 
|---|
| 31 | Uint32       keysym; | 
|---|
| 32 | SDL_Scancode scancode; | 
|---|
| 33 | } KeySymToSDLScancode[] = { | 
|---|
| 34 | { 0xFF9C, SDL_SCANCODE_KP_1 },  // XK_KP_End | 
|---|
| 35 | { 0xFF99, SDL_SCANCODE_KP_2 },  // XK_KP_Down | 
|---|
| 36 | { 0xFF9B, SDL_SCANCODE_KP_3 },  // XK_KP_Next | 
|---|
| 37 | { 0xFF96, SDL_SCANCODE_KP_4 },  // XK_KP_Left | 
|---|
| 38 | { 0xFF9D, SDL_SCANCODE_KP_5 },  // XK_KP_Begin | 
|---|
| 39 | { 0xFF98, SDL_SCANCODE_KP_6 },  // XK_KP_Right | 
|---|
| 40 | { 0xFF95, SDL_SCANCODE_KP_7 },  // XK_KP_Home | 
|---|
| 41 | { 0xFF97, SDL_SCANCODE_KP_8 },  // XK_KP_Up | 
|---|
| 42 | { 0xFF9A, SDL_SCANCODE_KP_9 },  // XK_KP_Prior | 
|---|
| 43 | { 0xFF9E, SDL_SCANCODE_KP_0 },  // XK_KP_Insert | 
|---|
| 44 | { 0xFF9F, SDL_SCANCODE_KP_PERIOD },  // XK_KP_Delete | 
|---|
| 45 | { 0xFF62, SDL_SCANCODE_EXECUTE },  // XK_Execute | 
|---|
| 46 | { 0xFFEE, SDL_SCANCODE_APPLICATION },  // XK_Hyper_R | 
|---|
| 47 | { 0xFE03, SDL_SCANCODE_RALT },  // XK_ISO_Level3_Shift | 
|---|
| 48 | { 0xFE20, SDL_SCANCODE_TAB },  // XK_ISO_Left_Tab | 
|---|
| 49 | { 0xFFEB, SDL_SCANCODE_LGUI },  // XK_Super_L | 
|---|
| 50 | { 0xFFEC, SDL_SCANCODE_RGUI },  // XK_Super_R | 
|---|
| 51 | { 0xFF7E, SDL_SCANCODE_MODE },  // XK_Mode_switch | 
|---|
| 52 | { 0x1008FF65, SDL_SCANCODE_MENU },  // XF86MenuKB | 
|---|
| 53 | { 0x1008FF81, SDL_SCANCODE_F13 },   // XF86Tools | 
|---|
| 54 | { 0x1008FF45, SDL_SCANCODE_F14 },   // XF86Launch5 | 
|---|
| 55 | { 0x1008FF46, SDL_SCANCODE_F15 },   // XF86Launch6 | 
|---|
| 56 | { 0x1008FF47, SDL_SCANCODE_F16 },   // XF86Launch7 | 
|---|
| 57 | { 0x1008FF48, SDL_SCANCODE_F17 },   // XF86Launch8 | 
|---|
| 58 | { 0x1008FF49, SDL_SCANCODE_F18 },   // XF86Launch9 | 
|---|
| 59 | }; | 
|---|
| 60 |  | 
|---|
| 61 | // This is a mapping from X keysym to Linux keycode | 
|---|
| 62 | static const Uint32 LinuxKeycodeKeysyms[] = { | 
|---|
| 63 | /*   0, 0x000 */    0x0, // NoSymbol | 
|---|
| 64 | /*   1, 0x001 */    0xFF1B, // Escape | 
|---|
| 65 | /*   2, 0x002 */    0x31, // 1 | 
|---|
| 66 | /*   3, 0x003 */    0x32, // 2 | 
|---|
| 67 | /*   4, 0x004 */    0x33, // 3 | 
|---|
| 68 | /*   5, 0x005 */    0x34, // 4 | 
|---|
| 69 | /*   6, 0x006 */    0x35, // 5 | 
|---|
| 70 | /*   7, 0x007 */    0x36, // 6 | 
|---|
| 71 | /*   8, 0x008 */    0x37, // 7 | 
|---|
| 72 | /*   9, 0x009 */    0x38, // 8 | 
|---|
| 73 | /*  10, 0x00a */    0x39, // 9 | 
|---|
| 74 | /*  11, 0x00b */    0x30, // 0 | 
|---|
| 75 | /*  12, 0x00c */    0x2D, // minus | 
|---|
| 76 | /*  13, 0x00d */    0x3D, // equal | 
|---|
| 77 | /*  14, 0x00e */    0xFF08, // BackSpace | 
|---|
| 78 | /*  15, 0x00f */    0xFF09, // Tab | 
|---|
| 79 | /*  16, 0x010 */    0x71, // q | 
|---|
| 80 | /*  17, 0x011 */    0x77, // w | 
|---|
| 81 | /*  18, 0x012 */    0x65, // e | 
|---|
| 82 | /*  19, 0x013 */    0x72, // r | 
|---|
| 83 | /*  20, 0x014 */    0x74, // t | 
|---|
| 84 | /*  21, 0x015 */    0x79, // y | 
|---|
| 85 | /*  22, 0x016 */    0x75, // u | 
|---|
| 86 | /*  23, 0x017 */    0x69, // i | 
|---|
| 87 | /*  24, 0x018 */    0x6F, // o | 
|---|
| 88 | /*  25, 0x019 */    0x70, // p | 
|---|
| 89 | /*  26, 0x01a */    0x5B, // bracketleft | 
|---|
| 90 | /*  27, 0x01b */    0x5D, // bracketright | 
|---|
| 91 | /*  28, 0x01c */    0xFF0D, // Return | 
|---|
| 92 | /*  29, 0x01d */    0xFFE3, // Control_L | 
|---|
| 93 | /*  30, 0x01e */    0x61, // a | 
|---|
| 94 | /*  31, 0x01f */    0x73, // s | 
|---|
| 95 | /*  32, 0x020 */    0x64, // d | 
|---|
| 96 | /*  33, 0x021 */    0x66, // f | 
|---|
| 97 | /*  34, 0x022 */    0x67, // g | 
|---|
| 98 | /*  35, 0x023 */    0x68, // h | 
|---|
| 99 | /*  36, 0x024 */    0x6A, // j | 
|---|
| 100 | /*  37, 0x025 */    0x6B, // k | 
|---|
| 101 | /*  38, 0x026 */    0x6C, // l | 
|---|
| 102 | /*  39, 0x027 */    0x3B, // semicolon | 
|---|
| 103 | /*  40, 0x028 */    0x27, // apostrophe | 
|---|
| 104 | /*  41, 0x029 */    0x60, // grave | 
|---|
| 105 | /*  42, 0x02a */    0xFFE1, // Shift_L | 
|---|
| 106 | /*  43, 0x02b */    0x5C, // backslash | 
|---|
| 107 | /*  44, 0x02c */    0x7A, // z | 
|---|
| 108 | /*  45, 0x02d */    0x78, // x | 
|---|
| 109 | /*  46, 0x02e */    0x63, // c | 
|---|
| 110 | /*  47, 0x02f */    0x76, // v | 
|---|
| 111 | /*  48, 0x030 */    0x62, // b | 
|---|
| 112 | /*  49, 0x031 */    0x6E, // n | 
|---|
| 113 | /*  50, 0x032 */    0x6D, // m | 
|---|
| 114 | /*  51, 0x033 */    0x2C, // comma | 
|---|
| 115 | /*  52, 0x034 */    0x2E, // period | 
|---|
| 116 | /*  53, 0x035 */    0x2F, // slash | 
|---|
| 117 | /*  54, 0x036 */    0xFFE2, // Shift_R | 
|---|
| 118 | /*  55, 0x037 */    0xFFAA, // KP_Multiply | 
|---|
| 119 | /*  56, 0x038 */    0xFFE9, // Alt_L | 
|---|
| 120 | /*  57, 0x039 */    0x20, // space | 
|---|
| 121 | /*  58, 0x03a */    0xFFE5, // Caps_Lock | 
|---|
| 122 | /*  59, 0x03b */    0xFFBE, // F1 | 
|---|
| 123 | /*  60, 0x03c */    0xFFBF, // F2 | 
|---|
| 124 | /*  61, 0x03d */    0xFFC0, // F3 | 
|---|
| 125 | /*  62, 0x03e */    0xFFC1, // F4 | 
|---|
| 126 | /*  63, 0x03f */    0xFFC2, // F5 | 
|---|
| 127 | /*  64, 0x040 */    0xFFC3, // F6 | 
|---|
| 128 | /*  65, 0x041 */    0xFFC4, // F7 | 
|---|
| 129 | /*  66, 0x042 */    0xFFC5, // F8 | 
|---|
| 130 | /*  67, 0x043 */    0xFFC6, // F9 | 
|---|
| 131 | /*  68, 0x044 */    0xFFC7, // F10 | 
|---|
| 132 | /*  69, 0x045 */    0xFF7F, // Num_Lock | 
|---|
| 133 | /*  70, 0x046 */    0xFF14, // Scroll_Lock | 
|---|
| 134 | /*  71, 0x047 */    0xFFB7, // KP_7 | 
|---|
| 135 | /*  72, 0x048 */    0XFFB8, // KP_8 | 
|---|
| 136 | /*  73, 0x049 */    0XFFB9, // KP_9 | 
|---|
| 137 | /*  74, 0x04a */    0xFFAD, // KP_Subtract | 
|---|
| 138 | /*  75, 0x04b */    0xFFB4, // KP_4 | 
|---|
| 139 | /*  76, 0x04c */    0xFFB5, // KP_5 | 
|---|
| 140 | /*  77, 0x04d */    0xFFB6, // KP_6 | 
|---|
| 141 | /*  78, 0x04e */    0xFFAB, // KP_Add | 
|---|
| 142 | /*  79, 0x04f */    0xFFB1, // KP_1 | 
|---|
| 143 | /*  80, 0x050 */    0xFFB2, // KP_2 | 
|---|
| 144 | /*  81, 0x051 */    0xFFB3, // KP_3 | 
|---|
| 145 | /*  82, 0x052 */    0xFFB0, // KP_0 | 
|---|
| 146 | /*  83, 0x053 */    0xFFAE, // KP_Decimal | 
|---|
| 147 | /*  84, 0x054 */    0x0, // NoSymbol | 
|---|
| 148 | /*  85, 0x055 */    0x0, // NoSymbol | 
|---|
| 149 | /*  86, 0x056 */    0x3C, // less | 
|---|
| 150 | /*  87, 0x057 */    0xFFC8, // F11 | 
|---|
| 151 | /*  88, 0x058 */    0xFFC9, // F12 | 
|---|
| 152 | /*  89, 0x059 */    0x0, // NoSymbol | 
|---|
| 153 | /*  90, 0x05a */    0xFF26, // Katakana | 
|---|
| 154 | /*  91, 0x05b */    0xFF25, // Hiragana | 
|---|
| 155 | /*  92, 0x05c */    0xFF23, // Henkan_Mode | 
|---|
| 156 | /*  93, 0x05d */    0xFF27, // Hiragana_Katakana | 
|---|
| 157 | /*  94, 0x05e */    0xFF22, // Muhenkan | 
|---|
| 158 | /*  95, 0x05f */    0x0, // NoSymbol | 
|---|
| 159 | /*  96, 0x060 */    0xFF8D, // KP_Enter | 
|---|
| 160 | /*  97, 0x061 */    0xFFE4, // Control_R | 
|---|
| 161 | /*  98, 0x062 */    0xFFAF, // KP_Divide | 
|---|
| 162 | /*  99, 0x063 */    0xFF15, // Sys_Req | 
|---|
| 163 | /* 100, 0x064 */    0xFFEA, // Alt_R | 
|---|
| 164 | /* 101, 0x065 */    0xFF0A, // Linefeed | 
|---|
| 165 | /* 102, 0x066 */    0xFF50, // Home | 
|---|
| 166 | /* 103, 0x067 */    0xFF52, // Up | 
|---|
| 167 | /* 104, 0x068 */    0xFF55, // Prior | 
|---|
| 168 | /* 105, 0x069 */    0xFF51, // Left | 
|---|
| 169 | /* 106, 0x06a */    0xFF53, // Right | 
|---|
| 170 | /* 107, 0x06b */    0xFF57, // End | 
|---|
| 171 | /* 108, 0x06c */    0xFF54, // Down | 
|---|
| 172 | /* 109, 0x06d */    0xFF56, // Next | 
|---|
| 173 | /* 110, 0x06e */    0xFF63, // Insert | 
|---|
| 174 | /* 111, 0x06f */    0xFFFF, // Delete | 
|---|
| 175 | /* 112, 0x070 */    0x0, // NoSymbol | 
|---|
| 176 | /* 113, 0x071 */    0x1008FF12, // XF86AudioMute | 
|---|
| 177 | /* 114, 0x072 */    0x1008FF11, // XF86AudioLowerVolume | 
|---|
| 178 | /* 115, 0x073 */    0x1008FF13, // XF86AudioRaiseVolume | 
|---|
| 179 | /* 116, 0x074 */    0x1008FF2A, // XF86PowerOff | 
|---|
| 180 | /* 117, 0x075 */    0xFFBD, // KP_Equal | 
|---|
| 181 | /* 118, 0x076 */    0xB1, // plusminus | 
|---|
| 182 | /* 119, 0x077 */    0xFF13, // Pause | 
|---|
| 183 | /* 120, 0x078 */    0x1008FF4A, // XF86LaunchA | 
|---|
| 184 | /* 121, 0x079 */    0xFFAC, // KP_Separator | 
|---|
| 185 | /* 122, 0x07a */    0xFF31, // Hangul | 
|---|
| 186 | /* 123, 0x07b */    0xFF34, // Hangul_Hanja | 
|---|
| 187 | /* 124, 0x07c */    0x0, // NoSymbol | 
|---|
| 188 | /* 125, 0x07d */    0xFFE7, // Meta_L | 
|---|
| 189 | /* 126, 0x07e */    0xFFE8, // Meta_R | 
|---|
| 190 | /* 127, 0x07f */    0xFF67, // Menu | 
|---|
| 191 | /* 128, 0x080 */    0x00, // NoSymbol | 
|---|
| 192 | /* 129, 0x081 */    0xFF66, // Redo | 
|---|
| 193 | /* 130, 0x082 */    0x1005FF70, // SunProps | 
|---|
| 194 | /* 131, 0x083 */    0xFF65, // Undo | 
|---|
| 195 | /* 132, 0x084 */    0x1005FF71, // SunFront | 
|---|
| 196 | /* 133, 0x085 */    0x1008FF57, // XF86Copy | 
|---|
| 197 | /* 134, 0x086 */    0x1008FF6B, // XF86Open | 
|---|
| 198 | /* 135, 0x087 */    0x1008FF6D, // XF86Paste | 
|---|
| 199 | /* 136, 0x088 */    0xFF68, // Find | 
|---|
| 200 | /* 137, 0x089 */    0x1008FF58, // XF86Cut | 
|---|
| 201 | /* 138, 0x08a */    0xFF6A, // Help | 
|---|
| 202 | /* 139, 0x08b */    0xFF67, // Menu | 
|---|
| 203 | /* 140, 0x08c */    0x1008FF1D, // XF86Calculator | 
|---|
| 204 | /* 141, 0x08d */    0x0, // NoSymbol | 
|---|
| 205 | /* 142, 0x08e */    0x1008FF2F, // XF86Sleep | 
|---|
| 206 | /* 143, 0x08f */    0x1008FF2B, // XF86WakeUp | 
|---|
| 207 | /* 144, 0x090 */    0x1008FF5D, // XF86Explorer | 
|---|
| 208 | /* 145, 0x091 */    0x1008FF7B, // XF86Send | 
|---|
| 209 | /* 146, 0x092 */    0x0, // NoSymbol | 
|---|
| 210 | /* 147, 0x093 */    0x1008FF8A, // XF86Xfer | 
|---|
| 211 | /* 148, 0x094 */    0x1008FF41, // XF86Launch1 | 
|---|
| 212 | /* 149, 0x095 */    0x1008FF42, // XF86Launch2 | 
|---|
| 213 | /* 150, 0x096 */    0x1008FF2E, // XF86WWW | 
|---|
| 214 | /* 151, 0x097 */    0x1008FF5A, // XF86DOS | 
|---|
| 215 | /* 152, 0x098 */    0x1008FF2D, // XF86ScreenSaver | 
|---|
| 216 | /* 153, 0x099 */    0x1008FF74, // XF86RotateWindows | 
|---|
| 217 | /* 154, 0x09a */    0x1008FF7F, // XF86TaskPane | 
|---|
| 218 | /* 155, 0x09b */    0x1008FF19, // XF86Mail | 
|---|
| 219 | /* 156, 0x09c */    0x1008FF30, // XF86Favorites | 
|---|
| 220 | /* 157, 0x09d */    0x1008FF33, // XF86MyComputer | 
|---|
| 221 | /* 158, 0x09e */    0x1008FF26, // XF86Back | 
|---|
| 222 | /* 159, 0x09f */    0x1008FF27, // XF86Forward | 
|---|
| 223 | /* 160, 0x0a0 */    0x0, // NoSymbol | 
|---|
| 224 | /* 161, 0x0a1 */    0x1008FF2C, // XF86Eject | 
|---|
| 225 | /* 162, 0x0a2 */    0x1008FF2C, // XF86Eject | 
|---|
| 226 | /* 163, 0x0a3 */    0x1008FF17, // XF86AudioNext | 
|---|
| 227 | /* 164, 0x0a4 */    0x1008FF14, // XF86AudioPlay | 
|---|
| 228 | /* 165, 0x0a5 */    0x1008FF16, // XF86AudioPrev | 
|---|
| 229 | /* 166, 0x0a6 */    0x1008FF15, // XF86AudioStop | 
|---|
| 230 | /* 167, 0x0a7 */    0x1008FF1C, // XF86AudioRecord | 
|---|
| 231 | /* 168, 0x0a8 */    0x1008FF3E, // XF86AudioRewind | 
|---|
| 232 | /* 169, 0x0a9 */    0x1008FF6E, // XF86Phone | 
|---|
| 233 | /* 170, 0x0aa */    0x0, // NoSymbol | 
|---|
| 234 | /* 171, 0x0ab */    0x1008FF81, // XF86Tools | 
|---|
| 235 | /* 172, 0x0ac */    0x1008FF18, // XF86HomePage | 
|---|
| 236 | /* 173, 0x0ad */    0x1008FF73, // XF86Reload | 
|---|
| 237 | /* 174, 0x0ae */    0x1008FF56, // XF86Close | 
|---|
| 238 | /* 175, 0x0af */    0x0, // NoSymbol | 
|---|
| 239 | /* 176, 0x0b0 */    0x0, // NoSymbol | 
|---|
| 240 | /* 177, 0x0b1 */    0x1008FF78, // XF86ScrollUp | 
|---|
| 241 | /* 178, 0x0b2 */    0x1008FF79, // XF86ScrollDown | 
|---|
| 242 | /* 179, 0x0b3 */    0x0, // NoSymbol | 
|---|
| 243 | /* 180, 0x0b4 */    0x0, // NoSymbol | 
|---|
| 244 | /* 181, 0x0b5 */    0x1008FF68, // XF86New | 
|---|
| 245 | /* 182, 0x0b6 */    0xFF66, // Redo | 
|---|
| 246 | /* 183, 0x0b7 */    0xFFCA, // F13 | 
|---|
| 247 | /* 184, 0x0b8 */    0xFFCB, // F14 | 
|---|
| 248 | /* 185, 0x0b9 */    0xFFCC, // F15 | 
|---|
| 249 | /* 186, 0x0ba */    0xFFCD, // F16 | 
|---|
| 250 | /* 187, 0x0bb */    0xFFCE, // F17 | 
|---|
| 251 | /* 188, 0x0bc */    0xFFCF, // F18 | 
|---|
| 252 | /* 189, 0x0bd */    0xFFD0, // F19 | 
|---|
| 253 | /* 190, 0x0be */    0xFFD1, // F20 | 
|---|
| 254 | /* 191, 0x0bf */    0xFFD2, // F21 | 
|---|
| 255 | /* 192, 0x0c0 */    0xFFD3, // F22 | 
|---|
| 256 | /* 193, 0x0c1 */    0xFFD4, // F23 | 
|---|
| 257 | /* 194, 0x0c2 */    0xFFD5, // F24 | 
|---|
| 258 | /* 195, 0x0c3 */    0x0, // NoSymbol | 
|---|
| 259 | /* 196, 0x0c4 */    0x0, // NoSymbol | 
|---|
| 260 | /* 197, 0x0c5 */    0x0, // NoSymbol | 
|---|
| 261 | /* 198, 0x0c6 */    0x0, // NoSymbol | 
|---|
| 262 | /* 199, 0x0c7 */    0x0, // NoSymbol | 
|---|
| 263 | /* 200, 0x0c8 */    0x1008FF14, // XF86AudioPlay | 
|---|
| 264 | /* 201, 0x0c9 */    0x1008FF31, // XF86AudioPause | 
|---|
| 265 | /* 202, 0x0ca */    0x1008FF43, // XF86Launch3 | 
|---|
| 266 | /* 203, 0x0cb */    0x1008FF44, // XF86Launch4 | 
|---|
| 267 | /* 204, 0x0cc */    0x1008FF4B, // XF86LaunchB | 
|---|
| 268 | /* 205, 0x0cd */    0x1008FFA7, // XF86Suspend | 
|---|
| 269 | /* 206, 0x0ce */    0x1008FF56, // XF86Close | 
|---|
| 270 | /* 207, 0x0cf */    0x1008FF14, // XF86AudioPlay | 
|---|
| 271 | /* 208, 0x0d0 */    0x1008FF97, // XF86AudioForward | 
|---|
| 272 | /* 209, 0x0d1 */    0x0, // NoSymbol | 
|---|
| 273 | /* 210, 0x0d2 */    0xFF61, // Print | 
|---|
| 274 | /* 211, 0x0d3 */    0x0, // NoSymbol | 
|---|
| 275 | /* 212, 0x0d4 */    0x1008FF8F, // XF86WebCam | 
|---|
| 276 | /* 213, 0x0d5 */    0x1008FFB6, // XF86AudioPreset | 
|---|
| 277 | /* 214, 0x0d6 */    0x0, // NoSymbol | 
|---|
| 278 | /* 215, 0x0d7 */    0x1008FF19, // XF86Mail | 
|---|
| 279 | /* 216, 0x0d8 */    0x1008FF8E, // XF86Messenger | 
|---|
| 280 | /* 217, 0x0d9 */    0x1008FF1B, // XF86Search | 
|---|
| 281 | /* 218, 0x0da */    0x1008FF5F, // XF86Go | 
|---|
| 282 | /* 219, 0x0db */    0x1008FF3C, // XF86Finance | 
|---|
| 283 | /* 220, 0x0dc */    0x1008FF5E, // XF86Game | 
|---|
| 284 | /* 221, 0x0dd */    0x1008FF36, // XF86Shop | 
|---|
| 285 | /* 222, 0x0de */    0x0, // NoSymbol | 
|---|
| 286 | /* 223, 0x0df */    0xFF69, // Cancel | 
|---|
| 287 | /* 224, 0x0e0 */    0x1008FF03, // XF86MonBrightnessDown | 
|---|
| 288 | /* 225, 0x0e1 */    0x1008FF02, // XF86MonBrightnessUp | 
|---|
| 289 | /* 226, 0x0e2 */    0x1008FF32, // XF86AudioMedia | 
|---|
| 290 | /* 227, 0x0e3 */    0x1008FF59, // XF86Display | 
|---|
| 291 | /* 228, 0x0e4 */    0x1008FF04, // XF86KbdLightOnOff | 
|---|
| 292 | /* 229, 0x0e5 */    0x1008FF06, // XF86KbdBrightnessDown | 
|---|
| 293 | /* 230, 0x0e6 */    0x1008FF05, // XF86KbdBrightnessUp | 
|---|
| 294 | /* 231, 0x0e7 */    0x1008FF7B, // XF86Send | 
|---|
| 295 | /* 232, 0x0e8 */    0x1008FF72, // XF86Reply | 
|---|
| 296 | /* 233, 0x0e9 */    0x1008FF90, // XF86MailForward | 
|---|
| 297 | /* 234, 0x0ea */    0x1008FF77, // XF86Save | 
|---|
| 298 | /* 235, 0x0eb */    0x1008FF5B, // XF86Documents | 
|---|
| 299 | /* 236, 0x0ec */    0x1008FF93, // XF86Battery | 
|---|
| 300 | /* 237, 0x0ed */    0x1008FF94, // XF86Bluetooth | 
|---|
| 301 | /* 238, 0x0ee */    0x1008FF95, // XF86WLAN | 
|---|
| 302 | /* 239, 0x0ef */    0x1008FF96, // XF86UWB | 
|---|
| 303 | /* 240, 0x0f0 */    0x0, // NoSymbol | 
|---|
| 304 | /* 241, 0x0f1 */    0x1008FE22, // XF86Next_VMode | 
|---|
| 305 | /* 242, 0x0f2 */    0x1008FE23, // XF86Prev_VMode | 
|---|
| 306 | /* 243, 0x0f3 */    0x1008FF07, // XF86MonBrightnessCycle | 
|---|
| 307 | /* 244, 0x0f4 */    0x100810F4, // XF86BrightnessAuto | 
|---|
| 308 | /* 245, 0x0f5 */    0x100810F5, // XF86DisplayOff | 
|---|
| 309 | /* 246, 0x0f6 */    0x1008FFB4, // XF86WWAN | 
|---|
| 310 | /* 247, 0x0f7 */    0x1008FFB5, // XF86RFKill | 
|---|
| 311 | }; | 
|---|
| 312 |  | 
|---|
| 313 | #if 0 // Here is a script to generate the ExtendedLinuxKeycodeKeysyms table | 
|---|
| 314 | #!/bin/bash | 
|---|
| 315 |  | 
|---|
| 316 | function process_line | 
|---|
| 317 | { | 
|---|
| 318 | sym=$(echo "$1"| awk '{print $3}') | 
|---|
| 319 | code=$(echo "$1"| sed 's,.*_EVDEVK(\(0x[0-9A-Fa-f]*\)).*,\1,') | 
|---|
| 320 | value=$(grep -E "#define ${sym}\s"-R /usr/include/X11 | awk '{print $3}') | 
|---|
| 321 | printf "    { 0x%.8X, 0x%.3x },    /* $sym */\n"$value $code | 
|---|
| 322 | } | 
|---|
| 323 |  | 
|---|
| 324 | grep -F "/* Use: "/usr/include/xkbcommon/xkbcommon-keysyms.h | grep -F _EVDEVK | while read line; do | 
|---|
| 325 | process_line "$line" | 
|---|
| 326 | done | 
|---|
| 327 | #endif | 
|---|
| 328 |  | 
|---|
| 329 | static const struct { | 
|---|
| 330 | Uint32 keysym; | 
|---|
| 331 | int linux_keycode; | 
|---|
| 332 | } ExtendedLinuxKeycodeKeysyms[] = { | 
|---|
| 333 | { 0x1008FF2C, 0x0a2 },    // XF86XK_Eject | 
|---|
| 334 | { 0x1008FF68, 0x0b5 },    // XF86XK_New | 
|---|
| 335 | { 0x0000FF66, 0x0b6 },    // XK_Redo | 
|---|
| 336 | { 0x1008FF4B, 0x0cc },    // XF86XK_LaunchB | 
|---|
| 337 | { 0x1008FF59, 0x0e3 },    // XF86XK_Display | 
|---|
| 338 | { 0x1008FF04, 0x0e4 },    // XF86XK_KbdLightOnOff | 
|---|
| 339 | { 0x1008FF06, 0x0e5 },    // XF86XK_KbdBrightnessDown | 
|---|
| 340 | { 0x1008FF05, 0x0e6 },    // XF86XK_KbdBrightnessUp | 
|---|
| 341 | { 0x1008FF7B, 0x0e7 },    // XF86XK_Send | 
|---|
| 342 | { 0x1008FF72, 0x0e8 },    // XF86XK_Reply | 
|---|
| 343 | { 0x1008FF90, 0x0e9 },    // XF86XK_MailForward | 
|---|
| 344 | { 0x1008FF77, 0x0ea },    // XF86XK_Save | 
|---|
| 345 | { 0x1008FF5B, 0x0eb },    // XF86XK_Documents | 
|---|
| 346 | { 0x1008FF93, 0x0ec },    // XF86XK_Battery | 
|---|
| 347 | { 0x1008FF94, 0x0ed },    // XF86XK_Bluetooth | 
|---|
| 348 | { 0x1008FF95, 0x0ee },    // XF86XK_WLAN | 
|---|
| 349 | { 0x1008FF96, 0x0ef },    // XF86XK_UWB | 
|---|
| 350 | { 0x1008FE22, 0x0f1 },    // XF86XK_Next_VMode | 
|---|
| 351 | { 0x1008FE23, 0x0f2 },    // XF86XK_Prev_VMode | 
|---|
| 352 | { 0x1008FF07, 0x0f3 },    // XF86XK_MonBrightnessCycle | 
|---|
| 353 | { 0x1008FFB4, 0x0f6 },    // XF86XK_WWAN | 
|---|
| 354 | { 0x1008FFB5, 0x0f7 },    // XF86XK_RFKill | 
|---|
| 355 | { 0x1008FFB2, 0x0f8 },    // XF86XK_AudioMicMute | 
|---|
| 356 | { 0x1008FF9C, 0x173 },    // XF86XK_CycleAngle | 
|---|
| 357 | { 0x1008FFB8, 0x174 },    // XF86XK_FullScreen | 
|---|
| 358 | { 0x1008FF87, 0x189 },    // XF86XK_Video | 
|---|
| 359 | { 0x1008FF20, 0x18d },    // XF86XK_Calendar | 
|---|
| 360 | { 0x1008FF99, 0x19a },    // XF86XK_AudioRandomPlay | 
|---|
| 361 | { 0x1008FF5E, 0x1a1 },    // XF86XK_Game | 
|---|
| 362 | { 0x1008FF8B, 0x1a2 },    // XF86XK_ZoomIn | 
|---|
| 363 | { 0x1008FF8C, 0x1a3 },    // XF86XK_ZoomOut | 
|---|
| 364 | { 0x1008FF89, 0x1a5 },    // XF86XK_Word | 
|---|
| 365 | { 0x1008FF5C, 0x1a7 },    // XF86XK_Excel | 
|---|
| 366 | { 0x1008FF69, 0x1ab },    // XF86XK_News | 
|---|
| 367 | { 0x1008FF8E, 0x1ae },    // XF86XK_Messenger | 
|---|
| 368 | { 0x1008FF61, 0x1b1 },    // XF86XK_LogOff | 
|---|
| 369 | { 0x00000024, 0x1b2 },    // XK_dollar | 
|---|
| 370 | { 0x000020AC, 0x1b3 },    // XK_EuroSign | 
|---|
| 371 | { 0x1008FF9D, 0x1b4 },    // XF86XK_FrameBack | 
|---|
| 372 | { 0x1008FF9E, 0x1b5 },    // XF86XK_FrameForward | 
|---|
| 373 | { 0x0000FFF1, 0x1f1 },    // XK_braille_dot_1 | 
|---|
| 374 | { 0x0000FFF2, 0x1f2 },    // XK_braille_dot_2 | 
|---|
| 375 | { 0x0000FFF3, 0x1f3 },    // XK_braille_dot_3 | 
|---|
| 376 | { 0x0000FFF4, 0x1f4 },    // XK_braille_dot_4 | 
|---|
| 377 | { 0x0000FFF5, 0x1f5 },    // XK_braille_dot_5 | 
|---|
| 378 | { 0x0000FFF6, 0x1f6 },    // XK_braille_dot_6 | 
|---|
| 379 | { 0x0000FFF7, 0x1f7 },    // XK_braille_dot_7 | 
|---|
| 380 | { 0x0000FFF8, 0x1f8 },    // XK_braille_dot_8 | 
|---|
| 381 | { 0x0000FFF9, 0x1f9 },    // XK_braille_dot_9 | 
|---|
| 382 | { 0x0000FFF1, 0x1fa },    // XK_braille_dot_1 | 
|---|
| 383 | { 0x1008FFA9, 0x212 },    // XF86XK_TouchpadToggle | 
|---|
| 384 | { 0x1008FFB0, 0x213 },    // XF86XK_TouchpadOn | 
|---|
| 385 | { 0x1008FFB1, 0x214 },    // XF86XK_TouchpadOff | 
|---|
| 386 | { 0x1008FFB7, 0x231 },    // XF86XK_RotationLockToggle | 
|---|
| 387 | { 0x0000FE08, 0x248 },    // XK_ISO_Next_Group | 
|---|
| 388 | }; | 
|---|
| 389 | /* *INDENT-ON* */ // clang-format on | 
|---|
| 390 |  | 
|---|
| 391 | SDL_Scancode SDL_GetScancodeFromKeySym(Uint32 keysym, Uint32 keycode) | 
|---|
| 392 | { | 
|---|
| 393 | int i; | 
|---|
| 394 | Uint32 linux_keycode = 0; | 
|---|
| 395 |  | 
|---|
| 396 | // First check our custom list | 
|---|
| 397 | for (i = 0; i < SDL_arraysize(KeySymToSDLScancode); ++i) { | 
|---|
| 398 | if (keysym == KeySymToSDLScancode[i].keysym) { | 
|---|
| 399 | return KeySymToSDLScancode[i].scancode; | 
|---|
| 400 | } | 
|---|
| 401 | } | 
|---|
| 402 |  | 
|---|
| 403 | if (keysym >= 0x41 && keysym <= 0x5a) { | 
|---|
| 404 | // Normalize alphabetic keysyms to the lowercase form | 
|---|
| 405 | keysym += 0x20; | 
|---|
| 406 | } else if (keysym >= 0x10081000 && keysym <= 0x10081FFF) { | 
|---|
| 407 | /* The rest of the keysyms map to Linux keycodes, so use that mapping | 
|---|
| 408 | * Per xkbcommon-keysyms.h, this is actually a linux keycode. | 
|---|
| 409 | */ | 
|---|
| 410 | linux_keycode = (keysym - 0x10081000); | 
|---|
| 411 | } | 
|---|
| 412 | if (!linux_keycode) { | 
|---|
| 413 | // See if this keysym is an exact match in our table | 
|---|
| 414 | i = (keycode - 8); | 
|---|
| 415 | if (i >= 0 && i < SDL_arraysize(LinuxKeycodeKeysyms) && keysym == LinuxKeycodeKeysyms[i]) { | 
|---|
| 416 | linux_keycode = i; | 
|---|
| 417 | } else { | 
|---|
| 418 | // Scan the table for this keysym | 
|---|
| 419 | for (i = 0; i < SDL_arraysize(LinuxKeycodeKeysyms); ++i) { | 
|---|
| 420 | if (keysym == LinuxKeycodeKeysyms[i]) { | 
|---|
| 421 | linux_keycode = i; | 
|---|
| 422 | break; | 
|---|
| 423 | } | 
|---|
| 424 | } | 
|---|
| 425 | } | 
|---|
| 426 | } | 
|---|
| 427 | if (!linux_keycode) { | 
|---|
| 428 | // Scan the extended table for this keysym | 
|---|
| 429 | for (i = 0; i < SDL_arraysize(ExtendedLinuxKeycodeKeysyms); ++i) { | 
|---|
| 430 | if (keysym == ExtendedLinuxKeycodeKeysyms[i].keysym) { | 
|---|
| 431 | linux_keycode = ExtendedLinuxKeycodeKeysyms[i].linux_keycode; | 
|---|
| 432 | break; | 
|---|
| 433 | } | 
|---|
| 434 | } | 
|---|
| 435 | } | 
|---|
| 436 | return SDL_GetScancodeFromTable(SDL_SCANCODE_TABLE_LINUX, linux_keycode); | 
|---|
| 437 | } | 
|---|
| 438 |  | 
|---|
| 439 | #endif // SDL_VIDEO_DRIVER_WAYLAND | 
|---|
| 440 |  | 
|---|