Why can't SDL 2.0 handle custom keyboard mappings?

I apologize if this message sounds exasperated. I spent the entire evening
porting my game from GLFW to SDL 2.0, only to find out that it does not
accept my keyboard layout. Like many other Linux users, I’ve used xmodmap
to remap a few keys on my keyboard (home/page down and end/page up,
specifically). However, when trying to run my SDL app, it says

Keyboard layout unknown, please send the following to the SDL mailing list (
sdl at libsdl.org):

and when I press any other key, it usually says something like

The key you just pressed is not recognized by SDL. To help get this fixed,
please report this to the SDL mailing list X11 KeyCode 38
(30), X11 KeySym 0x61 (a).

and the key does nothing. I was quite surprised by this, especially since
remapping only four keys causes SDL to choke on the other keys, and since
every other game support library has no problem with my keyboard settings.
Removing my xmodmap bindings makes SDL happy, but that is not a solution to
the problem, because it may still cause trouble for my game’s userbase. If
there is not a good solution, I’ll have to give up on using SDL, which is a
shame because until now it seemed to have the best combination of
configurability and portability.

The entire message SDL prints on initialization is as follows:

Keyboard layout unknown, please send the following to the SDL mailing list (
sdl at libsdl.org):
code = 1, sym = 0xFF1B (Escape) scancode = 41 (Escape)
code = 2, sym = 0x31 (1) scancode = 40 (Return)
code = 3, sym = 0x32 (2) scancode = 41 (Escape)
code = 4, sym = 0x33 (3) scancode = 42 (Backspace)
code = 5, sym = 0x34 (4) scancode = 43 (Tab)
code = 6, sym = 0x35 (5) scancode = 44 (Space)
code = 7, sym = 0x36 (6) scancode = 45 (-)
code = 8, sym = 0x37 (7) scancode = 46 (=)
code = 9, sym = 0x38 (8) scancode = 47 ([)
code = 10, sym = 0x39 (9) scancode = 48 (])
code = 11, sym = 0x30 (0) scancode = 39 (0)
code = 12, sym = 0x2D (minus) scancode not found
code = 13, sym = 0x3D (equal) scancode not found
code = 14, sym = 0xFF08 (BackSpace) scancode = 42 (Backspace)
code = 15, sym = 0xFF09 (Tab) scancode = 43 (Tab)
code = 16, sym = 0x71 (q) scancode not found
code = 17, sym = 0x77 (w) scancode not found
code = 18, sym = 0x65 (e) scancode not found
code = 19, sym = 0x72 ® scancode not found
code = 20, sym = 0x74 (t) scancode not found
code = 21, sym = 0x79 (y) scancode not found
code = 22, sym = 0x75 (u) scancode not found
code = 23, sym = 0x69 (i) scancode not found
code = 24, sym = 0x6F (o) scancode not found
code = 25, sym = 0x70 § scancode not found
code = 26, sym = 0x5B (bracketleft) scancode not found
code = 27, sym = 0x5D (bracketright) scancode not found
code = 28, sym = 0xFF0D (Return) scancode = 40 (Return)
code = 29, sym = 0xFFE3 (Control_L) scancode = 224 (Left Ctrl)
code = 30, sym = 0x61 (a) scancode not found
code = 31, sym = 0x73 (s) scancode not found
code = 32, sym = 0x64 (d) scancode not found
code = 33, sym = 0x66 (f) scancode not found
code = 34, sym = 0x67 (g) scancode not found
code = 35, sym = 0x68 (h) scancode not found
code = 36, sym = 0x6A (j) scancode not found
code = 37, sym = 0x6B (k) scancode not found
code = 38, sym = 0x6C (l) scancode not found
code = 39, sym = 0x3B (semicolon) scancode not found
code = 40, sym = 0x27 (apostrophe) scancode not found
code = 41, sym = 0x60 (grave) scancode not found
code = 42, sym = 0xFFE1 (Shift_L) scancode = 225 (Left Shift)
code = 43, sym = 0x5C (backslash) scancode not found
code = 44, sym = 0x7A (z) scancode not found
code = 45, sym = 0x78 (x) scancode not found
code = 46, sym = 0x63 © scancode not found
code = 47, sym = 0x76 (v) scancode not found
code = 48, sym = 0x62 (b) scancode not found
code = 49, sym = 0x6E (n) scancode not found
code = 50, sym = 0x6D (m) scancode not found
code = 51, sym = 0x2C (comma) scancode not found
code = 52, sym = 0x2E (period) scancode not found
code = 53, sym = 0x2F (slash) scancode not found
code = 54, sym = 0xFFE2 (Shift_R) scancode = 229 (Right Shift)
code = 55, sym = 0xFFAA (KP_Multiply) scancode = 85 (Keypad *)
code = 56, sym = 0xFFE9 (Alt_L) scancode = 226 (Left Alt)
code = 57, sym = 0x20 (space) scancode not found
code = 58, sym = 0xFFEB (Super_L) scancode = 227 (Left GUI)
code = 59, sym = 0xFFBE (F1) scancode = 58 (F1)
code = 60, sym = 0xFFBF (F2) scancode = 59 (F2)
code = 61, sym = 0xFFC0 (F3) scancode = 60 (F3)
code = 62, sym = 0xFFC1 (F4) scancode = 61 (F4)
code = 63, sym = 0xFFC2 (F5) scancode = 62 (F5)
code = 64, sym = 0xFFC3 (F6) scancode = 63 (F6)
code = 65, sym = 0xFFC4 (F7) scancode = 64 (F7)
code = 66, sym = 0xFFC5 (F8) scancode = 65 (F8)
code = 67, sym = 0xFFC6 (F9) scancode = 66 (F9)
code = 68, sym = 0xFFC7 (F10) scancode = 67 (F10)
code = 69, sym = 0xFF7F (Num_Lock) scancode = 83 (Numlock)
code = 70, sym = 0xFF14 (Scroll_Lock) scancode = 71 (ScrollLock)
code = 71, sym = 0xFF95 (KP_Home) scancode = 95 (Keypad 7)
code = 72, sym = 0xFF97 (KP_Up) scancode = 96 (Keypad 8)
code = 73, sym = 0xFF9A (KP_Prior) scancode = 97 (Keypad 9)
code = 74, sym = 0xFFAD (KP_Subtract) scancode = 86 (Keypad -)
code = 75, sym = 0xFF96 (KP_Left) scancode = 92 (Keypad 4)
code = 76, sym = 0xFF9D (KP_Begin) scancode = 93 (Keypad 5)
code = 77, sym = 0xFF98 (KP_Right) scancode = 94 (Keypad 6)
code = 78, sym = 0xFFAB (KP_Add) scancode = 87 (Keypad +)
code = 79, sym = 0xFF9C (KP_End) scancode = 89 (Keypad 1)
code = 80, sym = 0xFF99 (KP_Down) scancode = 90 (Keypad 2)
code = 81, sym = 0xFF9B (KP_Next) scancode = 91 (Keypad 3)
code = 82, sym = 0xFF9E (KP_Insert) scancode = 98 (Keypad 0)
code = 83, sym = 0xFF9F (KP_Delete) scancode = 99 (Keypad .)
code = 84, sym = 0xFE03 (ISO_Level3_Shift) scancode not found
code = 86, sym = 0x3C (less) scancode not found
code = 87, sym = 0xFFC8 (F11) scancode = 68 (F11)
code = 88, sym = 0xFFC9 (F12) scancode = 69 (F12)
code = 90, sym = 0xFF26 (Katakana) scancode not found
code = 91, sym = 0xFF25 (Hiragana) scancode not found
code = 92, sym = 0xFF23 (Henkan_Mode) scancode not found
code = 93, sym = 0xFF27 (Hiragana_Katakana) scancode not found
code = 94, sym = 0xFF22 (Muhenkan) scancode not found
code = 96, sym = 0xFF8D (KP_Enter) scancode = 88 (Keypad Enter)
code = 97, sym = 0xFFE4 (Control_R) scancode = 228 (Right Ctrl)
code = 98, sym = 0xFFAF (KP_Divide) scancode = 84 (Keypad /)
code = 99, sym = 0xFF20 (Multi_key) scancode not found
code = 100, sym = 0xFFEA (Alt_R) scancode = 230 (Right Alt)
code = 101, sym = 0xFF0A (Linefeed) scancode not found
code = 102, sym = 0xFF55 (Prior) scancode = 75 (PageUp)
code = 103, sym = 0xFF52 (Up) scancode = 82 (Up)
code = 104, sym = 0xFF50 (Home) scancode = 74 (Home)
code = 105, sym = 0xFF51 (Left) scancode = 80 (Left)
code = 106, sym = 0xFF53 (Right) scancode = 79 (Right)
code = 107, sym = 0xFF56 (Next) scancode = 78 (PageDown)
code = 108, sym = 0xFF54 (Down) scancode = 81 (Down)
code = 109, sym = 0xFF57 (End) scancode = 77 (End)
code = 110, sym = 0xFF63 (Insert) scancode = 73 (Insert)
code = 111, sym = 0xFFFF (Delete) scancode = 76 (Delete)
code = 113, sym = 0x1008FF12 (XF86AudioMute) scancode not found
code = 114, sym = 0x1008FF11 (XF86AudioLowerVolume) scancode not found
code = 115, sym = 0x1008FF13 (XF86AudioRaiseVolume) scancode not found
code = 116, sym = 0x1008FF2A (XF86PowerOff) scancode not found
code = 117, sym = 0xFFBD (KP_Equal) scancode = 103 (Keypad =)
code = 118, sym = 0xB1 (plusminus) scancode not found
code = 119, sym = 0xFF13 (Pause) scancode = 72 (Pause)
code = 120, sym = 0x1008FF4A (XF86LaunchA) scancode not found
code = 121, sym = 0xFFAE (KP_Decimal) scancode = 99 (Keypad .)
code = 122, sym = 0xFF31 (Hangul) scancode not found
code = 123, sym = 0xFF34 (Hangul_Hanja) scancode not found
code = 125, sym = 0xFFEB (Super_L) scancode = 227 (Left GUI)
code = 126, sym = 0xFFEC (Super_R) scancode = 231 (Right GUI)
code = 127, sym = 0xFF67 (Menu) scancode = 118 (Menu)
code = 128, sym = 0xFF69 (Cancel) scancode = 120 (Stop)
code = 129, sym = 0xFF66 (Redo) scancode = 121 (Again)
code = 130, sym = 0x1005FF70 (SunProps) scancode not found
code = 131, sym = 0xFF65 (Undo) scancode = 122 (Undo)
code = 132, sym = 0x1005FF71 (SunFront) scancode not found
code = 133, sym = 0x1008FF57 (XF86Copy) scancode not found
code = 134, sym = 0x1005FF73 (SunOpen) scancode not found
code = 135, sym = 0x1008FF6D (XF86Paste) scancode not found
code = 136, sym = 0xFF68 (Find) scancode = 126 (Find)
code = 137, sym = 0x1008FF58 (XF86Cut) scancode not found
code = 138, sym = 0xFF6A (Help) scancode = 117 (Help)
code = 139, sym = 0x1008FF65 (XF86MenuKB) scancode not found
code = 140, sym = 0x1008FF1D (XF86Calculator) scancode not found
code = 142, sym = 0x1008FF2F (XF86Sleep) scancode not found
code = 143, sym = 0x1008FF2B (XF86WakeUp) scancode not found
code = 144, sym = 0x1008FF5D (XF86Explorer) scancode not found
code = 145, sym = 0x1008FF7B (XF86Send) scancode not found
code = 147, sym = 0x1008FF8A (XF86Xfer) scancode not found
code = 148, sym = 0x1008FF41 (XF86Launch1) scancode not found
code = 149, sym = 0x1008FF42 (XF86Launch2) scancode not found
code = 150, sym = 0x1008FF2E (XF86WWW) scancode not found
code = 151, sym = 0x1008FF5A (XF86DOS) scancode not found
code = 152, sym = 0x1008FF2D (XF86ScreenSaver) scancode not found
code = 154, sym = 0x1008FF74 (XF86RotateWindows) scancode not found
code = 155, sym = 0x1008FF19 (XF86Mail) scancode not found
code = 156, sym = 0x1008FF30 (XF86Favorites) scancode not found
code = 157, sym = 0x1008FF33 (XF86MyComputer) scancode not found
code = 158, sym = 0x1008FF26 (XF86Back) scancode not found
code = 159, sym = 0x1008FF27 (XF86Forward) scancode not found
code = 161, sym = 0x1008FF2C (XF86Eject) scancode not found
code = 162, sym = 0x1008FF2C (XF86Eject) scancode not found
code = 163, sym = 0x1008FF17 (XF86AudioNext) scancode not found
code = 164, sym = 0x1008FF14 (XF86AudioPlay) scancode not found
code = 165, sym = 0x1008FF16 (XF86AudioPrev) scancode not found
code = 166, sym = 0x1008FF15 (XF86AudioStop) scancode not found
code = 167, sym = 0x1008FF1C (XF86AudioRecord) scancode not found
code = 168, sym = 0x1008FF3E (XF86AudioRewind) scancode not found
code = 169, sym = 0x1008FF6E (XF86Phone) scancode not found
code = 171, sym = 0x1008FF81 (XF86Tools) scancode not found
code = 172, sym = 0x1008FF18 (XF86HomePage) scancode not found
code = 173, sym = 0x1008FF73 (XF86Reload) scancode not found
code = 174, sym = 0x1008FF56 (XF86Close) scancode not found
code = 177, sym = 0x1008FF78 (XF86ScrollUp) scancode not found
code = 178, sym = 0x1008FF79 (XF86ScrollDown) scancode not found
code = 179, sym = 0x28 (parenleft) scancode not found
code = 180, sym = 0x29 (parenright) scancode not found
code = 181, sym = 0x1008FF68 (XF86New) scancode not found
code = 182, sym = 0xFF66 (Redo) scancode = 121 (Again)
code = 183, sym = 0x1008FF81 (XF86Tools) scancode not found
code = 184, sym = 0x1008FF45 (XF86Launch5) scancode not found
code = 185, sym = 0x1008FF46 (XF86Launch6) scancode not found
code = 186, sym = 0x1008FF47 (XF86Launch7) scancode not found
code = 187, sym = 0x1008FF48 (XF86Launch8) scancode not found
code = 188, sym = 0x1008FF49 (XF86Launch9) scancode not found
code = 191, sym = 0x1008FFA9 (XF86TouchpadToggle) scancode not found
code = 192, sym = 0x1008FFB0 (XF86TouchpadOn) scancode not found
code = 193, sym = 0x1008FFB1 (XF86TouchpadOff) scancode not found
code = 195, sym = 0xFF7E (Mode_switch) scancode = 257 (ModeSwitch)
code = 200, sym = 0x1008FF14 (XF86AudioPlay) scancode not found
code = 201, sym = 0x1008FF31 (XF86AudioPause) scancode not found
code = 202, sym = 0x1008FF43 (XF86Launch3) scancode not found
code = 203, sym = 0x1008FF44 (XF86Launch4) scancode not found
code = 204, sym = 0x1008FF4B (XF86LaunchB) scancode not found
code = 205, sym = 0x1008FFA7 (XF86Suspend) scancode not found
code = 206, sym = 0x1008FF56 (XF86Close) scancode not found
code = 207, sym = 0x1008FF14 (XF86AudioPlay) scancode not found
code = 208, sym = 0x1008FF97 (XF86AudioForward) scancode not found
code = 210, sym = 0xFF61 (Print) scancode = 70 (PrintScreen)
code = 212, sym = 0x1008FF8F (XF86WebCam) scancode not found
code = 215, sym = 0x1008FF19 (XF86Mail) scancode not found
code = 216, sym = 0x1008FF8E (XF86Messenger) scancode not found
code = 217, sym = 0x1008FF1B (XF86Search) scancode not found
code = 218, sym = 0x1008FF5F (XF86Go) scancode not found
code = 219, sym = 0x1008FF3C (XF86Finance) scancode not found
code = 220, sym = 0x1008FF5E (XF86Game) scancode not found
code = 221, sym = 0x1008FF36 (XF86Shop) scancode not found
code = 223, sym = 0xFF69 (Cancel) scancode = 120 (Stop)
code = 224, sym = 0x1008FF03 (XF86MonBrightnessDown) scancode not found
code = 225, sym = 0x1008FF02 (XF86MonBrightnessUp) scancode not found
code = 226, sym = 0x1008FF32 (XF86AudioMedia) scancode not found
code = 227, sym = 0x1008FF59 (XF86Display) scancode not found
code = 228, sym = 0x1008FF04 (XF86KbdLightOnOff) scancode not found
code = 229, sym = 0x1008FF06 (XF86KbdBrightnessDown) scancode not found
code = 230, sym = 0x1008FF05 (XF86KbdBrightnessUp) scancode not found
code = 231, sym = 0x1008FF7B (XF86Send) scancode not found
code = 232, sym = 0x1008FF72 (XF86Reply) scancode not found
code = 233, sym = 0x1008FF90 (XF86MailForward) scancode not found
code = 234, sym = 0x1008FF77 (XF86Save) scancode not found
code = 235, sym = 0x1008FF5B (XF86Documents) scancode not found
code = 236, sym = 0x1008FF93 (XF86Battery) scancode not found
code = 237, sym = 0x1008FF94 (XF86Bluetooth) scancode not found
code = 238, sym = 0x1008FF95 (XF86WLAN) scancode not found

I investigated the source code on my own and found out that
src/video/x11/SDL_x11keyboard.c is detecting the OSs scancode table through
use of a fingerprint which contains (home, page up, page down), which are 3
of the 4 keys I have remapped. To allow SDL to deal gracefully with this,
I expanded the fingerprint to (home, page up, up, left, delete, KP enter),
with an extra condition that only four of the six entries must be correct
for it to decide on the scancode table. This should make it so that people
who have remapped only a few keys will still be able to use SDL-based games.

I would love to help out, but I am not familiar with the patch request/code
review process for this codebase. I’ve tentatively attached a patch file
to this email, but if there is a better way for me to submit this, please
let me know. Sorry for the trouble.On Wed, Mar 19, 2014 at 12:45 AM, Lewis Wall wrote:

I apologize if this message sounds exasperated. I spent the entire
evening porting my game from GLFW to SDL 2.0, only to find out that it does
not accept my keyboard layout. Like many other Linux users, I’ve used
xmodmap to remap a few keys on my keyboard (home/page down and end/page up,
specifically). However, when trying to run my SDL app, it says

Keyboard layout unknown, please send the following to the SDL mailing list
(sdl at libsdl.org):

and when I press any other key, it usually says something like

The key you just pressed is not recognized by SDL. To help get this fixed,
please report this to the SDL mailing list X11 KeyCode
38 (30), X11 KeySym 0x61 (a).

and the key does nothing. I was quite surprised by this, especially since
remapping only four keys causes SDL to choke on the other keys, and since
every other game support library has no problem with my keyboard settings.
Removing my xmodmap bindings makes SDL happy, but that is not a solution to
the problem, because it may still cause trouble for my game’s userbase. If
there is not a good solution, I’ll have to give up on using SDL, which is a
shame because until now it seemed to have the best combination of
configurability and portability.

The entire message SDL prints on initialization is as follows:

Keyboard layout unknown, please send the following to the SDL mailing list
(sdl at libsdl.org):
code = 1, sym = 0xFF1B (Escape) scancode = 41 (Escape)
code = 2, sym = 0x31 (1) scancode = 40 (Return)
code = 3, sym = 0x32 (2) scancode = 41 (Escape)
code = 4, sym = 0x33 (3) scancode = 42 (Backspace)
code = 5, sym = 0x34 (4) scancode = 43 (Tab)
code = 6, sym = 0x35 (5) scancode = 44 (Space)
code = 7, sym = 0x36 (6) scancode = 45 (-)
code = 8, sym = 0x37 (7) scancode = 46 (=)
code = 9, sym = 0x38 (8) scancode = 47 ([)
code = 10, sym = 0x39 (9) scancode = 48 (])
code = 11, sym = 0x30 (0) scancode = 39 (0)
code = 12, sym = 0x2D (minus) scancode not found
code = 13, sym = 0x3D (equal) scancode not found
code = 14, sym = 0xFF08 (BackSpace) scancode = 42 (Backspace)
code = 15, sym = 0xFF09 (Tab) scancode = 43 (Tab)
code = 16, sym = 0x71 (q) scancode not found
code = 17, sym = 0x77 (w) scancode not found
code = 18, sym = 0x65 (e) scancode not found
code = 19, sym = 0x72 ® scancode not found
code = 20, sym = 0x74 (t) scancode not found
code = 21, sym = 0x79 (y) scancode not found
code = 22, sym = 0x75 (u) scancode not found
code = 23, sym = 0x69 (i) scancode not found
code = 24, sym = 0x6F (o) scancode not found
code = 25, sym = 0x70 § scancode not found
code = 26, sym = 0x5B (bracketleft) scancode not found
code = 27, sym = 0x5D (bracketright) scancode not found
code = 28, sym = 0xFF0D (Return) scancode = 40 (Return)
code = 29, sym = 0xFFE3 (Control_L) scancode = 224 (Left Ctrl)
code = 30, sym = 0x61 (a) scancode not found
code = 31, sym = 0x73 (s) scancode not found
code = 32, sym = 0x64 (d) scancode not found
code = 33, sym = 0x66 (f) scancode not found
code = 34, sym = 0x67 (g) scancode not found
code = 35, sym = 0x68 (h) scancode not found
code = 36, sym = 0x6A (j) scancode not found
code = 37, sym = 0x6B (k) scancode not found
code = 38, sym = 0x6C (l) scancode not found
code = 39, sym = 0x3B (semicolon) scancode not found
code = 40, sym = 0x27 (apostrophe) scancode not found
code = 41, sym = 0x60 (grave) scancode not found
code = 42, sym = 0xFFE1 (Shift_L) scancode = 225 (Left Shift)
code = 43, sym = 0x5C (backslash) scancode not found
code = 44, sym = 0x7A (z) scancode not found
code = 45, sym = 0x78 (x) scancode not found
code = 46, sym = 0x63 © scancode not found
code = 47, sym = 0x76 (v) scancode not found
code = 48, sym = 0x62 (b) scancode not found
code = 49, sym = 0x6E (n) scancode not found
code = 50, sym = 0x6D (m) scancode not found
code = 51, sym = 0x2C (comma) scancode not found
code = 52, sym = 0x2E (period) scancode not found
code = 53, sym = 0x2F (slash) scancode not found
code = 54, sym = 0xFFE2 (Shift_R) scancode = 229 (Right Shift)
code = 55, sym = 0xFFAA (KP_Multiply) scancode = 85 (Keypad *)
code = 56, sym = 0xFFE9 (Alt_L) scancode = 226 (Left Alt)
code = 57, sym = 0x20 (space) scancode not found
code = 58, sym = 0xFFEB (Super_L) scancode = 227 (Left GUI)
code = 59, sym = 0xFFBE (F1) scancode = 58 (F1)
code = 60, sym = 0xFFBF (F2) scancode = 59 (F2)
code = 61, sym = 0xFFC0 (F3) scancode = 60 (F3)
code = 62, sym = 0xFFC1 (F4) scancode = 61 (F4)
code = 63, sym = 0xFFC2 (F5) scancode = 62 (F5)
code = 64, sym = 0xFFC3 (F6) scancode = 63 (F6)
code = 65, sym = 0xFFC4 (F7) scancode = 64 (F7)
code = 66, sym = 0xFFC5 (F8) scancode = 65 (F8)
code = 67, sym = 0xFFC6 (F9) scancode = 66 (F9)
code = 68, sym = 0xFFC7 (F10) scancode = 67 (F10)
code = 69, sym = 0xFF7F (Num_Lock) scancode = 83 (Numlock)
code = 70, sym = 0xFF14 (Scroll_Lock) scancode = 71 (ScrollLock)
code = 71, sym = 0xFF95 (KP_Home) scancode = 95 (Keypad 7)
code = 72, sym = 0xFF97 (KP_Up) scancode = 96 (Keypad 8)
code = 73, sym = 0xFF9A (KP_Prior) scancode = 97 (Keypad 9)
code = 74, sym = 0xFFAD (KP_Subtract) scancode = 86 (Keypad -)
code = 75, sym = 0xFF96 (KP_Left) scancode = 92 (Keypad 4)
code = 76, sym = 0xFF9D (KP_Begin) scancode = 93 (Keypad 5)
code = 77, sym = 0xFF98 (KP_Right) scancode = 94 (Keypad 6)
code = 78, sym = 0xFFAB (KP_Add) scancode = 87 (Keypad +)
code = 79, sym = 0xFF9C (KP_End) scancode = 89 (Keypad 1)
code = 80, sym = 0xFF99 (KP_Down) scancode = 90 (Keypad 2)
code = 81, sym = 0xFF9B (KP_Next) scancode = 91 (Keypad 3)
code = 82, sym = 0xFF9E (KP_Insert) scancode = 98 (Keypad 0)
code = 83, sym = 0xFF9F (KP_Delete) scancode = 99 (Keypad .)
code = 84, sym = 0xFE03 (ISO_Level3_Shift) scancode not found
code = 86, sym = 0x3C (less) scancode not found
code = 87, sym = 0xFFC8 (F11) scancode = 68 (F11)
code = 88, sym = 0xFFC9 (F12) scancode = 69 (F12)
code = 90, sym = 0xFF26 (Katakana) scancode not found
code = 91, sym = 0xFF25 (Hiragana) scancode not found
code = 92, sym = 0xFF23 (Henkan_Mode) scancode not found
code = 93, sym = 0xFF27 (Hiragana_Katakana) scancode not found
code = 94, sym = 0xFF22 (Muhenkan) scancode not found
code = 96, sym = 0xFF8D (KP_Enter) scancode = 88 (Keypad Enter)
code = 97, sym = 0xFFE4 (Control_R) scancode = 228 (Right Ctrl)
code = 98, sym = 0xFFAF (KP_Divide) scancode = 84 (Keypad /)
code = 99, sym = 0xFF20 (Multi_key) scancode not found
code = 100, sym = 0xFFEA (Alt_R) scancode = 230 (Right Alt)
code = 101, sym = 0xFF0A (Linefeed) scancode not found
code = 102, sym = 0xFF55 (Prior) scancode = 75 (PageUp)
code = 103, sym = 0xFF52 (Up) scancode = 82 (Up)
code = 104, sym = 0xFF50 (Home) scancode = 74 (Home)
code = 105, sym = 0xFF51 (Left) scancode = 80 (Left)
code = 106, sym = 0xFF53 (Right) scancode = 79 (Right)
code = 107, sym = 0xFF56 (Next) scancode = 78 (PageDown)
code = 108, sym = 0xFF54 (Down) scancode = 81 (Down)
code = 109, sym = 0xFF57 (End) scancode = 77 (End)
code = 110, sym = 0xFF63 (Insert) scancode = 73 (Insert)
code = 111, sym = 0xFFFF (Delete) scancode = 76 (Delete)
code = 113, sym = 0x1008FF12 (XF86AudioMute) scancode not found
code = 114, sym = 0x1008FF11 (XF86AudioLowerVolume) scancode not found
code = 115, sym = 0x1008FF13 (XF86AudioRaiseVolume) scancode not found
code = 116, sym = 0x1008FF2A (XF86PowerOff) scancode not found
code = 117, sym = 0xFFBD (KP_Equal) scancode = 103 (Keypad =)
code = 118, sym = 0xB1 (plusminus) scancode not found
code = 119, sym = 0xFF13 (Pause) scancode = 72 (Pause)
code = 120, sym = 0x1008FF4A (XF86LaunchA) scancode not found
code = 121, sym = 0xFFAE (KP_Decimal) scancode = 99 (Keypad .)
code = 122, sym = 0xFF31 (Hangul) scancode not found
code = 123, sym = 0xFF34 (Hangul_Hanja) scancode not found
code = 125, sym = 0xFFEB (Super_L) scancode = 227 (Left GUI)
code = 126, sym = 0xFFEC (Super_R) scancode = 231 (Right GUI)
code = 127, sym = 0xFF67 (Menu) scancode = 118 (Menu)
code = 128, sym = 0xFF69 (Cancel) scancode = 120 (Stop)
code = 129, sym = 0xFF66 (Redo) scancode = 121 (Again)
code = 130, sym = 0x1005FF70 (SunProps) scancode not found
code = 131, sym = 0xFF65 (Undo) scancode = 122 (Undo)
code = 132, sym = 0x1005FF71 (SunFront) scancode not found
code = 133, sym = 0x1008FF57 (XF86Copy) scancode not found
code = 134, sym = 0x1005FF73 (SunOpen) scancode not found
code = 135, sym = 0x1008FF6D (XF86Paste) scancode not found
code = 136, sym = 0xFF68 (Find) scancode = 126 (Find)
code = 137, sym = 0x1008FF58 (XF86Cut) scancode not found
code = 138, sym = 0xFF6A (Help) scancode = 117 (Help)
code = 139, sym = 0x1008FF65 (XF86MenuKB) scancode not found
code = 140, sym = 0x1008FF1D (XF86Calculator) scancode not found
code = 142, sym = 0x1008FF2F (XF86Sleep) scancode not found
code = 143, sym = 0x1008FF2B (XF86WakeUp) scancode not found
code = 144, sym = 0x1008FF5D (XF86Explorer) scancode not found
code = 145, sym = 0x1008FF7B (XF86Send) scancode not found
code = 147, sym = 0x1008FF8A (XF86Xfer) scancode not found
code = 148, sym = 0x1008FF41 (XF86Launch1) scancode not found
code = 149, sym = 0x1008FF42 (XF86Launch2) scancode not found
code = 150, sym = 0x1008FF2E (XF86WWW) scancode not found
code = 151, sym = 0x1008FF5A (XF86DOS) scancode not found
code = 152, sym = 0x1008FF2D (XF86ScreenSaver) scancode not found
code = 154, sym = 0x1008FF74 (XF86RotateWindows) scancode not found
code = 155, sym = 0x1008FF19 (XF86Mail) scancode not found
code = 156, sym = 0x1008FF30 (XF86Favorites) scancode not found
code = 157, sym = 0x1008FF33 (XF86MyComputer) scancode not found
code = 158, sym = 0x1008FF26 (XF86Back) scancode not found
code = 159, sym = 0x1008FF27 (XF86Forward) scancode not found
code = 161, sym = 0x1008FF2C (XF86Eject) scancode not found
code = 162, sym = 0x1008FF2C (XF86Eject) scancode not found
code = 163, sym = 0x1008FF17 (XF86AudioNext) scancode not found
code = 164, sym = 0x1008FF14 (XF86AudioPlay) scancode not found
code = 165, sym = 0x1008FF16 (XF86AudioPrev) scancode not found
code = 166, sym = 0x1008FF15 (XF86AudioStop) scancode not found
code = 167, sym = 0x1008FF1C (XF86AudioRecord) scancode not found
code = 168, sym = 0x1008FF3E (XF86AudioRewind) scancode not found
code = 169, sym = 0x1008FF6E (XF86Phone) scancode not found
code = 171, sym = 0x1008FF81 (XF86Tools) scancode not found
code = 172, sym = 0x1008FF18 (XF86HomePage) scancode not found
code = 173, sym = 0x1008FF73 (XF86Reload) scancode not found
code = 174, sym = 0x1008FF56 (XF86Close) scancode not found
code = 177, sym = 0x1008FF78 (XF86ScrollUp) scancode not found
code = 178, sym = 0x1008FF79 (XF86ScrollDown) scancode not found
code = 179, sym = 0x28 (parenleft) scancode not found
code = 180, sym = 0x29 (parenright) scancode not found
code = 181, sym = 0x1008FF68 (XF86New) scancode not found
code = 182, sym = 0xFF66 (Redo) scancode = 121 (Again)
code = 183, sym = 0x1008FF81 (XF86Tools) scancode not found
code = 184, sym = 0x1008FF45 (XF86Launch5) scancode not found
code = 185, sym = 0x1008FF46 (XF86Launch6) scancode not found
code = 186, sym = 0x1008FF47 (XF86Launch7) scancode not found
code = 187, sym = 0x1008FF48 (XF86Launch8) scancode not found
code = 188, sym = 0x1008FF49 (XF86Launch9) scancode not found
code = 191, sym = 0x1008FFA9 (XF86TouchpadToggle) scancode not found
code = 192, sym = 0x1008FFB0 (XF86TouchpadOn) scancode not found
code = 193, sym = 0x1008FFB1 (XF86TouchpadOff) scancode not found
code = 195, sym = 0xFF7E (Mode_switch) scancode = 257 (ModeSwitch)
code = 200, sym = 0x1008FF14 (XF86AudioPlay) scancode not found
code = 201, sym = 0x1008FF31 (XF86AudioPause) scancode not found
code = 202, sym = 0x1008FF43 (XF86Launch3) scancode not found
code = 203, sym = 0x1008FF44 (XF86Launch4) scancode not found
code = 204, sym = 0x1008FF4B (XF86LaunchB) scancode not found
code = 205, sym = 0x1008FFA7 (XF86Suspend) scancode not found
code = 206, sym = 0x1008FF56 (XF86Close) scancode not found
code = 207, sym = 0x1008FF14 (XF86AudioPlay) scancode not found
code = 208, sym = 0x1008FF97 (XF86AudioForward) scancode not found
code = 210, sym = 0xFF61 (Print) scancode = 70 (PrintScreen)
code = 212, sym = 0x1008FF8F (XF86WebCam) scancode not found
code = 215, sym = 0x1008FF19 (XF86Mail) scancode not found
code = 216, sym = 0x1008FF8E (XF86Messenger) scancode not found
code = 217, sym = 0x1008FF1B (XF86Search) scancode not found
code = 218, sym = 0x1008FF5F (XF86Go) scancode not found
code = 219, sym = 0x1008FF3C (XF86Finance) scancode not found
code = 220, sym = 0x1008FF5E (XF86Game) scancode not found
code = 221, sym = 0x1008FF36 (XF86Shop) scancode not found
code = 223, sym = 0xFF69 (Cancel) scancode = 120 (Stop)
code = 224, sym = 0x1008FF03 (XF86MonBrightnessDown) scancode not found
code = 225, sym = 0x1008FF02 (XF86MonBrightnessUp) scancode not found
code = 226, sym = 0x1008FF32 (XF86AudioMedia) scancode not found
code = 227, sym = 0x1008FF59 (XF86Display) scancode not found
code = 228, sym = 0x1008FF04 (XF86KbdLightOnOff) scancode not found
code = 229, sym = 0x1008FF06 (XF86KbdBrightnessDown) scancode not found
code = 230, sym = 0x1008FF05 (XF86KbdBrightnessUp) scancode not found
code = 231, sym = 0x1008FF7B (XF86Send) scancode not found
code = 232, sym = 0x1008FF72 (XF86Reply) scancode not found
code = 233, sym = 0x1008FF90 (XF86MailForward) scancode not found
code = 234, sym = 0x1008FF77 (XF86Save) scancode not found
code = 235, sym = 0x1008FF5B (XF86Documents) scancode not found
code = 236, sym = 0x1008FF93 (XF86Battery) scancode not found
code = 237, sym = 0x1008FF94 (XF86Bluetooth) scancode not found
code = 238, sym = 0x1008FF95 (XF86WLAN) scancode not found

-------------- next part --------------
A non-text attachment was scrubbed…
Name: SDL_x11keyboard.c.patch
Type: text/x-patch
Size: 1690 bytes
Desc: not available
URL: http://lists.libsdl.org/pipermail/sdl-libsdl.org/attachments/20140322/7955deef/attachment-0001.bin

Typically people enter bugs at http://bugzilla.libsdl.org and attach
patches so they don’t get lost on the e-mail list.

I got your patch in though, thanks!
https://hg.libsdl.org/SDL/rev/fb44c438a3e5On Sat, Mar 22, 2014 at 8:37 PM, Lewis Wall wrote:

I investigated the source code on my own and found out that
src/video/x11/SDL_x11keyboard.c is detecting the OSs scancode table through
use of a fingerprint which contains (home, page up, page down), which are 3
of the 4 keys I have remapped. To allow SDL to deal gracefully with this,
I expanded the fingerprint to (home, page up, up, left, delete, KP enter),
with an extra condition that only four of the six entries must be correct
for it to decide on the scancode table. This should make it so that people
who have remapped only a few keys will still be able to use SDL-based games.

I would love to help out, but I am not familiar with the patch
request/code review process for this codebase. I’ve tentatively attached a
patch file to this email, but if there is a better way for me to submit
this, please let me know. Sorry for the trouble.

On Wed, Mar 19, 2014 at 12:45 AM, Lewis Wall wrote:

I apologize if this message sounds exasperated. I spent the entire
evening porting my game from GLFW to SDL 2.0, only to find out that it does
not accept my keyboard layout. Like many other Linux users, I’ve used
xmodmap to remap a few keys on my keyboard (home/page down and end/page up,
specifically). However, when trying to run my SDL app, it says

Keyboard layout unknown, please send the following to the SDL mailing
list (sdl at libsdl.org):

and when I press any other key, it usually says something like

The key you just pressed is not recognized by SDL. To help get this
fixed, please report this to the SDL mailing list X11
KeyCode 38 (30), X11 KeySym 0x61 (a).

and the key does nothing. I was quite surprised by this, especially
since remapping only four keys causes SDL to choke on the other keys, and
since every other game support library has no problem with my keyboard
settings. Removing my xmodmap bindings makes SDL happy, but that is not a
solution to the problem, because it may still cause trouble for my game’s
userbase. If there is not a good solution, I’ll have to give up on using
SDL, which is a shame because until now it seemed to have the best
combination of configurability and portability.

The entire message SDL prints on initialization is as follows:

Keyboard layout unknown, please send the following to the SDL mailing
list (sdl at libsdl.org):
code = 1, sym = 0xFF1B (Escape) scancode = 41 (Escape)
code = 2, sym = 0x31 (1) scancode = 40 (Return)
code = 3, sym = 0x32 (2) scancode = 41 (Escape)
code = 4, sym = 0x33 (3) scancode = 42 (Backspace)
code = 5, sym = 0x34 (4) scancode = 43 (Tab)
code = 6, sym = 0x35 (5) scancode = 44 (Space)
code = 7, sym = 0x36 (6) scancode = 45 (-)
code = 8, sym = 0x37 (7) scancode = 46 (=)
code = 9, sym = 0x38 (8) scancode = 47 ([)
code = 10, sym = 0x39 (9) scancode = 48 (])
code = 11, sym = 0x30 (0) scancode = 39 (0)
code = 12, sym = 0x2D (minus) scancode not found
code = 13, sym = 0x3D (equal) scancode not found
code = 14, sym = 0xFF08 (BackSpace) scancode = 42 (Backspace)
code = 15, sym = 0xFF09 (Tab) scancode = 43 (Tab)
code = 16, sym = 0x71 (q) scancode not found
code = 17, sym = 0x77 (w) scancode not found
code = 18, sym = 0x65 (e) scancode not found
code = 19, sym = 0x72 ® scancode not found
code = 20, sym = 0x74 (t) scancode not found
code = 21, sym = 0x79 (y) scancode not found
code = 22, sym = 0x75 (u) scancode not found
code = 23, sym = 0x69 (i) scancode not found
code = 24, sym = 0x6F (o) scancode not found
code = 25, sym = 0x70 § scancode not found
code = 26, sym = 0x5B (bracketleft) scancode not found
code = 27, sym = 0x5D (bracketright) scancode not found
code = 28, sym = 0xFF0D (Return) scancode = 40 (Return)
code = 29, sym = 0xFFE3 (Control_L) scancode = 224 (Left Ctrl)
code = 30, sym = 0x61 (a) scancode not found
code = 31, sym = 0x73 (s) scancode not found
code = 32, sym = 0x64 (d) scancode not found
code = 33, sym = 0x66 (f) scancode not found
code = 34, sym = 0x67 (g) scancode not found
code = 35, sym = 0x68 (h) scancode not found
code = 36, sym = 0x6A (j) scancode not found
code = 37, sym = 0x6B (k) scancode not found
code = 38, sym = 0x6C (l) scancode not found
code = 39, sym = 0x3B (semicolon) scancode not found
code = 40, sym = 0x27 (apostrophe) scancode not found
code = 41, sym = 0x60 (grave) scancode not found
code = 42, sym = 0xFFE1 (Shift_L) scancode = 225 (Left Shift)
code = 43, sym = 0x5C (backslash) scancode not found
code = 44, sym = 0x7A (z) scancode not found
code = 45, sym = 0x78 (x) scancode not found
code = 46, sym = 0x63 © scancode not found
code = 47, sym = 0x76 (v) scancode not found
code = 48, sym = 0x62 (b) scancode not found
code = 49, sym = 0x6E (n) scancode not found
code = 50, sym = 0x6D (m) scancode not found
code = 51, sym = 0x2C (comma) scancode not found
code = 52, sym = 0x2E (period) scancode not found
code = 53, sym = 0x2F (slash) scancode not found
code = 54, sym = 0xFFE2 (Shift_R) scancode = 229 (Right Shift)
code = 55, sym = 0xFFAA (KP_Multiply) scancode = 85 (Keypad *)
code = 56, sym = 0xFFE9 (Alt_L) scancode = 226 (Left Alt)
code = 57, sym = 0x20 (space) scancode not found
code = 58, sym = 0xFFEB (Super_L) scancode = 227 (Left GUI)
code = 59, sym = 0xFFBE (F1) scancode = 58 (F1)
code = 60, sym = 0xFFBF (F2) scancode = 59 (F2)
code = 61, sym = 0xFFC0 (F3) scancode = 60 (F3)
code = 62, sym = 0xFFC1 (F4) scancode = 61 (F4)
code = 63, sym = 0xFFC2 (F5) scancode = 62 (F5)
code = 64, sym = 0xFFC3 (F6) scancode = 63 (F6)
code = 65, sym = 0xFFC4 (F7) scancode = 64 (F7)
code = 66, sym = 0xFFC5 (F8) scancode = 65 (F8)
code = 67, sym = 0xFFC6 (F9) scancode = 66 (F9)
code = 68, sym = 0xFFC7 (F10) scancode = 67 (F10)
code = 69, sym = 0xFF7F (Num_Lock) scancode = 83 (Numlock)
code = 70, sym = 0xFF14 (Scroll_Lock) scancode = 71 (ScrollLock)
code = 71, sym = 0xFF95 (KP_Home) scancode = 95 (Keypad 7)
code = 72, sym = 0xFF97 (KP_Up) scancode = 96 (Keypad 8)
code = 73, sym = 0xFF9A (KP_Prior) scancode = 97 (Keypad 9)
code = 74, sym = 0xFFAD (KP_Subtract) scancode = 86 (Keypad -)
code = 75, sym = 0xFF96 (KP_Left) scancode = 92 (Keypad 4)
code = 76, sym = 0xFF9D (KP_Begin) scancode = 93 (Keypad 5)
code = 77, sym = 0xFF98 (KP_Right) scancode = 94 (Keypad 6)
code = 78, sym = 0xFFAB (KP_Add) scancode = 87 (Keypad +)
code = 79, sym = 0xFF9C (KP_End) scancode = 89 (Keypad 1)
code = 80, sym = 0xFF99 (KP_Down) scancode = 90 (Keypad 2)
code = 81, sym = 0xFF9B (KP_Next) scancode = 91 (Keypad 3)
code = 82, sym = 0xFF9E (KP_Insert) scancode = 98 (Keypad 0)
code = 83, sym = 0xFF9F (KP_Delete) scancode = 99 (Keypad .)
code = 84, sym = 0xFE03 (ISO_Level3_Shift) scancode not found
code = 86, sym = 0x3C (less) scancode not found
code = 87, sym = 0xFFC8 (F11) scancode = 68 (F11)
code = 88, sym = 0xFFC9 (F12) scancode = 69 (F12)
code = 90, sym = 0xFF26 (Katakana) scancode not found
code = 91, sym = 0xFF25 (Hiragana) scancode not found
code = 92, sym = 0xFF23 (Henkan_Mode) scancode not found
code = 93, sym = 0xFF27 (Hiragana_Katakana) scancode not found
code = 94, sym = 0xFF22 (Muhenkan) scancode not found
code = 96, sym = 0xFF8D (KP_Enter) scancode = 88 (Keypad Enter)
code = 97, sym = 0xFFE4 (Control_R) scancode = 228 (Right Ctrl)
code = 98, sym = 0xFFAF (KP_Divide) scancode = 84 (Keypad /)
code = 99, sym = 0xFF20 (Multi_key) scancode not found
code = 100, sym = 0xFFEA (Alt_R) scancode = 230 (Right Alt)
code = 101, sym = 0xFF0A (Linefeed) scancode not found
code = 102, sym = 0xFF55 (Prior) scancode = 75 (PageUp)
code = 103, sym = 0xFF52 (Up) scancode = 82 (Up)
code = 104, sym = 0xFF50 (Home) scancode = 74 (Home)
code = 105, sym = 0xFF51 (Left) scancode = 80 (Left)
code = 106, sym = 0xFF53 (Right) scancode = 79 (Right)
code = 107, sym = 0xFF56 (Next) scancode = 78 (PageDown)
code = 108, sym = 0xFF54 (Down) scancode = 81 (Down)
code = 109, sym = 0xFF57 (End) scancode = 77 (End)
code = 110, sym = 0xFF63 (Insert) scancode = 73 (Insert)
code = 111, sym = 0xFFFF (Delete) scancode = 76 (Delete)
code = 113, sym = 0x1008FF12 (XF86AudioMute) scancode not found
code = 114, sym = 0x1008FF11 (XF86AudioLowerVolume) scancode not found
code = 115, sym = 0x1008FF13 (XF86AudioRaiseVolume) scancode not found
code = 116, sym = 0x1008FF2A (XF86PowerOff) scancode not found
code = 117, sym = 0xFFBD (KP_Equal) scancode = 103 (Keypad =)
code = 118, sym = 0xB1 (plusminus) scancode not found
code = 119, sym = 0xFF13 (Pause) scancode = 72 (Pause)
code = 120, sym = 0x1008FF4A (XF86LaunchA) scancode not found
code = 121, sym = 0xFFAE (KP_Decimal) scancode = 99 (Keypad .)
code = 122, sym = 0xFF31 (Hangul) scancode not found
code = 123, sym = 0xFF34 (Hangul_Hanja) scancode not found
code = 125, sym = 0xFFEB (Super_L) scancode = 227 (Left GUI)
code = 126, sym = 0xFFEC (Super_R) scancode = 231 (Right GUI)
code = 127, sym = 0xFF67 (Menu) scancode = 118 (Menu)
code = 128, sym = 0xFF69 (Cancel) scancode = 120 (Stop)
code = 129, sym = 0xFF66 (Redo) scancode = 121 (Again)
code = 130, sym = 0x1005FF70 (SunProps) scancode not found
code = 131, sym = 0xFF65 (Undo) scancode = 122 (Undo)
code = 132, sym = 0x1005FF71 (SunFront) scancode not found
code = 133, sym = 0x1008FF57 (XF86Copy) scancode not found
code = 134, sym = 0x1005FF73 (SunOpen) scancode not found
code = 135, sym = 0x1008FF6D (XF86Paste) scancode not found
code = 136, sym = 0xFF68 (Find) scancode = 126 (Find)
code = 137, sym = 0x1008FF58 (XF86Cut) scancode not found
code = 138, sym = 0xFF6A (Help) scancode = 117 (Help)
code = 139, sym = 0x1008FF65 (XF86MenuKB) scancode not found
code = 140, sym = 0x1008FF1D (XF86Calculator) scancode not found
code = 142, sym = 0x1008FF2F (XF86Sleep) scancode not found
code = 143, sym = 0x1008FF2B (XF86WakeUp) scancode not found
code = 144, sym = 0x1008FF5D (XF86Explorer) scancode not found
code = 145, sym = 0x1008FF7B (XF86Send) scancode not found
code = 147, sym = 0x1008FF8A (XF86Xfer) scancode not found
code = 148, sym = 0x1008FF41 (XF86Launch1) scancode not found
code = 149, sym = 0x1008FF42 (XF86Launch2) scancode not found
code = 150, sym = 0x1008FF2E (XF86WWW) scancode not found
code = 151, sym = 0x1008FF5A (XF86DOS) scancode not found
code = 152, sym = 0x1008FF2D (XF86ScreenSaver) scancode not found
code = 154, sym = 0x1008FF74 (XF86RotateWindows) scancode not found
code = 155, sym = 0x1008FF19 (XF86Mail) scancode not found
code = 156, sym = 0x1008FF30 (XF86Favorites) scancode not found
code = 157, sym = 0x1008FF33 (XF86MyComputer) scancode not found
code = 158, sym = 0x1008FF26 (XF86Back) scancode not found
code = 159, sym = 0x1008FF27 (XF86Forward) scancode not found
code = 161, sym = 0x1008FF2C (XF86Eject) scancode not found
code = 162, sym = 0x1008FF2C (XF86Eject) scancode not found
code = 163, sym = 0x1008FF17 (XF86AudioNext) scancode not found
code = 164, sym = 0x1008FF14 (XF86AudioPlay) scancode not found
code = 165, sym = 0x1008FF16 (XF86AudioPrev) scancode not found
code = 166, sym = 0x1008FF15 (XF86AudioStop) scancode not found
code = 167, sym = 0x1008FF1C (XF86AudioRecord) scancode not found
code = 168, sym = 0x1008FF3E (XF86AudioRewind) scancode not found
code = 169, sym = 0x1008FF6E (XF86Phone) scancode not found
code = 171, sym = 0x1008FF81 (XF86Tools) scancode not found
code = 172, sym = 0x1008FF18 (XF86HomePage) scancode not found
code = 173, sym = 0x1008FF73 (XF86Reload) scancode not found
code = 174, sym = 0x1008FF56 (XF86Close) scancode not found
code = 177, sym = 0x1008FF78 (XF86ScrollUp) scancode not found
code = 178, sym = 0x1008FF79 (XF86ScrollDown) scancode not found
code = 179, sym = 0x28 (parenleft) scancode not found
code = 180, sym = 0x29 (parenright) scancode not found
code = 181, sym = 0x1008FF68 (XF86New) scancode not found
code = 182, sym = 0xFF66 (Redo) scancode = 121 (Again)
code = 183, sym = 0x1008FF81 (XF86Tools) scancode not found
code = 184, sym = 0x1008FF45 (XF86Launch5) scancode not found
code = 185, sym = 0x1008FF46 (XF86Launch6) scancode not found
code = 186, sym = 0x1008FF47 (XF86Launch7) scancode not found
code = 187, sym = 0x1008FF48 (XF86Launch8) scancode not found
code = 188, sym = 0x1008FF49 (XF86Launch9) scancode not found
code = 191, sym = 0x1008FFA9 (XF86TouchpadToggle) scancode not found
code = 192, sym = 0x1008FFB0 (XF86TouchpadOn) scancode not found
code = 193, sym = 0x1008FFB1 (XF86TouchpadOff) scancode not found
code = 195, sym = 0xFF7E (Mode_switch) scancode = 257 (ModeSwitch)
code = 200, sym = 0x1008FF14 (XF86AudioPlay) scancode not found
code = 201, sym = 0x1008FF31 (XF86AudioPause) scancode not found
code = 202, sym = 0x1008FF43 (XF86Launch3) scancode not found
code = 203, sym = 0x1008FF44 (XF86Launch4) scancode not found
code = 204, sym = 0x1008FF4B (XF86LaunchB) scancode not found
code = 205, sym = 0x1008FFA7 (XF86Suspend) scancode not found
code = 206, sym = 0x1008FF56 (XF86Close) scancode not found
code = 207, sym = 0x1008FF14 (XF86AudioPlay) scancode not found
code = 208, sym = 0x1008FF97 (XF86AudioForward) scancode not found
code = 210, sym = 0xFF61 (Print) scancode = 70 (PrintScreen)
code = 212, sym = 0x1008FF8F (XF86WebCam) scancode not found
code = 215, sym = 0x1008FF19 (XF86Mail) scancode not found
code = 216, sym = 0x1008FF8E (XF86Messenger) scancode not found
code = 217, sym = 0x1008FF1B (XF86Search) scancode not found
code = 218, sym = 0x1008FF5F (XF86Go) scancode not found
code = 219, sym = 0x1008FF3C (XF86Finance) scancode not found
code = 220, sym = 0x1008FF5E (XF86Game) scancode not found
code = 221, sym = 0x1008FF36 (XF86Shop) scancode not found
code = 223, sym = 0xFF69 (Cancel) scancode = 120 (Stop)
code = 224, sym = 0x1008FF03 (XF86MonBrightnessDown) scancode not found
code = 225, sym = 0x1008FF02 (XF86MonBrightnessUp) scancode not found
code = 226, sym = 0x1008FF32 (XF86AudioMedia) scancode not found
code = 227, sym = 0x1008FF59 (XF86Display) scancode not found
code = 228, sym = 0x1008FF04 (XF86KbdLightOnOff) scancode not found
code = 229, sym = 0x1008FF06 (XF86KbdBrightnessDown) scancode not found
code = 230, sym = 0x1008FF05 (XF86KbdBrightnessUp) scancode not found
code = 231, sym = 0x1008FF7B (XF86Send) scancode not found
code = 232, sym = 0x1008FF72 (XF86Reply) scancode not found
code = 233, sym = 0x1008FF90 (XF86MailForward) scancode not found
code = 234, sym = 0x1008FF77 (XF86Save) scancode not found
code = 235, sym = 0x1008FF5B (XF86Documents) scancode not found
code = 236, sym = 0x1008FF93 (XF86Battery) scancode not found
code = 237, sym = 0x1008FF94 (XF86Bluetooth) scancode not found
code = 238, sym = 0x1008FF95 (XF86WLAN) scancode not found


SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org

Thanks. I’ll remember that for next time.On Sun, Mar 23, 2014 at 9:45 AM, Sam Lantinga wrote:

Typically people enter bugs at http://bugzilla.libsdl.org and attach
patches so they don’t get lost on the e-mail list.

I got your patch in though, thanks!
https://hg.libsdl.org/SDL/rev/fb44c438a3e5

On Sat, Mar 22, 2014 at 8:37 PM, Lewis Wall wrote:

I investigated the source code on my own and found out that
src/video/x11/SDL_x11keyboard.c is detecting the OSs scancode table through
use of a fingerprint which contains (home, page up, page down), which are 3
of the 4 keys I have remapped. To allow SDL to deal gracefully with this,
I expanded the fingerprint to (home, page up, up, left, delete, KP enter),
with an extra condition that only four of the six entries must be correct
for it to decide on the scancode table. This should make it so that people
who have remapped only a few keys will still be able to use SDL-based games.

I would love to help out, but I am not familiar with the patch
request/code review process for this codebase. I’ve tentatively attached a
patch file to this email, but if there is a better way for me to submit
this, please let me know. Sorry for the trouble.

On Wed, Mar 19, 2014 at 12:45 AM, Lewis Wall wrote:

I apologize if this message sounds exasperated. I spent the entire
evening porting my game from GLFW to SDL 2.0, only to find out that it does
not accept my keyboard layout. Like many other Linux users, I’ve used
xmodmap to remap a few keys on my keyboard (home/page down and end/page up,
specifically). However, when trying to run my SDL app, it says

Keyboard layout unknown, please send the following to the SDL mailing
list (sdl at libsdl.org):

and when I press any other key, it usually says something like

The key you just pressed is not recognized by SDL. To help get this
fixed, please report this to the SDL mailing list X11
KeyCode 38 (30), X11 KeySym 0x61 (a).

and the key does nothing. I was quite surprised by this, especially
since remapping only four keys causes SDL to choke on the other keys, and
since every other game support library has no problem with my keyboard
settings. Removing my xmodmap bindings makes SDL happy, but that is not a
solution to the problem, because it may still cause trouble for my game’s
userbase. If there is not a good solution, I’ll have to give up on using
SDL, which is a shame because until now it seemed to have the best
combination of configurability and portability.

The entire message SDL prints on initialization is as follows:

Keyboard layout unknown, please send the following to the SDL mailing
list (sdl at libsdl.org):
code = 1, sym = 0xFF1B (Escape) scancode = 41 (Escape)
code = 2, sym = 0x31 (1) scancode = 40 (Return)
code = 3, sym = 0x32 (2) scancode = 41 (Escape)
code = 4, sym = 0x33 (3) scancode = 42 (Backspace)
code = 5, sym = 0x34 (4) scancode = 43 (Tab)
code = 6, sym = 0x35 (5) scancode = 44 (Space)
code = 7, sym = 0x36 (6) scancode = 45 (-)
code = 8, sym = 0x37 (7) scancode = 46 (=)
code = 9, sym = 0x38 (8) scancode = 47 ([)
code = 10, sym = 0x39 (9) scancode = 48 (])
code = 11, sym = 0x30 (0) scancode = 39 (0)
code = 12, sym = 0x2D (minus) scancode not found
code = 13, sym = 0x3D (equal) scancode not found
code = 14, sym = 0xFF08 (BackSpace) scancode = 42 (Backspace)
code = 15, sym = 0xFF09 (Tab) scancode = 43 (Tab)
code = 16, sym = 0x71 (q) scancode not found
code = 17, sym = 0x77 (w) scancode not found
code = 18, sym = 0x65 (e) scancode not found
code = 19, sym = 0x72 ® scancode not found
code = 20, sym = 0x74 (t) scancode not found
code = 21, sym = 0x79 (y) scancode not found
code = 22, sym = 0x75 (u) scancode not found
code = 23, sym = 0x69 (i) scancode not found
code = 24, sym = 0x6F (o) scancode not found
code = 25, sym = 0x70 § scancode not found
code = 26, sym = 0x5B (bracketleft) scancode not found
code = 27, sym = 0x5D (bracketright) scancode not found
code = 28, sym = 0xFF0D (Return) scancode = 40 (Return)
code = 29, sym = 0xFFE3 (Control_L) scancode = 224 (Left Ctrl)
code = 30, sym = 0x61 (a) scancode not found
code = 31, sym = 0x73 (s) scancode not found
code = 32, sym = 0x64 (d) scancode not found
code = 33, sym = 0x66 (f) scancode not found
code = 34, sym = 0x67 (g) scancode not found
code = 35, sym = 0x68 (h) scancode not found
code = 36, sym = 0x6A (j) scancode not found
code = 37, sym = 0x6B (k) scancode not found
code = 38, sym = 0x6C (l) scancode not found
code = 39, sym = 0x3B (semicolon) scancode not found
code = 40, sym = 0x27 (apostrophe) scancode not found
code = 41, sym = 0x60 (grave) scancode not found
code = 42, sym = 0xFFE1 (Shift_L) scancode = 225 (Left Shift)
code = 43, sym = 0x5C (backslash) scancode not found
code = 44, sym = 0x7A (z) scancode not found
code = 45, sym = 0x78 (x) scancode not found
code = 46, sym = 0x63 © scancode not found
code = 47, sym = 0x76 (v) scancode not found
code = 48, sym = 0x62 (b) scancode not found
code = 49, sym = 0x6E (n) scancode not found
code = 50, sym = 0x6D (m) scancode not found
code = 51, sym = 0x2C (comma) scancode not found
code = 52, sym = 0x2E (period) scancode not found
code = 53, sym = 0x2F (slash) scancode not found
code = 54, sym = 0xFFE2 (Shift_R) scancode = 229 (Right Shift)
code = 55, sym = 0xFFAA (KP_Multiply) scancode = 85 (Keypad *)
code = 56, sym = 0xFFE9 (Alt_L) scancode = 226 (Left Alt)
code = 57, sym = 0x20 (space) scancode not found
code = 58, sym = 0xFFEB (Super_L) scancode = 227 (Left GUI)
code = 59, sym = 0xFFBE (F1) scancode = 58 (F1)
code = 60, sym = 0xFFBF (F2) scancode = 59 (F2)
code = 61, sym = 0xFFC0 (F3) scancode = 60 (F3)
code = 62, sym = 0xFFC1 (F4) scancode = 61 (F4)
code = 63, sym = 0xFFC2 (F5) scancode = 62 (F5)
code = 64, sym = 0xFFC3 (F6) scancode = 63 (F6)
code = 65, sym = 0xFFC4 (F7) scancode = 64 (F7)
code = 66, sym = 0xFFC5 (F8) scancode = 65 (F8)
code = 67, sym = 0xFFC6 (F9) scancode = 66 (F9)
code = 68, sym = 0xFFC7 (F10) scancode = 67 (F10)
code = 69, sym = 0xFF7F (Num_Lock) scancode = 83 (Numlock)
code = 70, sym = 0xFF14 (Scroll_Lock) scancode = 71 (ScrollLock)
code = 71, sym = 0xFF95 (KP_Home) scancode = 95 (Keypad 7)
code = 72, sym = 0xFF97 (KP_Up) scancode = 96 (Keypad 8)
code = 73, sym = 0xFF9A (KP_Prior) scancode = 97 (Keypad 9)
code = 74, sym = 0xFFAD (KP_Subtract) scancode = 86 (Keypad -)
code = 75, sym = 0xFF96 (KP_Left) scancode = 92 (Keypad 4)
code = 76, sym = 0xFF9D (KP_Begin) scancode = 93 (Keypad 5)
code = 77, sym = 0xFF98 (KP_Right) scancode = 94 (Keypad 6)
code = 78, sym = 0xFFAB (KP_Add) scancode = 87 (Keypad +)
code = 79, sym = 0xFF9C (KP_End) scancode = 89 (Keypad 1)
code = 80, sym = 0xFF99 (KP_Down) scancode = 90 (Keypad 2)
code = 81, sym = 0xFF9B (KP_Next) scancode = 91 (Keypad 3)
code = 82, sym = 0xFF9E (KP_Insert) scancode = 98 (Keypad 0)
code = 83, sym = 0xFF9F (KP_Delete) scancode = 99 (Keypad .)
code = 84, sym = 0xFE03 (ISO_Level3_Shift) scancode not found
code = 86, sym = 0x3C (less) scancode not found
code = 87, sym = 0xFFC8 (F11) scancode = 68 (F11)
code = 88, sym = 0xFFC9 (F12) scancode = 69 (F12)
code = 90, sym = 0xFF26 (Katakana) scancode not found
code = 91, sym = 0xFF25 (Hiragana) scancode not found
code = 92, sym = 0xFF23 (Henkan_Mode) scancode not found
code = 93, sym = 0xFF27 (Hiragana_Katakana) scancode not found
code = 94, sym = 0xFF22 (Muhenkan) scancode not found
code = 96, sym = 0xFF8D (KP_Enter) scancode = 88 (Keypad Enter)
code = 97, sym = 0xFFE4 (Control_R) scancode = 228 (Right Ctrl)
code = 98, sym = 0xFFAF (KP_Divide) scancode = 84 (Keypad /)
code = 99, sym = 0xFF20 (Multi_key) scancode not found
code = 100, sym = 0xFFEA (Alt_R) scancode = 230 (Right Alt)
code = 101, sym = 0xFF0A (Linefeed) scancode not found
code = 102, sym = 0xFF55 (Prior) scancode = 75 (PageUp)
code = 103, sym = 0xFF52 (Up) scancode = 82 (Up)
code = 104, sym = 0xFF50 (Home) scancode = 74 (Home)
code = 105, sym = 0xFF51 (Left) scancode = 80 (Left)
code = 106, sym = 0xFF53 (Right) scancode = 79 (Right)
code = 107, sym = 0xFF56 (Next) scancode = 78 (PageDown)
code = 108, sym = 0xFF54 (Down) scancode = 81 (Down)
code = 109, sym = 0xFF57 (End) scancode = 77 (End)
code = 110, sym = 0xFF63 (Insert) scancode = 73 (Insert)
code = 111, sym = 0xFFFF (Delete) scancode = 76 (Delete)
code = 113, sym = 0x1008FF12 (XF86AudioMute) scancode not found
code = 114, sym = 0x1008FF11 (XF86AudioLowerVolume) scancode not found
code = 115, sym = 0x1008FF13 (XF86AudioRaiseVolume) scancode not found
code = 116, sym = 0x1008FF2A (XF86PowerOff) scancode not found
code = 117, sym = 0xFFBD (KP_Equal) scancode = 103 (Keypad =)
code = 118, sym = 0xB1 (plusminus) scancode not found
code = 119, sym = 0xFF13 (Pause) scancode = 72 (Pause)
code = 120, sym = 0x1008FF4A (XF86LaunchA) scancode not found
code = 121, sym = 0xFFAE (KP_Decimal) scancode = 99 (Keypad .)
code = 122, sym = 0xFF31 (Hangul) scancode not found
code = 123, sym = 0xFF34 (Hangul_Hanja) scancode not found
code = 125, sym = 0xFFEB (Super_L) scancode = 227 (Left GUI)
code = 126, sym = 0xFFEC (Super_R) scancode = 231 (Right GUI)
code = 127, sym = 0xFF67 (Menu) scancode = 118 (Menu)
code = 128, sym = 0xFF69 (Cancel) scancode = 120 (Stop)
code = 129, sym = 0xFF66 (Redo) scancode = 121 (Again)
code = 130, sym = 0x1005FF70 (SunProps) scancode not found
code = 131, sym = 0xFF65 (Undo) scancode = 122 (Undo)
code = 132, sym = 0x1005FF71 (SunFront) scancode not found
code = 133, sym = 0x1008FF57 (XF86Copy) scancode not found
code = 134, sym = 0x1005FF73 (SunOpen) scancode not found
code = 135, sym = 0x1008FF6D (XF86Paste) scancode not found
code = 136, sym = 0xFF68 (Find) scancode = 126 (Find)
code = 137, sym = 0x1008FF58 (XF86Cut) scancode not found
code = 138, sym = 0xFF6A (Help) scancode = 117 (Help)
code = 139, sym = 0x1008FF65 (XF86MenuKB) scancode not found
code = 140, sym = 0x1008FF1D (XF86Calculator) scancode not found
code = 142, sym = 0x1008FF2F (XF86Sleep) scancode not found
code = 143, sym = 0x1008FF2B (XF86WakeUp) scancode not found
code = 144, sym = 0x1008FF5D (XF86Explorer) scancode not found
code = 145, sym = 0x1008FF7B (XF86Send) scancode not found
code = 147, sym = 0x1008FF8A (XF86Xfer) scancode not found
code = 148, sym = 0x1008FF41 (XF86Launch1) scancode not found
code = 149, sym = 0x1008FF42 (XF86Launch2) scancode not found
code = 150, sym = 0x1008FF2E (XF86WWW) scancode not found
code = 151, sym = 0x1008FF5A (XF86DOS) scancode not found
code = 152, sym = 0x1008FF2D (XF86ScreenSaver) scancode not found
code = 154, sym = 0x1008FF74 (XF86RotateWindows) scancode not found
code = 155, sym = 0x1008FF19 (XF86Mail) scancode not found
code = 156, sym = 0x1008FF30 (XF86Favorites) scancode not found
code = 157, sym = 0x1008FF33 (XF86MyComputer) scancode not found
code = 158, sym = 0x1008FF26 (XF86Back) scancode not found
code = 159, sym = 0x1008FF27 (XF86Forward) scancode not found
code = 161, sym = 0x1008FF2C (XF86Eject) scancode not found
code = 162, sym = 0x1008FF2C (XF86Eject) scancode not found
code = 163, sym = 0x1008FF17 (XF86AudioNext) scancode not found
code = 164, sym = 0x1008FF14 (XF86AudioPlay) scancode not found
code = 165, sym = 0x1008FF16 (XF86AudioPrev) scancode not found
code = 166, sym = 0x1008FF15 (XF86AudioStop) scancode not found
code = 167, sym = 0x1008FF1C (XF86AudioRecord) scancode not found
code = 168, sym = 0x1008FF3E (XF86AudioRewind) scancode not found
code = 169, sym = 0x1008FF6E (XF86Phone) scancode not found
code = 171, sym = 0x1008FF81 (XF86Tools) scancode not found
code = 172, sym = 0x1008FF18 (XF86HomePage) scancode not found
code = 173, sym = 0x1008FF73 (XF86Reload) scancode not found
code = 174, sym = 0x1008FF56 (XF86Close) scancode not found
code = 177, sym = 0x1008FF78 (XF86ScrollUp) scancode not found
code = 178, sym = 0x1008FF79 (XF86ScrollDown) scancode not found
code = 179, sym = 0x28 (parenleft) scancode not found
code = 180, sym = 0x29 (parenright) scancode not found
code = 181, sym = 0x1008FF68 (XF86New) scancode not found
code = 182, sym = 0xFF66 (Redo) scancode = 121 (Again)
code = 183, sym = 0x1008FF81 (XF86Tools) scancode not found
code = 184, sym = 0x1008FF45 (XF86Launch5) scancode not found
code = 185, sym = 0x1008FF46 (XF86Launch6) scancode not found
code = 186, sym = 0x1008FF47 (XF86Launch7) scancode not found
code = 187, sym = 0x1008FF48 (XF86Launch8) scancode not found
code = 188, sym = 0x1008FF49 (XF86Launch9) scancode not found
code = 191, sym = 0x1008FFA9 (XF86TouchpadToggle) scancode not found
code = 192, sym = 0x1008FFB0 (XF86TouchpadOn) scancode not found
code = 193, sym = 0x1008FFB1 (XF86TouchpadOff) scancode not found
code = 195, sym = 0xFF7E (Mode_switch) scancode = 257 (ModeSwitch)
code = 200, sym = 0x1008FF14 (XF86AudioPlay) scancode not found
code = 201, sym = 0x1008FF31 (XF86AudioPause) scancode not found
code = 202, sym = 0x1008FF43 (XF86Launch3) scancode not found
code = 203, sym = 0x1008FF44 (XF86Launch4) scancode not found
code = 204, sym = 0x1008FF4B (XF86LaunchB) scancode not found
code = 205, sym = 0x1008FFA7 (XF86Suspend) scancode not found
code = 206, sym = 0x1008FF56 (XF86Close) scancode not found
code = 207, sym = 0x1008FF14 (XF86AudioPlay) scancode not found
code = 208, sym = 0x1008FF97 (XF86AudioForward) scancode not found
code = 210, sym = 0xFF61 (Print) scancode = 70 (PrintScreen)
code = 212, sym = 0x1008FF8F (XF86WebCam) scancode not found
code = 215, sym = 0x1008FF19 (XF86Mail) scancode not found
code = 216, sym = 0x1008FF8E (XF86Messenger) scancode not found
code = 217, sym = 0x1008FF1B (XF86Search) scancode not found
code = 218, sym = 0x1008FF5F (XF86Go) scancode not found
code = 219, sym = 0x1008FF3C (XF86Finance) scancode not found
code = 220, sym = 0x1008FF5E (XF86Game) scancode not found
code = 221, sym = 0x1008FF36 (XF86Shop) scancode not found
code = 223, sym = 0xFF69 (Cancel) scancode = 120 (Stop)
code = 224, sym = 0x1008FF03 (XF86MonBrightnessDown) scancode not found
code = 225, sym = 0x1008FF02 (XF86MonBrightnessUp) scancode not found
code = 226, sym = 0x1008FF32 (XF86AudioMedia) scancode not found
code = 227, sym = 0x1008FF59 (XF86Display) scancode not found
code = 228, sym = 0x1008FF04 (XF86KbdLightOnOff) scancode not found
code = 229, sym = 0x1008FF06 (XF86KbdBrightnessDown) scancode not found
code = 230, sym = 0x1008FF05 (XF86KbdBrightnessUp) scancode not found
code = 231, sym = 0x1008FF7B (XF86Send) scancode not found
code = 232, sym = 0x1008FF72 (XF86Reply) scancode not found
code = 233, sym = 0x1008FF90 (XF86MailForward) scancode not found
code = 234, sym = 0x1008FF77 (XF86Save) scancode not found
code = 235, sym = 0x1008FF5B (XF86Documents) scancode not found
code = 236, sym = 0x1008FF93 (XF86Battery) scancode not found
code = 237, sym = 0x1008FF94 (XF86Bluetooth) scancode not found
code = 238, sym = 0x1008FF95 (XF86WLAN) scancode not found


SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org


SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org

I’ve run into this problem too.

The patch still seems like a flaky/brittle solution. Does anyone know of a
better method for X11 layout detection?

Jonny D

IIRC, the XInput2 extension reports raw key events, before being processed
by the server. [1] I haven’t verified this, but it might be possible to
obtain key codes before layout mapping on the server, avoiding the layout
detection hack entirely.

That said, I wouldn’t be surprised if layout-independent scancodes turn out
impossible to implement through X11. In that case, the current hack is
pretty much the best it can get.

[1] http://who-t.blogspot.ch/2009/07/xi2-recipes-part-4.html

2014-03-23 21:02 GMT+01:00 Jonathan Dearborn :> I’ve run into this problem too.

The patch still seems like a flaky/brittle solution. Does anyone know of
a better method for X11 layout detection?

Jonny D


SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org