Commit 49f44286 authored by Sam Lantinga's avatar Sam Lantinga

First pass of new SDL scancode concept for X11.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%402717
parent 671a7085
...@@ -221,6 +221,7 @@ enum ...@@ -221,6 +221,7 @@ enum
SDLK_AUDIOPLAY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOPLAY), SDLK_AUDIOPLAY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOPLAY),
SDLK_AUDIOMUTE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOMUTE), SDLK_AUDIOMUTE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOMUTE),
SDLK_MEDIASELECT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIASELECT), SDLK_MEDIASELECT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIASELECT),
SDLK_WWW = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_WWW),
SDLK_MAIL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MAIL), SDLK_MAIL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MAIL),
SDLK_CALCULATOR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CALCULATOR), SDLK_CALCULATOR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CALCULATOR),
SDLK_COMPUTER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COMPUTER), SDLK_COMPUTER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COMPUTER),
......
...@@ -91,7 +91,7 @@ typedef enum ...@@ -91,7 +91,7 @@ typedef enum
SDL_SCANCODE_TAB = 43, SDL_SCANCODE_TAB = 43,
SDL_SCANCODE_SPACE = 44, SDL_SCANCODE_SPACE = 44,
SDL_SCANCODE_HYPHENMINUS = 45, SDL_SCANCODE_MINUS = 45,
SDL_SCANCODE_EQUALS = 46, SDL_SCANCODE_EQUALS = 46,
SDL_SCANCODE_LEFTBRACKET = 47, SDL_SCANCODE_LEFTBRACKET = 47,
SDL_SCANCODE_RIGHTBRACKET = 48, SDL_SCANCODE_RIGHTBRACKET = 48,
...@@ -286,27 +286,28 @@ typedef enum ...@@ -286,27 +286,28 @@ typedef enum
SDL_SCANCODE_AUDIOPLAY = 261, SDL_SCANCODE_AUDIOPLAY = 261,
SDL_SCANCODE_AUDIOMUTE = 262, SDL_SCANCODE_AUDIOMUTE = 262,
SDL_SCANCODE_MEDIASELECT = 263, SDL_SCANCODE_MEDIASELECT = 263,
SDL_SCANCODE_MAIL = 264, SDL_SCANCODE_WWW = 264,
SDL_SCANCODE_CALCULATOR = 265, SDL_SCANCODE_MAIL = 265,
SDL_SCANCODE_COMPUTER = 266, SDL_SCANCODE_CALCULATOR = 266,
SDL_SCANCODE_AC_SEARCH = 267, SDL_SCANCODE_COMPUTER = 267,
SDL_SCANCODE_AC_HOME = 268, SDL_SCANCODE_AC_SEARCH = 268,
SDL_SCANCODE_AC_BACK = 269, SDL_SCANCODE_AC_HOME = 269,
SDL_SCANCODE_AC_FORWARD = 270, SDL_SCANCODE_AC_BACK = 270,
SDL_SCANCODE_AC_STOP = 271, SDL_SCANCODE_AC_FORWARD = 271,
SDL_SCANCODE_AC_REFRESH = 272, SDL_SCANCODE_AC_STOP = 272,
SDL_SCANCODE_AC_BOOKMARKS = 273, SDL_SCANCODE_AC_REFRESH = 273,
SDL_SCANCODE_AC_BOOKMARKS = 274,
/* These are values that Christian Walther added (for mac keyboard?) */ /* These are values that Christian Walther added (for mac keyboard?) */
SDL_SCANCODE_BRIGHTNESSDOWN = 274, SDL_SCANCODE_BRIGHTNESSDOWN = 275,
SDL_SCANCODE_BRIGHTNESSUP = 275, SDL_SCANCODE_BRIGHTNESSUP = 276,
SDL_SCANCODE_DISPLAYSWITCH = 276, /**< display mirroring/dual display switch, video mode switch */ SDL_SCANCODE_DISPLAYSWITCH = 277, /**< display mirroring/dual display switch, video mode switch */
SDL_SCANCODE_KBDILLUMTOGGLE = 277, SDL_SCANCODE_KBDILLUMTOGGLE = 278,
SDL_SCANCODE_KBDILLUMDOWN = 278, SDL_SCANCODE_KBDILLUMDOWN = 279,
SDL_SCANCODE_KBDILLUMUP = 279, SDL_SCANCODE_KBDILLUMUP = 280,
SDL_SCANCODE_EJECT = 280, SDL_SCANCODE_EJECT = 281,
SDL_SCANCODE_SLEEP = 281, SDL_SCANCODE_SLEEP = 282,
/* Add any other keys here */ /* Add any other keys here */
......
...@@ -242,6 +242,7 @@ static SDLKey SDL_default_keymap[SDL_NUM_SCANCODES] = { ...@@ -242,6 +242,7 @@ static SDLKey SDL_default_keymap[SDL_NUM_SCANCODES] = {
SDLK_AUDIOPLAY, SDLK_AUDIOPLAY,
SDLK_AUDIOMUTE, SDLK_AUDIOMUTE,
SDLK_MEDIASELECT, SDLK_MEDIASELECT,
SDLK_WWW,
SDLK_MAIL, SDLK_MAIL,
SDLK_CALCULATOR, SDLK_CALCULATOR,
SDLK_COMPUTER, SDLK_COMPUTER,
...@@ -473,6 +474,7 @@ static const char *SDL_scancode_names[SDL_NUM_SCANCODES] = { ...@@ -473,6 +474,7 @@ static const char *SDL_scancode_names[SDL_NUM_SCANCODES] = {
"AudioPlay", "AudioPlay",
"AudioMute", "AudioMute",
"MediaSelect", "MediaSelect",
"WWW",
"Mail", "Mail",
"Calculator", "Calculator",
"Computer", "Computer",
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
- experimentation on various ADB and USB ISO keyboards and one ADB ANSI keyboard - experimentation on various ADB and USB ISO keyboards and one ADB ANSI keyboard
*/ */
/* *INDENT-OFF* */ /* *INDENT-OFF* */
static SDL_scancode scancode_table[128] = { static SDL_scancode darwin_scancode_table[] = {
/* 0 */ SDL_SCANCODE_A, /* 0 */ SDL_SCANCODE_A,
/* 1 */ SDL_SCANCODE_S, /* 1 */ SDL_SCANCODE_S,
/* 2 */ SDL_SCANCODE_D, /* 2 */ SDL_SCANCODE_D,
...@@ -55,7 +55,7 @@ static SDL_scancode scancode_table[128] = { ...@@ -55,7 +55,7 @@ static SDL_scancode scancode_table[128] = {
/* 24 */ SDL_SCANCODE_EQUALS, /* 24 */ SDL_SCANCODE_EQUALS,
/* 25 */ SDL_SCANCODE_9, /* 25 */ SDL_SCANCODE_9,
/* 26 */ SDL_SCANCODE_7, /* 26 */ SDL_SCANCODE_7,
/* 27 */ SDL_SCANCODE_HYPHENMINUS, /* 27 */ SDL_SCANCODE_MINUS,
/* 28 */ SDL_SCANCODE_8, /* 28 */ SDL_SCANCODE_8,
/* 29 */ SDL_SCANCODE_0, /* 29 */ SDL_SCANCODE_0,
/* 30 */ SDL_SCANCODE_RIGHTBRACKET, /* 30 */ SDL_SCANCODE_RIGHTBRACKET,
...@@ -91,7 +91,7 @@ static SDL_scancode scancode_table[128] = { ...@@ -91,7 +91,7 @@ static SDL_scancode scancode_table[128] = {
/* 60 */ SDL_SCANCODE_RSHIFT, /* 60 */ SDL_SCANCODE_RSHIFT,
/* 61 */ SDL_SCANCODE_RALT, /* 61 */ SDL_SCANCODE_RALT,
/* 62 */ SDL_SCANCODE_RCTRL, /* 62 */ SDL_SCANCODE_RCTRL,
/* 63 */ SDL_SCANCODE_UNKNOWN, /* fn on portables, acts as a hardware-level modifier already, so we don't generate events for it */ /* 63 */ SDL_SCANCODE_RGUI, /* fn on portables, acts as a hardware-level modifier already, so we don't generate events for it, also XK_Meta_R */
/* 64 */ SDL_SCANCODE_UNKNOWN, /* unknown (unused?) */ /* 64 */ SDL_SCANCODE_UNKNOWN, /* unknown (unused?) */
/* 65 */ SDL_SCANCODE_KP_PERIOD, /* 65 */ SDL_SCANCODE_KP_PERIOD,
/* 66 */ SDL_SCANCODE_UNKNOWN, /* unknown (unused?) */ /* 66 */ SDL_SCANCODE_UNKNOWN, /* unknown (unused?) */
......
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "../../include/SDL_scancode.h"
/* Linux virtual key code to SDLKey mapping table
Sources:
- Linux kernel source input.h
*/
/* *INDENT-OFF* */
static SDL_scancode linux_scancode_table[] = {
/* 0 */ SDL_SCANCODE_UNKNOWN,
/* 1 */ SDL_SCANCODE_ESCAPE,
/* 2 */ SDL_SCANCODE_1,
/* 3 */ SDL_SCANCODE_2,
/* 4 */ SDL_SCANCODE_3,
/* 5 */ SDL_SCANCODE_4,
/* 6 */ SDL_SCANCODE_5,
/* 7 */ SDL_SCANCODE_6,
/* 8 */ SDL_SCANCODE_7,
/* 9 */ SDL_SCANCODE_8,
/* 10 */ SDL_SCANCODE_9,
/* 11 */ SDL_SCANCODE_0,
/* 12 */ SDL_SCANCODE_MINUS,
/* 13 */ SDL_SCANCODE_EQUALS,
/* 14 */ SDL_SCANCODE_BACKSPACE,
/* 15 */ SDL_SCANCODE_TAB,
/* 16 */ SDL_SCANCODE_Q,
/* 17 */ SDL_SCANCODE_W,
/* 18 */ SDL_SCANCODE_E,
/* 19 */ SDL_SCANCODE_R,
/* 20 */ SDL_SCANCODE_T,
/* 21 */ SDL_SCANCODE_Y,
/* 22 */ SDL_SCANCODE_U,
/* 23 */ SDL_SCANCODE_I,
/* 24 */ SDL_SCANCODE_O,
/* 25 */ SDL_SCANCODE_P,
/* 26 */ SDL_SCANCODE_LEFTBRACKET,
/* 27 */ SDL_SCANCODE_RIGHTBRACKET,
/* 28 */ SDL_SCANCODE_RETURN,
/* 29 */ SDL_SCANCODE_LCTRL,
/* 30 */ SDL_SCANCODE_A,
/* 31 */ SDL_SCANCODE_S,
/* 32 */ SDL_SCANCODE_D,
/* 33 */ SDL_SCANCODE_F,
/* 34 */ SDL_SCANCODE_G,
/* 35 */ SDL_SCANCODE_H,
/* 36 */ SDL_SCANCODE_J,
/* 37 */ SDL_SCANCODE_K,
/* 38 */ SDL_SCANCODE_L,
/* 39 */ SDL_SCANCODE_SEMICOLON,
/* 40 */ SDL_SCANCODE_APOSTROPHE,
/* 41 */ SDL_SCANCODE_GRAVE,
/* 42 */ SDL_SCANCODE_LSHIFT,
/* 43 */ SDL_SCANCODE_BACKSLASH,
/* 44 */ SDL_SCANCODE_Z,
/* 45 */ SDL_SCANCODE_X,
/* 46 */ SDL_SCANCODE_C,
/* 47 */ SDL_SCANCODE_V,
/* 48 */ SDL_SCANCODE_B,
/* 49 */ SDL_SCANCODE_N,
/* 50 */ SDL_SCANCODE_M,
/* 51 */ SDL_SCANCODE_COMMA,
/* 52 */ SDL_SCANCODE_PERIOD,
/* 53 */ SDL_SCANCODE_SLASH,
/* 54 */ SDL_SCANCODE_RSHIFT,
/* 55 */ SDL_SCANCODE_KP_MULTIPLY,
/* 56 */ SDL_SCANCODE_LALT,
/* 57 */ SDL_SCANCODE_SPACE,
/* 58 */ SDL_SCANCODE_CAPSLOCK,
/* 59 */ SDL_SCANCODE_F1,
/* 60 */ SDL_SCANCODE_F2,
/* 61 */ SDL_SCANCODE_F3,
/* 62 */ SDL_SCANCODE_F4,
/* 63 */ SDL_SCANCODE_F5,
/* 64 */ SDL_SCANCODE_F6,
/* 65 */ SDL_SCANCODE_F7,
/* 66 */ SDL_SCANCODE_F8,
/* 67 */ SDL_SCANCODE_F9,
/* 68 */ SDL_SCANCODE_F10,
/* 69 */ SDL_SCANCODE_NUMLOCKCLEAR,
/* 70 */ SDL_SCANCODE_SCROLLLOCK,
/* 71 */ SDL_SCANCODE_KP_7,
/* 72 */ SDL_SCANCODE_KP_8,
/* 73 */ SDL_SCANCODE_KP_9,
/* 74 */ SDL_SCANCODE_KP_MINUS,
/* 75 */ SDL_SCANCODE_KP_4,
/* 76 */ SDL_SCANCODE_KP_5,
/* 77 */ SDL_SCANCODE_KP_6,
/* 78 */ SDL_SCANCODE_KP_PLUS,
/* 79 */ SDL_SCANCODE_KP_1,
/* 80 */ SDL_SCANCODE_KP_2,
/* 81 */ SDL_SCANCODE_KP_3,
/* 82 */ SDL_SCANCODE_KP_0,
/* 83 */ SDL_SCANCODE_KP_PERIOD,
0,
/* 85 */ SDL_SCANCODE_UNKNOWN, /* KEY_ZENKAKUHANKAKU */
/* 86 */ SDL_SCANCODE_NONUSBACKSLASH, /* KEY_102ND */
/* 87 */ SDL_SCANCODE_F11,
/* 88 */ SDL_SCANCODE_F12,
/* 89 */ SDL_SCANCODE_INTERNATIONAL1, /* KEY_RO */
/* 90 */ SDL_SCANCODE_LANG3, /* KEY_KATAKANA */
/* 91 */ SDL_SCANCODE_LANG4, /* KEY_HIRAGANA */
/* 92 */ SDL_SCANCODE_INTERNATIONAL4, /* KEY_HENKAN */
/* 93 */ SDL_SCANCODE_INTERNATIONAL2, /* KEY_KATAKANAHIRAGANA */
/* 94 */ SDL_SCANCODE_INTERNATIONAL5, /* KEY_MUHENKAN */
/* 95 */ SDL_SCANCODE_INTERNATIONAL5, /* KEY_KPJPCOMMA */
/* 96 */ SDL_SCANCODE_KP_ENTER,
/* 97 */ SDL_SCANCODE_RCTRL,
/* 98 */ SDL_SCANCODE_KP_DIVIDE,
/* 99 */ SDL_SCANCODE_SYSREQ,
/* 100 */ SDL_SCANCODE_RALT,
/* 101 */ SDL_SCANCODE_UNKNOWN, /* KEY_LINEFEED */
/* 102 */ SDL_SCANCODE_HOME,
/* 103 */ SDL_SCANCODE_UP,
/* 104 */ SDL_SCANCODE_PAGEUP,
/* 105 */ SDL_SCANCODE_LEFT,
/* 106 */ SDL_SCANCODE_RIGHT,
/* 107 */ SDL_SCANCODE_END,
/* 108 */ SDL_SCANCODE_DOWN,
/* 109 */ SDL_SCANCODE_PAGEDOWN,
/* 110 */ SDL_SCANCODE_INSERT,
/* 111 */ SDL_SCANCODE_DELETE,
/* 112 */ SDL_SCANCODE_UNKNOWN, /* KEY_MACRO */
/* 113 */ SDL_SCANCODE_MUTE,
/* 114 */ SDL_SCANCODE_VOLUMEDOWN,
/* 115 */ SDL_SCANCODE_VOLUMEUP,
/* 116 */ SDL_SCANCODE_POWER,
/* 117 */ SDL_SCANCODE_KP_EQUALS,
/* 118 */ SDL_SCANCODE_KP_PLUSMINUS,
/* 119 */ SDL_SCANCODE_PAUSE,
0,
/* 121 */ SDL_SCANCODE_KP_COMMA,
/* 122 */ SDL_SCANCODE_LANG1, /* KEY_HANGUEL */
/* 123 */ SDL_SCANCODE_LANG2, /* KEY_HANJA */
/* 124 */ SDL_SCANCODE_INTERNATIONAL3, /* KEY_YEN */
/* 125 */ SDL_SCANCODE_LGUI,
/* 126 */ SDL_SCANCODE_RGUI,
/* 127 */ SDL_SCANCODE_UNKNOWN, /* KEY_COMPOSE */
/* 128 */ SDL_SCANCODE_STOP,
/* 129 */ SDL_SCANCODE_AGAIN,
/* 130 */ SDL_SCANCODE_UNKNOWN, /* KEY_PROPS */
/* 131 */ SDL_SCANCODE_UNDO,
/* 132 */ SDL_SCANCODE_UNKNOWN, /* KEY_FRONT */
/* 133 */ SDL_SCANCODE_COPY,
/* 134 */ SDL_SCANCODE_UNKNOWN, /* KEY_OPEN */
/* 135 */ SDL_SCANCODE_PASTE,
/* 136 */ SDL_SCANCODE_FIND,
/* 137 */ SDL_SCANCODE_CUT,
/* 138 */ SDL_SCANCODE_HELP,
/* 139 */ SDL_SCANCODE_MENU,
/* 140 */ SDL_SCANCODE_CALCULATOR,
/* 141 */ SDL_SCANCODE_UNKNOWN, /* KEY_SETUP */
/* 142 */ SDL_SCANCODE_SLEEP,
/* 143 */ SDL_SCANCODE_UNKNOWN, /* KEY_WAKEUP */
/* 144 */ SDL_SCANCODE_UNKNOWN, /* KEY_FILE */
/* 145 */ SDL_SCANCODE_UNKNOWN, /* KEY_SENDFILE */
/* 146 */ SDL_SCANCODE_UNKNOWN, /* KEY_DELETEFILE */
/* 147 */ SDL_SCANCODE_UNKNOWN, /* KEY_XFER */
/* 148 */ SDL_SCANCODE_UNKNOWN, /* KEY_PROG1 */
/* 149 */ SDL_SCANCODE_UNKNOWN, /* KEY_PROG2 */
/* 150 */ SDL_SCANCODE_UNKNOWN, /* KEY_WWW */
/* 151 */ SDL_SCANCODE_UNKNOWN, /* KEY_MSDOS */
/* 152 */ SDL_SCANCODE_UNKNOWN, /* KEY_COFFEE */
/* 153 */ SDL_SCANCODE_UNKNOWN, /* KEY_DIRECTION */
/* 154 */ SDL_SCANCODE_UNKNOWN, /* KEY_CYCLEWINDOWS */
/* 155 */ SDL_SCANCODE_MAIL,
/* 156 */ SDL_SCANCODE_AC_BOOKMARKS,
/* 157 */ SDL_SCANCODE_COMPUTER,
/* 158 */ SDL_SCANCODE_AC_BACK,
/* 159 */ SDL_SCANCODE_AC_FORWARD,
/* 160 */ SDL_SCANCODE_UNKNOWN, /* KEY_CLOSECD */
/* 161 */ SDL_SCANCODE_EJECT, /* KEY_EJECTCD */
/* 162 */ SDL_SCANCODE_UNKNOWN, /* KEY_EJECTCLOSECD */
/* 163 */ SDL_SCANCODE_AUDIONEXT, /* KEY_NEXTSONG */
/* 164 */ SDL_SCANCODE_AUDIOPLAY, /* KEY_PLAYPAUSE */
/* 165 */ SDL_SCANCODE_AUDIOPREV, /* KEY_PREVIOUSSONG */
/* 166 */ SDL_SCANCODE_UNKNOWN, /* KEY_STOPCD */
/* 167 */ SDL_SCANCODE_UNKNOWN, /* KEY_RECORD */
/* 168 */ SDL_SCANCODE_UNKNOWN, /* KEY_REWIND */
/* 169 */ SDL_SCANCODE_UNKNOWN, /* KEY_PHONE */
/* 170 */ SDL_SCANCODE_UNKNOWN, /* KEY_ISO */
/* 171 */ SDL_SCANCODE_UNKNOWN, /* KEY_CONFIG */
/* 172 */ SDL_SCANCODE_AC_HOME,
/* 173 */ SDL_SCANCODE_AC_REFRESH,
/* 174 */ SDL_SCANCODE_UNKNOWN, /* KEY_EXIT */
/* 175 */ SDL_SCANCODE_UNKNOWN, /* KEY_MOVE */
/* 176 */ SDL_SCANCODE_UNKNOWN, /* KEY_EDIT */
/* 177 */ SDL_SCANCODE_UNKNOWN, /* KEY_SCROLLUP */
/* 178 */ SDL_SCANCODE_UNKNOWN, /* KEY_SCROLLDOWN */
/* 179 */ SDL_SCANCODE_KP_LEFTPAREN,
/* 180 */ SDL_SCANCODE_KP_RIGHTPAREN,
/* 181 */ SDL_SCANCODE_UNKNOWN, /* KEY_NEW */
/* 182 */ SDL_SCANCODE_UNKNOWN, /* KEY_REDO */
/* 183 */ SDL_SCANCODE_F13,
/* 184 */ SDL_SCANCODE_F14,
/* 185 */ SDL_SCANCODE_F15,
/* 186 */ SDL_SCANCODE_F16,
/* 187 */ SDL_SCANCODE_F17,
/* 188 */ SDL_SCANCODE_F18,
/* 189 */ SDL_SCANCODE_F19,
/* 190 */ SDL_SCANCODE_F20,
/* 191 */ SDL_SCANCODE_F21,
/* 192 */ SDL_SCANCODE_F22,
/* 193 */ SDL_SCANCODE_F23,
/* 194 */ SDL_SCANCODE_F24,
0, 0, 0, 0,
/* 200 */ SDL_SCANCODE_UNKNOWN, /* KEY_PLAYCD */
/* 201 */ SDL_SCANCODE_UNKNOWN, /* KEY_PAUSECD */
/* 202 */ SDL_SCANCODE_UNKNOWN, /* KEY_PROG3 */
/* 203 */ SDL_SCANCODE_UNKNOWN, /* KEY_PROG4 */
0,
/* 205 */ SDL_SCANCODE_UNKNOWN, /* KEY_SUSPEND */
/* 206 */ SDL_SCANCODE_UNKNOWN, /* KEY_CLOSE */
/* 207 */ SDL_SCANCODE_UNKNOWN, /* KEY_PLAY */
/* 208 */ SDL_SCANCODE_UNKNOWN, /* KEY_FASTFORWARD */
/* 209 */ SDL_SCANCODE_UNKNOWN, /* KEY_BASSBOOST */
/* 210 */ SDL_SCANCODE_UNKNOWN, /* KEY_PRINT */
/* 211 */ SDL_SCANCODE_UNKNOWN, /* KEY_HP */
/* 212 */ SDL_SCANCODE_UNKNOWN, /* KEY_CAMERA */
/* 213 */ SDL_SCANCODE_UNKNOWN, /* KEY_SOUND */
/* 214 */ SDL_SCANCODE_UNKNOWN, /* KEY_QUESTION */
/* 215 */ SDL_SCANCODE_UNKNOWN, /* KEY_EMAIL */
/* 216 */ SDL_SCANCODE_UNKNOWN, /* KEY_CHAT */
/* 217 */ SDL_SCANCODE_AC_SEARCH,
/* 218 */ SDL_SCANCODE_UNKNOWN, /* KEY_CONNECT */
/* 219 */ SDL_SCANCODE_UNKNOWN, /* KEY_FINANCE */
/* 220 */ SDL_SCANCODE_UNKNOWN, /* KEY_SPORT */
/* 221 */ SDL_SCANCODE_UNKNOWN, /* KEY_SHOP */
/* 222 */ SDL_SCANCODE_ALTERASE,
/* 223 */ SDL_SCANCODE_CANCEL,
/* 224 */ SDL_SCANCODE_BRIGHTNESSDOWN,
/* 225 */ SDL_SCANCODE_BRIGHTNESSUP,
/* 226 */ SDL_SCANCODE_UNKNOWN, /* KEY_MEDIA */
/* 227 */ SDL_SCANCODE_DISPLAYSWITCH, /* KEY_SWITCHVIDEOMODE */
/* 228 */ SDL_SCANCODE_KBDILLUMTOGGLE,
/* 229 */ SDL_SCANCODE_KBDILLUMDOWN,
/* 230 */ SDL_SCANCODE_KBDILLUMUP,
/* 231 */ SDL_SCANCODE_UNKNOWN, /* KEY_SEND */
/* 232 */ SDL_SCANCODE_UNKNOWN, /* KEY_REPLY */
/* 233 */ SDL_SCANCODE_UNKNOWN, /* KEY_FORWARDMAIL */
/* 234 */ SDL_SCANCODE_UNKNOWN, /* KEY_SAVE */
/* 235 */ SDL_SCANCODE_UNKNOWN, /* KEY_DOCUMENTS */
/* 236 */ SDL_SCANCODE_UNKNOWN, /* KEY_BATTERY */
};
/* *INDENT-ON* */
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2006 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "../../include/SDL_scancode.h"
/* XFree86 key code to SDL scancode mapping table
Sources:
- atKeyNames.h from XFree86 source code
*/
/* *INDENT-OFF* */
static SDL_scancode xfree86_scancode_table[] = {
/* 0 */ SDL_SCANCODE_UNKNOWN,
/* 1 */ SDL_SCANCODE_ESCAPE,
/* 2 */ SDL_SCANCODE_1,
/* 3 */ SDL_SCANCODE_2,
/* 4 */ SDL_SCANCODE_3,
/* 5 */ SDL_SCANCODE_4,
/* 6 */ SDL_SCANCODE_5,
/* 7 */ SDL_SCANCODE_6,
/* 8 */ SDL_SCANCODE_7,
/* 9 */ SDL_SCANCODE_8,
/* 10 */ SDL_SCANCODE_9,
/* 11 */ SDL_SCANCODE_0,
/* 12 */ SDL_SCANCODE_MINUS,
/* 13 */ SDL_SCANCODE_EQUALS,
/* 14 */ SDL_SCANCODE_BACKSPACE,
/* 15 */ SDL_SCANCODE_TAB,
/* 16 */ SDL_SCANCODE_Q,
/* 17 */ SDL_SCANCODE_W,
/* 18 */ SDL_SCANCODE_E,
/* 19 */ SDL_SCANCODE_R,
/* 20 */ SDL_SCANCODE_T,
/* 21 */ SDL_SCANCODE_Y,
/* 22 */ SDL_SCANCODE_U,
/* 23 */ SDL_SCANCODE_I,
/* 24 */ SDL_SCANCODE_O,
/* 25 */ SDL_SCANCODE_P,
/* 26 */ SDL_SCANCODE_LEFTBRACKET,
/* 27 */ SDL_SCANCODE_RIGHTBRACKET,
/* 28 */ SDL_SCANCODE_RETURN,
/* 29 */ SDL_SCANCODE_LCTRL,
/* 30 */ SDL_SCANCODE_A,
/* 31 */ SDL_SCANCODE_S,
/* 32 */ SDL_SCANCODE_D,
/* 33 */ SDL_SCANCODE_F,
/* 34 */ SDL_SCANCODE_G,
/* 35 */ SDL_SCANCODE_H,
/* 36 */ SDL_SCANCODE_J,
/* 37 */ SDL_SCANCODE_K,
/* 38 */ SDL_SCANCODE_L,
/* 39 */ SDL_SCANCODE_SEMICOLON,
/* 40 */ SDL_SCANCODE_APOSTROPHE,
/* 41 */ SDL_SCANCODE_GRAVE,
/* 42 */ SDL_SCANCODE_LSHIFT,
/* 43 */ SDL_SCANCODE_BACKSLASH,
/* 44 */ SDL_SCANCODE_Z,
/* 45 */ SDL_SCANCODE_X,
/* 46 */ SDL_SCANCODE_C,
/* 47 */ SDL_SCANCODE_V,
/* 48 */ SDL_SCANCODE_B,
/* 49 */ SDL_SCANCODE_N,
/* 50 */ SDL_SCANCODE_M,
/* 51 */ SDL_SCANCODE_COMMA,
/* 52 */ SDL_SCANCODE_PERIOD,
/* 53 */ SDL_SCANCODE_SLASH,
/* 54 */ SDL_SCANCODE_RSHIFT,
/* 55 */ SDL_SCANCODE_KP_MULTIPLY,
/* 56 */ SDL_SCANCODE_LALT,
/* 57 */ SDL_SCANCODE_SPACE,
/* 58 */ SDL_SCANCODE_CAPSLOCK,
/* 59 */ SDL_SCANCODE_F1,
/* 60 */ SDL_SCANCODE_F2,
/* 61 */ SDL_SCANCODE_F3,
/* 62 */ SDL_SCANCODE_F4,
/* 63 */ SDL_SCANCODE_F5,
/* 64 */ SDL_SCANCODE_F6,
/* 65 */ SDL_SCANCODE_F7,
/* 66 */ SDL_SCANCODE_F8,
/* 67 */ SDL_SCANCODE_F9,
/* 68 */ SDL_SCANCODE_F10,
/* 69 */ SDL_SCANCODE_NUMLOCKCLEAR,
/* 70 */ SDL_SCANCODE_SCROLLLOCK,
/* 71 */ SDL_SCANCODE_KP_7,
/* 72 */ SDL_SCANCODE_KP_8,
/* 73 */ SDL_SCANCODE_KP_9,
/* 74 */ SDL_SCANCODE_KP_MINUS,
/* 75 */ SDL_SCANCODE_KP_4,
/* 76 */ SDL_SCANCODE_KP_5,
/* 77 */ SDL_SCANCODE_KP_6,
/* 78 */ SDL_SCANCODE_KP_PLUS,
/* 79 */ SDL_SCANCODE_KP_1,
/* 80 */ SDL_SCANCODE_KP_2,
/* 81 */ SDL_SCANCODE_KP_3,
/* 82 */ SDL_SCANCODE_KP_0,
/* 83 */ SDL_SCANCODE_KP_PERIOD,
/* 84 */ SDL_SCANCODE_SYSREQ,
/* 85 */ SDL_SCANCODE_MODE,
/* 86 */ SDL_SCANCODE_NONUSBACKSLASH,
/* 87 */ SDL_SCANCODE_F11,
/* 88 */ SDL_SCANCODE_F12,
/* 89 */ SDL_SCANCODE_HOME,
/* 90 */ SDL_SCANCODE_UP,
/* 91 */ SDL_SCANCODE_PAGEUP,
/* 92 */ SDL_SCANCODE_LEFT,
/* 93 */ SDL_SCANCODE_BRIGHTNESSDOWN, /* on PowerBook G4 / KEY_Begin */
/* 94 */ SDL_SCANCODE_RIGHT,
/* 95 */ SDL_SCANCODE_END,
/* 96 */ SDL_SCANCODE_DOWN,
/* 97 */ SDL_SCANCODE_PAGEDOWN,
/* 98 */ SDL_SCANCODE_INSERT,
/* 99 */ SDL_SCANCODE_DELETE,
/* 100 */ SDL_SCANCODE_KP_ENTER,
/* 101 */ SDL_SCANCODE_RCTRL,
/* 102 */ SDL_SCANCODE_PAUSE,
/* 103 */ SDL_SCANCODE_PRINTSCREEN,
/* 104 */ SDL_SCANCODE_KP_DIVIDE,
/* 105 */ SDL_SCANCODE_RALT,
/* 106 */ SDL_SCANCODE_UNKNOWN, /* BREAK */
/* 107 */ SDL_SCANCODE_LGUI,
/* 108 */ SDL_SCANCODE_RGUI,
/* 109 */ SDL_SCANCODE_APPLICATION,
/* 110 */ SDL_SCANCODE_F13,
/* 111 */ SDL_SCANCODE_F14,
/* 112 */ SDL_SCANCODE_F15,
/* 113 */ SDL_SCANCODE_F16,
/* 114 */ SDL_SCANCODE_F17,
/* 115 */ SDL_SCANCODE_UNKNOWN,
/* 116 */ SDL_SCANCODE_UNKNOWN, /* is translated to XK_ISO_Level3_Shift by my X server, but I have no keyboard that generates this code, so I don't know what the correct SDL_SCANCODE_* for it is */
/* 117 */ SDL_SCANCODE_UNKNOWN,
/* 118 */ SDL_SCANCODE_KP_EQUALS,
/* 119 */ SDL_SCANCODE_UNKNOWN,
/* 120 */ SDL_SCANCODE_UNKNOWN,
/* 121 */ SDL_SCANCODE_UNKNOWN,
/* 122 */ SDL_SCANCODE_UNKNOWN,
/* 123 */ SDL_SCANCODE_UNKNOWN,
/* 124 */ SDL_SCANCODE_UNKNOWN,
/* 125 */ SDL_SCANCODE_INTERNATIONAL3, /* Yen */
/* 126 */ SDL_SCANCODE_UNKNOWN,
/* 127 */ SDL_SCANCODE_UNKNOWN,
/* 128 */ SDL_SCANCODE_UNKNOWN,
/* 129 */ SDL_SCANCODE_UNKNOWN,
/* 130 */ SDL_SCANCODE_UNKNOWN,
/* 131 */ SDL_SCANCODE_UNKNOWN,
/* 132 */ SDL_SCANCODE_POWER,
/* 133 */ SDL_SCANCODE_MUTE,
/* 134 */ SDL_SCANCODE_VOLUMEDOWN,
/* 135 */ SDL_SCANCODE_VOLUMEUP,
/* 136 */ SDL_SCANCODE_HELP,
/* 137 */ SDL_SCANCODE_STOP,
/* 138 */ SDL_SCANCODE_AGAIN,
/* 139 */ SDL_SCANCODE_UNKNOWN, /* PROPS */
/* 140 */ SDL_SCANCODE_UNDO,
/* 141 */ SDL_SCANCODE_UNKNOWN, /* FRONT */
/* 142 */ SDL_SCANCODE_COPY,
/* 143 */ SDL_SCANCODE_UNKNOWN, /* OPEN */
/* 144 */ SDL_SCANCODE_PASTE,
/* 145 */ SDL_SCANCODE_FIND,
/* 146 */ SDL_SCANCODE_CUT,
};
/* *INDENT-ON* */
...@@ -22,9 +22,9 @@ ...@@ -22,9 +22,9 @@
#include "SDL_config.h" #include "SDL_config.h"
#include "SDL_cocoavideo.h" #include "SDL_cocoavideo.h"
#include "SDL_cocoakeys.h"
#include "../../events/SDL_keyboard_c.h" #include "../../events/SDL_keyboard_c.h"
#include "../../events/scancodes_darwin.h"
#include <Carbon/Carbon.h> #include <Carbon/Carbon.h>
...@@ -372,13 +372,13 @@ UpdateKeymap(SDL_VideoData *data) ...@@ -372,13 +372,13 @@ UpdateKeymap(SDL_VideoData *data)
UInt32 keyboard_type = LMGetKbdType(); UInt32 keyboard_type = LMGetKbdType();
OSStatus err; OSStatus err;
for (i = 0; i < SDL_arraysize(scancode_table); i++) { for (i = 0; i < SDL_arraysize(darwin_scancode_table); i++) {
UniChar s[8]; UniChar s[8];
UniCharCount len; UniCharCount len;
UInt32 dead_key_state; UInt32 dead_key_state;
/* Make sure this scancode is a valid character scancode */ /* Make sure this scancode is a valid character scancode */
scancode = scancode_table[i]; scancode = darwin_scancode_table[i];
if (scancode == SDL_SCANCODE_UNKNOWN || if (scancode == SDL_SCANCODE_UNKNOWN ||
(keymap[scancode] & SDLK_SCANCODE_MASK)) { (keymap[scancode] & SDLK_SCANCODE_MASK)) {
continue; continue;
...@@ -407,7 +407,7 @@ UpdateKeymap(SDL_VideoData *data) ...@@ -407,7 +407,7 @@ UpdateKeymap(SDL_VideoData *data)
UInt32 c, state = 0; UInt32 c, state = 0;
/* Make sure this scancode is a valid character scancode */ /* Make sure this scancode is a valid character scancode */
scancode = scancode_table[i]; scancode = darwin_scancode_table[i];
if (scancode == SDL_SCANCODE_UNKNOWN || if (scancode == SDL_SCANCODE_UNKNOWN ||
(keymap[scancode] & SDLK_SCANCODE_MASK)) { (keymap[scancode] & SDLK_SCANCODE_MASK)) {
continue; continue;
...@@ -487,8 +487,8 @@ Cocoa_HandleKeyEvent(_THIS, NSEvent *event) ...@@ -487,8 +487,8 @@ Cocoa_HandleKeyEvent(_THIS, NSEvent *event)
/* see comments in SDL_cocoakeys.h */ /* see comments in SDL_cocoakeys.h */
scancode = 60 - scancode; scancode = 60 - scancode;
} }
if (scancode < SDL_arraysize(scancode_table)) { if (scancode < SDL_arraysize(darwin_scancode_table)) {
code = scancode_table[scancode]; code = darwin_scancode_table[scancode];
} }
else { else {
/* Hmm, does this ever happen? If so, need to extend the keymap... */ /* Hmm, does this ever happen? If so, need to extend the keymap... */
......
...@@ -140,6 +140,15 @@ X11_DispatchEvent(_THIS) ...@@ -140,6 +140,15 @@ X11_DispatchEvent(_THIS)
} }
break; break;
/* Has the keyboard layout changed? */
case MappingNotify:{
#ifdef DEBUG_XEVENTS
printf("MappingNotify!\n");
#endif
X11_UpdateKeymap(this);
}
break;
/* Mouse motion? */ /* Mouse motion? */
case MotionNotify:{ case MotionNotify:{
#ifdef DEBUG_MOTION #ifdef DEBUG_MOTION
...@@ -174,23 +183,25 @@ X11_DispatchEvent(_THIS) ...@@ -174,23 +183,25 @@ X11_DispatchEvent(_THIS)
#ifdef DEBUG_XEVENTS #ifdef DEBUG_XEVENTS
printf("KeyPress (X11 keycode = 0x%X)\n", xevent.xkey.keycode); printf("KeyPress (X11 keycode = 0x%X)\n", xevent.xkey.keycode);
#endif #endif
SDLKey physicalKey = videodata->keyCodeToSDLKTable[keycode];
SDL_SendKeyboardKey(videodata->keyboard, SDL_PRESSED, SDL_SendKeyboardKey(videodata->keyboard, SDL_PRESSED,
(Uint8) keycode, physicalKey); videodata->key_layout[keycode]);
#if 1 #if 1
if (physicalKey == SDLK_UNKNOWN) { if (videodata->key_layout[keycode] == SDLK_UNKNOWN) {
int min_keycode, max_keycode;
XDisplayKeycodes(videodata->display, &min_keycode,
&max_keycode);
keysym = XKeycodeToKeysym(videodata->display, keycode, 0);
fprintf(stderr, fprintf(stderr,
"The key you just pressed is not recognized by SDL. To help get this fixed, report this to the SDL mailing list <sdl@libsdl.org> or to Christian Walther <cwalther@gmx.ch>. X11 KeyCode is %d, X11 KeySym 0x%X.\n", "The key you just pressed is not recognized by SDL. To help get this fixed, please report this to the SDL mailing list <sdl@libsdl.org> X11 KeyCode %d (%d), X11 KeySym 0x%X (%s).\n",
(int) keycode, keycode, keycode - min_keycode, keysym,
(unsigned int) XKeycodeToKeysym(videodata->display, XKeysymToString(keysym));
keycode, 0));
} }
#endif #endif
/* works for Latin-1 */ /* Xutf8LookupString(), works for Latin-1 */
SDL_memset(&text[0], 0, SDL_TEXTINPUTEVENT_TEXT_SIZE); SDL_zero(text);
/* Xutf8LookupString() */
XLookupString(&xevent, text, sizeof(text), &keysym, NULL); XLookupString(&xevent, text, sizeof(text), &keysym, NULL);
if (0 != SDL_strlen(text)) { if (*text) {
printf("Sending text event %s\n", text);
SDL_SendKeyboardText(videodata->keyboard, text); SDL_SendKeyboardText(videodata->keyboard, text);
} }
} }
...@@ -204,8 +215,7 @@ X11_DispatchEvent(_THIS) ...@@ -204,8 +215,7 @@ X11_DispatchEvent(_THIS)
printf("KeyRelease (X11 keycode = 0x%X)\n", xevent.xkey.keycode); printf("KeyRelease (X11 keycode = 0x%X)\n", xevent.xkey.keycode);
#endif #endif
SDL_SendKeyboardKey(videodata->keyboard, SDL_RELEASED, SDL_SendKeyboardKey(videodata->keyboard, SDL_RELEASED,
(Uint8) keycode, videodata->key_layout[keycode]);
videodata->keyCodeToSDLKTable[keycode]);
} }
break; break;
......
...@@ -24,1007 +24,376 @@ ...@@ -24,1007 +24,376 @@
#include "SDL_x11video.h" #include "SDL_x11video.h"
#include "../../events/SDL_keyboard_c.h" #include "../../events/SDL_keyboard_c.h"
#include "../../events/scancodes_darwin.h"
#include "../../events/scancodes_xfree86.h"
#include <X11/keysym.h> #include <X11/keysym.h>
#include "imKStoUCS.h" #include "imKStoUCS.h"
/* static KeySym XKeySymTable[SDL_NUM_SCANCODES] = {
KeyCode-to-SDLKey translation tables for various X servers. Which 0, 0, 0, 0,
one to use is decided in X11_InitKeyboard(). XK_a,
*/ XK_b,
XK_c,
static SDLKey macKeyCodeToSDLK[]; XK_d,
static SDLKey xorgLinuxKeyCodeToSDLK[]; XK_e,
XK_f,
static SDLKey *keyCodeToSDLKeyTables[] = { XK_g,
xorgLinuxKeyCodeToSDLK, XK_h,
macKeyCodeToSDLK, XK_i,
NULL XK_j,
}; XK_k,
XK_l,
/* *INDENT-OFF* */ XK_m,
XK_n,
/* These are just Mac virtual key codes + 8 (see SDL/src/video/cocoa/ XK_o,
SDL_cocoakeys.h for more info). Observed to work with Apple X11 on XK_p,
Mac OS X 10.4. May also work on older Linux distributions on Mac XK_q,
hardware. XK_r,
*/ XK_s,
XK_t,
#define KeyCodeTableSize (256) XK_u,
static SDLKey macKeyCodeToSDLK[KeyCodeTableSize] = XK_v,
{ XK_w,
/* 0 */ SDLK_UNKNOWN, XK_x,
/* 1 */ SDLK_UNKNOWN, XK_y,
/* 2 */ SDLK_UNKNOWN, XK_z,
/* 3 */ SDLK_UNKNOWN, XK_1,
/* 4 */ SDLK_UNKNOWN, XK_2,
/* 5 */ SDLK_UNKNOWN, XK_3,
/* 6 */ SDLK_UNKNOWN, XK_4,
/* 7 */ SDLK_UNKNOWN, XK_5,
/* 8 */ SDLK_A, XK_6,
/* 9 */ SDLK_S, XK_7,
/* 10 */ SDLK_D, XK_8,
/* 11 */ SDLK_F, XK_9,
/* 12 */ SDLK_H, XK_0,
/* 13 */ SDLK_G, XK_Return,
/* 14 */ SDLK_Z, XK_Escape,
/* 15 */ SDLK_X, XK_BackSpace,
/* 16 */ SDLK_C, XK_Tab,
/* 17 */ SDLK_V, XK_space,
/* 18 */ SDLK_GRAVE, XK_minus,
/* 19 */ SDLK_B, XK_equal,
/* 20 */ SDLK_Q, XK_bracketleft,
/* 21 */ SDLK_W, XK_bracketright,
/* 22 */ SDLK_E, XK_backslash,
/* 23 */ SDLK_R, 0, /* SDL_SCANCODE_NONUSHASH ? */
/* 24 */ SDLK_Y, XK_semicolon,
/* 25 */ SDLK_T, XK_apostrophe,
/* 26 */ SDLK_1, XK_grave,
/* 27 */ SDLK_2, XK_comma,
/* 28 */ SDLK_3, XK_period,
/* 29 */ SDLK_4, XK_slash,
/* 30 */ SDLK_6, XK_Caps_Lock,
/* 31 */ SDLK_5, XK_F1,
/* 32 */ SDLK_EQUALS, XK_F2,
/* 33 */ SDLK_9, XK_F3,
/* 34 */ SDLK_7, XK_F4,
/* 35 */ SDLK_HYPHENMINUS, XK_F5,
/* 36 */ SDLK_8, XK_F6,
/* 37 */ SDLK_0, XK_F7,
/* 38 */ SDLK_RIGHTBRACKET, XK_F8,
/* 39 */ SDLK_O, XK_F9,
/* 40 */ SDLK_U, XK_F10,
/* 41 */ SDLK_LEFTBRACKET, XK_F11,
/* 42 */ SDLK_I, XK_F12,
/* 43 */ SDLK_P, XK_Print,
/* 44 */ SDLK_RETURN, XK_Scroll_Lock,
/* 45 */ SDLK_L, XK_Pause,
/* 46 */ SDLK_J, XK_Insert,
/* 47 */ SDLK_APOSTROPHE, XK_Home,
/* 48 */ SDLK_K, XK_Prior,
/* 49 */ SDLK_SEMICOLON, XK_Delete,
/* 50 */ SDLK_BACKSLASH, XK_End,
/* 51 */ SDLK_COMMA, XK_Next,
/* 52 */ SDLK_SLASH, XK_Right,
/* 53 */ SDLK_N, XK_Left,
/* 54 */ SDLK_M, XK_Down,
/* 55 */ SDLK_PERIOD, XK_Up,
/* 56 */ SDLK_TAB, XK_Num_Lock,
/* 57 */ SDLK_SPACE, XK_KP_Divide,
/* 58 */ SDLK_NONUSBACKSLASH, XK_KP_Multiply,
/* 59 */ SDLK_BACKSPACE, XK_KP_Subtract,
/* 60 */ SDLK_KP_ENTER, XK_KP_Add,
/* 61 */ SDLK_ESCAPE, XK_KP_Enter,
/* 62 */ SDLK_RMETA, XK_KP_1,
/* 63 */ SDLK_LMETA, XK_KP_2,
/* 64 */ SDLK_LSHIFT, XK_KP_3,
/* 65 */ SDLK_CAPSLOCK, XK_KP_4,
/* 66 */ SDLK_LALT, XK_KP_5,
/* 67 */ SDLK_LCTRL, XK_KP_6,
/* 68 */ SDLK_RSHIFT, XK_KP_7,
/* 69 */ SDLK_RALT, XK_KP_8,
/* 70 */ SDLK_RCTRL, XK_KP_9,
/* 71 */ SDLK_NONE, XK_KP_0,
/* 72 */ SDLK_UNKNOWN, XK_KP_Decimal,
/* 73 */ SDLK_KP_PERIOD, 0, /* SDL_SCANCODE_NONUSBACKSLASH ? */
/* 74 */ SDLK_UNKNOWN, XK_Hyper_R,
/* 75 */ SDLK_KP_MULTIPLY, 0, /* SDL_SCANCODE_POWER ? */
/* 76 */ SDLK_UNKNOWN, XK_KP_Equal,
/* 77 */ SDLK_KP_PLUS, XK_F13,
/* 78 */ SDLK_UNKNOWN, XK_F14,
/* 79 */ SDLK_KP_NUMLOCKCLEAR, XK_F15,
/* 80 */ SDLK_VOLUMEUP, XK_F16,
/* 81 */ SDLK_VOLUMEDOWN, XK_F17,
/* 82 */ SDLK_MUTE, XK_F18,
/* 83 */ SDLK_KP_DIVIDE, XK_F19,
/* 84 */ SDLK_KP_ENTER, XK_F20,
/* 85 */ SDLK_UNKNOWN, XK_F21,
/* 86 */ SDLK_KP_MINUS, XK_F22,
/* 87 */ SDLK_UNKNOWN, XK_F23,
/* 88 */ SDLK_UNKNOWN, XK_F24,
/* 89 */ SDLK_KP_EQUALS, XK_Execute,
/* 90 */ SDLK_KP_0, XK_Help,
/* 91 */ SDLK_KP_1, XK_Menu,
/* 92 */ SDLK_KP_2, XK_Select,
/* 93 */ SDLK_KP_3, XK_Cancel,
/* 94 */ SDLK_KP_4, XK_Redo,
/* 95 */ SDLK_KP_5, XK_Undo,
/* 96 */ SDLK_KP_6, 0, /* SDL_SCANCODE_CUT ? */
/* 97 */ SDLK_KP_7, 0, /* SDL_SCANCODE_COPY ? */
/* 98 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_PASTE ? */
/* 99 */ SDLK_KP_8, XK_Find,
/* 100 */ SDLK_KP_9, 0, /* SDL_SCANCODE_MUTE ? */
/* 101 */ SDLK_INTERNATIONAL3, 0, /* SDL_SCANCODE_VOLUMEUP ? */
/* 102 */ SDLK_INTERNATIONAL1, 0, /* SDL_SCANCODE_VOLUMEDOWN ? */
/* 103 */ SDLK_KP_COMMA, 0, 0, 0,
/* 104 */ SDLK_F5, XK_KP_Separator,
/* 105 */ SDLK_F6, 0, /* SDL_SCANCODE_KP_EQUALSAS400 ? */
/* 106 */ SDLK_F7, 0, /* SDL_SCANCODE_INTERNATIONAL1 ? */
/* 107 */ SDLK_F3, 0, /* SDL_SCANCODE_INTERNATIONAL2 ? */
/* 108 */ SDLK_F8, 0, /* SDL_SCANCODE_INTERNATIONAL3 ? */
/* 109 */ SDLK_F9, 0, /* SDL_SCANCODE_INTERNATIONAL4 ? */
/* 110 */ SDLK_LANG2, 0, /* SDL_SCANCODE_INTERNATIONAL5 ? */
/* 111 */ SDLK_F11, 0, /* SDL_SCANCODE_INTERNATIONAL6 ? */
/* 112 */ SDLK_LANG1, 0, /* SDL_SCANCODE_INTERNATIONAL7 ? */
/* 113 */ SDLK_PRINTSCREEN, 0, /* SDL_SCANCODE_INTERNATIONAL8 ? */
/* 114 */ SDLK_F16, 0, /* SDL_SCANCODE_INTERNATIONAL9 ? */
/* 115 */ SDLK_SCROLLLOCK, 0, /* SDL_SCANCODE_LANG1 ? */
/* 116 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_LANG2 ? */
/* 117 */ SDLK_F10, 0, /* SDL_SCANCODE_LANG3 ? */
/* 118 */ SDLK_APPLICATION, 0, /* SDL_SCANCODE_LANG4 ? */
/* 119 */ SDLK_F12, 0, /* SDL_SCANCODE_LANG5 ? */
/* 120 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_LANG6 ? */
/* 121 */ SDLK_PAUSE, 0, /* SDL_SCANCODE_LANG7 ? */
/* 122 */ SDLK_INSERT, 0, /* SDL_SCANCODE_LANG8 ? */
/* 123 */ SDLK_HOME, 0, /* SDL_SCANCODE_LANG9 ? */
/* 124 */ SDLK_PAGEUP, 0, /* SDL_SCANCODE_ALTERASE ? */
/* 125 */ SDLK_DELETE, XK_Sys_Req,
/* 126 */ SDLK_F4, 0, /* SDL_SCANCODE_CANCEL ? - XK_Cancel was used above... */
/* 127 */ SDLK_END, 0, /* SDL_SCANCODE_CLEAR ? */
/* 128 */ SDLK_F2, 0, /* SDL_SCANCODE_PRIOR ? - XK_Prior was used above... */
/* 129 */ SDLK_PAGEDOWN, 0, /* SDL_SCANCODE_RETURN2 ? */
/* 130 */ SDLK_F1, 0, /* SDL_SCANCODE_SEPARATOR ? */
/* 131 */ SDLK_LEFT, 0, /* SDL_SCANCODE_OUT ? */
/* 132 */ SDLK_RIGHT, 0, /* SDL_SCANCODE_OPER ? */
/* 133 */ SDLK_DOWN, 0, /* SDL_SCANCODE_CLEARAGAIN ? */
/* 134 */ SDLK_UP, 0, /* SDL_SCANCODE_CRSEL ? */
/* 135 */ SDLK_POWER, 0, /* SDL_SCANCODE_EXSEL ? */
/* 136 */ SDLK_UNKNOWN, /* codes higher than 135 shouldn't occur as Mac virtual keycodes only go to 127 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 137 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_00 ? */
/* 138 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_000 ? */
/* 139 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_THOUSANDSSEPARATOR ? */
/* 140 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_DECIMALSEPARATOR ? */
/* 141 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_CURRENCYUNIT ? */
/* 142 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_CURRENCYSUBUNIT ? */
/* 143 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_LEFTPAREN ? */
/* 144 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_RIGHTPAREN ? */
/* 145 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_LEFTBRACE ? */
/* 146 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_RIGHTBRACE ? */
/* 147 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_TAB ? */
/* 148 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_BACKSPACE ? */
/* 149 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_A ? */
/* 150 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_B ? */
/* 151 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_C ? */
/* 152 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_D ? */
/* 153 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_E ? */
/* 154 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_F ? */
/* 155 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_XOR ? */
/* 156 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_POWER ? */
/* 157 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_PERCENT ? */
/* 158 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_LESS ? */
/* 159 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_GREATER ? */
/* 160 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_AMPERSAND ? */
/* 161 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_DBLAMPERSAND ? */
/* 162 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_VERTICALBAR ? */
/* 163 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_DBLVERTICALBAR ? */
/* 164 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_COLON ? */
/* 165 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_HASH ? */
/* 166 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_SPACE ? */
/* 167 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_AT ? */
/* 168 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_EXCLAM ? */
/* 169 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_MEMSTORE ? */
/* 170 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_MEMRECALL ? */
/* 171 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_MEMCLEAR ? */
/* 172 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_MEMADD ? */
/* 173 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_MEMSUBTRACT ? */
/* 174 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_MEMMULTIPLY ? */
/* 175 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_MEMDIVIDE ? */
/* 176 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_PLUSMINUS ? */
/* 177 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_CLEAR ? */
/* 178 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_CLEARENTRY ? */
/* 179 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_BINARY ? */
/* 180 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_OCTAL ? */
/* 181 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_DECIMAL ? */
/* 182 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KP_HEXADECIMAL ? */
/* 183 */ SDLK_UNKNOWN, 0, 0,
/* 184 */ SDLK_UNKNOWN, XK_Control_L,
/* 185 */ SDLK_UNKNOWN, XK_Shift_L,
/* 186 */ SDLK_UNKNOWN, XK_Alt_L,
/* 187 */ SDLK_UNKNOWN, XK_Meta_L,
/* 188 */ SDLK_UNKNOWN, XK_Control_R,
/* 189 */ SDLK_UNKNOWN, XK_Shift_R,
/* 190 */ SDLK_UNKNOWN, XK_Alt_R,
/* 191 */ SDLK_UNKNOWN, XK_Meta_R,
/* 192 */ SDLK_UNKNOWN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 193 */ SDLK_UNKNOWN, XK_Mode_switch /*XK_ISO_Level3_Shift */ ,
/* 194 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_AUDIONEXT ? */
/* 195 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_AUDIOPREV ? */
/* 196 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_AUDIOSTOP ? */
/* 197 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_AUDIOPLAY ? */
/* 198 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_AUDIOMUTE ? */
/* 199 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_MEDIASELECT ? */
/* 200 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_WWW ? */
/* 201 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_MAIL ? */
/* 202 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_CALCULATOR ? */
/* 203 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_COMPUTER ? */
/* 204 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_AC_SEARCH ? */
/* 205 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_AC_HOME ? */
/* 206 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_AC_BACK ? */
/* 207 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_AC_FORWARD ? */
/* 208 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_AC_STOP ? */
/* 209 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_AC_REFRESH ? */
/* 210 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_AC_BOOKMARKS ? */
/* 211 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_BRIGHTNESSDOWN ? */
/* 212 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_BRIGHTNESSUP ? */
/* 213 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_DISPLAYSWITCH ? */
/* 214 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KBDILLUMTOGGLE ? */
/* 215 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KBDILLUMDOWN ? */
/* 216 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_KBDILLUMUP ? */
/* 217 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_EJECT ? */
/* 218 */ SDLK_UNKNOWN, 0, /* SDL_SCANCODE_SLEEP ? */
/* 219 */ SDLK_UNKNOWN,
/* 220 */ SDLK_UNKNOWN,
/* 221 */ SDLK_UNKNOWN,
/* 222 */ SDLK_UNKNOWN,
/* 223 */ SDLK_UNKNOWN,
/* 224 */ SDLK_UNKNOWN,
/* 225 */ SDLK_UNKNOWN,
/* 226 */ SDLK_UNKNOWN,
/* 227 */ SDLK_UNKNOWN,
/* 228 */ SDLK_UNKNOWN,
/* 229 */ SDLK_UNKNOWN,
/* 230 */ SDLK_UNKNOWN,
/* 231 */ SDLK_UNKNOWN,
/* 232 */ SDLK_UNKNOWN,
/* 233 */ SDLK_UNKNOWN,
/* 234 */ SDLK_UNKNOWN,
/* 235 */ SDLK_UNKNOWN,
/* 236 */ SDLK_UNKNOWN,
/* 237 */ SDLK_UNKNOWN,
/* 238 */ SDLK_UNKNOWN,
/* 239 */ SDLK_UNKNOWN,
/* 240 */ SDLK_UNKNOWN,
/* 241 */ SDLK_UNKNOWN,
/* 242 */ SDLK_UNKNOWN,
/* 243 */ SDLK_UNKNOWN,
/* 244 */ SDLK_UNKNOWN,
/* 245 */ SDLK_UNKNOWN,
/* 246 */ SDLK_UNKNOWN,
/* 247 */ SDLK_UNKNOWN,
/* 248 */ SDLK_UNKNOWN,
/* 249 */ SDLK_UNKNOWN,
/* 250 */ SDLK_UNKNOWN,
/* 251 */ SDLK_UNKNOWN,
/* 252 */ SDLK_UNKNOWN,
/* 253 */ SDLK_UNKNOWN,
/* 254 */ SDLK_UNKNOWN,
/* 255 */ SDLK_UNKNOWN
}; };
/* Found mostly by experimentation with X.org on Linux (Fedora Core 4 and
Ubuntu Dapper) on PC and PPC Mac hardware, some parts (especially about
the "multimedia"/"internet" keys) from various sources on the web.
*/
static SDLKey xorgLinuxKeyCodeToSDLK[KeyCodeTableSize] =
{
/* 0 */ SDLK_UNKNOWN,
/* 1 */ SDLK_UNKNOWN,
/* 2 */ SDLK_UNKNOWN,
/* 3 */ SDLK_UNKNOWN,
/* 4 */ SDLK_UNKNOWN,
/* 5 */ SDLK_UNKNOWN,
/* 6 */ SDLK_UNKNOWN,
/* 7 */ SDLK_UNKNOWN,
/* 8 */ SDLK_UNKNOWN,
/* 9 */ SDLK_ESCAPE,
/* 10 */ SDLK_1,
/* 11 */ SDLK_2,
/* 12 */ SDLK_3,
/* 13 */ SDLK_4,
/* 14 */ SDLK_5,
/* 15 */ SDLK_6,
/* 16 */ SDLK_7,
/* 17 */ SDLK_8,
/* 18 */ SDLK_9,
/* 19 */ SDLK_0,
/* 20 */ SDLK_HYPHENMINUS,
/* 21 */ SDLK_EQUALS,
/* 22 */ SDLK_BACKSPACE,
/* 23 */ SDLK_TAB,
/* 24 */ SDLK_Q,
/* 25 */ SDLK_W,
/* 26 */ SDLK_E,
/* 27 */ SDLK_R,
/* 28 */ SDLK_T,
/* 29 */ SDLK_Y,
/* 30 */ SDLK_U,
/* 31 */ SDLK_I,
/* 32 */ SDLK_O,
/* 33 */ SDLK_P,
/* 34 */ SDLK_LEFTBRACKET,
/* 35 */ SDLK_RIGHTBRACKET,
/* 36 */ SDLK_RETURN,
/* 37 */ SDLK_LCTRL,
/* 38 */ SDLK_A,
/* 39 */ SDLK_S,
/* 40 */ SDLK_D,
/* 41 */ SDLK_F,
/* 42 */ SDLK_G,
/* 43 */ SDLK_H,
/* 44 */ SDLK_J,
/* 45 */ SDLK_K,
/* 46 */ SDLK_L,
/* 47 */ SDLK_SEMICOLON,
/* 48 */ SDLK_APOSTROPHE,
/* 49 */ SDLK_GRAVE,
/* 50 */ SDLK_LSHIFT,
/* 51 */ SDLK_BACKSLASH,
/* 52 */ SDLK_Z,
/* 53 */ SDLK_X,
/* 54 */ SDLK_C,
/* 55 */ SDLK_V,
/* 56 */ SDLK_B,
/* 57 */ SDLK_N,
/* 58 */ SDLK_M,
/* 59 */ SDLK_COMMA,
/* 60 */ SDLK_PERIOD,
/* 61 */ SDLK_SLASH,
/* 62 */ SDLK_RSHIFT,
/* 63 */ SDLK_KP_MULTIPLY,
/* 64 */ SDLK_LALT,
/* 65 */ SDLK_SPACE,
/* 66 */ SDLK_CAPSLOCK,
/* 67 */ SDLK_F1,
/* 68 */ SDLK_F2,
/* 69 */ SDLK_F3,
/* 70 */ SDLK_F4,
/* 71 */ SDLK_F5,
/* 72 */ SDLK_F6,
/* 73 */ SDLK_F7,
/* 74 */ SDLK_F8,
/* 75 */ SDLK_F9,
/* 76 */ SDLK_F10,
/* 77 */ SDLK_KP_NUMLOCKCLEAR,
/* 78 */ SDLK_SCROLLLOCK,
/* 79 */ SDLK_KP_7,
/* 80 */ SDLK_KP_8,
/* 81 */ SDLK_KP_9,
/* 82 */ SDLK_KP_MINUS,
/* 83 */ SDLK_KP_4,
/* 84 */ SDLK_KP_5,
/* 85 */ SDLK_KP_6,
/* 86 */ SDLK_KP_PLUS,
/* 87 */ SDLK_KP_1,
/* 88 */ SDLK_KP_2,
/* 89 */ SDLK_KP_3,
/* 90 */ SDLK_KP_0,
/* 91 */ SDLK_KP_PERIOD,
/* 92 */ SDLK_SYSREQ,
/* 93 */ SDLK_MODE, /* is translated to XK_Mode_switch by my X server, but I have no keyboard that generates this code, so I'm not sure if this is correct */
/* 94 */ SDLK_NONUSBACKSLASH,
/* 95 */ SDLK_F11,
/* 96 */ SDLK_F12,
/* 97 */ SDLK_HOME,
/* 98 */ SDLK_UP,
/* 99 */ SDLK_PAGEUP,
/* 100 */ SDLK_LEFT,
/* 101 */ SDLK_BRIGHTNESSDOWN, /* on PowerBook G4 */
/* 102 */ SDLK_RIGHT,
/* 103 */ SDLK_END,
/* 104 */ SDLK_DOWN,
/* 105 */ SDLK_PAGEDOWN,
/* 106 */ SDLK_INSERT,
/* 107 */ SDLK_DELETE,
/* 108 */ SDLK_KP_ENTER,
/* 109 */ SDLK_RCTRL,
/* 110 */ SDLK_PAUSE,
/* 111 */ SDLK_PRINTSCREEN,
/* 112 */ SDLK_KP_DIVIDE,
/* 113 */ SDLK_RALT,
/* 114 */ SDLK_UNKNOWN,
/* 115 */ SDLK_LMETA,
/* 116 */ SDLK_RMETA,
/* 117 */ SDLK_APPLICATION,
/* 118 */ SDLK_F13,
/* 119 */ SDLK_F14,
/* 120 */ SDLK_F15,
/* 121 */ SDLK_F16,
/* 122 */ SDLK_F17,
/* 123 */ SDLK_UNKNOWN,
/* 124 */ SDLK_UNKNOWN, /* is translated to XK_ISO_Level3_Shift by my X server, but I have no keyboard that generates this code, so I don't know what the correct SDLK_* for it is */
/* 125 */ SDLK_UNKNOWN,
/* 126 */ SDLK_KP_EQUALS,
/* 127 */ SDLK_UNKNOWN,
/* 128 */ SDLK_UNKNOWN,
/* 129 */ SDLK_UNKNOWN,
/* 130 */ SDLK_UNKNOWN,
/* 131 */ SDLK_UNKNOWN,
/* 132 */ SDLK_UNKNOWN,
/* 133 */ SDLK_INTERNATIONAL3, /* Yen */
/* 134 */ SDLK_UNKNOWN,
/* 135 */ SDLK_AGAIN,
/* 136 */ SDLK_UNDO,
/* 137 */ SDLK_UNKNOWN,
/* 138 */ SDLK_UNKNOWN,
/* 139 */ SDLK_UNKNOWN,
/* 140 */ SDLK_UNKNOWN,
/* 141 */ SDLK_UNKNOWN,
/* 142 */ SDLK_UNKNOWN,
/* 143 */ SDLK_UNKNOWN,
/* 144 */ SDLK_AUDIOPREV,
/* 145 */ SDLK_UNKNOWN,
/* 146 */ SDLK_UNKNOWN,
/* 147 */ SDLK_UNKNOWN,
/* 148 */ SDLK_UNKNOWN,
/* 149 */ SDLK_UNKNOWN,
/* 150 */ SDLK_UNKNOWN,
/* 151 */ SDLK_UNKNOWN,
/* 152 */ SDLK_UNKNOWN,
/* 153 */ SDLK_AUDIONEXT,
/* 154 */ SDLK_UNKNOWN,
/* 155 */ SDLK_UNKNOWN,
/* 156 */ SDLK_UNKNOWN,
/* 157 */ SDLK_KP_EQUALS, /* on PowerBook G4 */
/* 158 */ SDLK_UNKNOWN,
/* 159 */ SDLK_UNKNOWN,
/* 160 */ SDLK_MUTE,
/* 161 */ SDLK_CALC,
/* 162 */ SDLK_AUDIOPLAY,
/* 163 */ SDLK_UNKNOWN,
/* 164 */ SDLK_AUDIOSTOP,
/* 165 */ SDLK_UNKNOWN,
/* 166 */ SDLK_UNKNOWN,
/* 167 */ SDLK_UNKNOWN,
/* 168 */ SDLK_UNKNOWN,
/* 169 */ SDLK_UNKNOWN,
/* 170 */ SDLK_UNKNOWN,
/* 171 */ SDLK_UNKNOWN,
/* 172 */ SDLK_UNKNOWN,
/* 173 */ SDLK_UNKNOWN,
/* 174 */ SDLK_VOLUMEDOWN,
/* 175 */ SDLK_UNKNOWN,
/* 176 */ SDLK_VOLUMEUP,
/* 177 */ SDLK_UNKNOWN,
/* 178 */ SDLK_WWW,
/* 179 */ SDLK_UNKNOWN,
/* 180 */ SDLK_UNKNOWN,
/* 181 */ SDLK_UNKNOWN,
/* 182 */ SDLK_UNKNOWN,
/* 183 */ SDLK_UNKNOWN,
/* 184 */ SDLK_UNKNOWN,
/* 185 */ SDLK_UNKNOWN,
/* 186 */ SDLK_UNKNOWN,
/* 187 */ SDLK_HELP,
/* 188 */ SDLK_UNKNOWN,
/* 189 */ SDLK_UNKNOWN,
/* 190 */ SDLK_UNKNOWN,
/* 191 */ SDLK_UNKNOWN,
/* 192 */ SDLK_UNKNOWN,
/* 193 */ SDLK_UNKNOWN,
/* 194 */ SDLK_UNKNOWN,
/* 195 */ SDLK_UNKNOWN,
/* 196 */ SDLK_UNKNOWN,
/* 197 */ SDLK_UNKNOWN,
/* 198 */ SDLK_UNKNOWN,
/* 199 */ SDLK_UNKNOWN,
/* 200 */ SDLK_UNKNOWN,
/* 201 */ SDLK_UNKNOWN,
/* 202 */ SDLK_UNKNOWN,
/* 203 */ SDLK_UNKNOWN,
/* 204 */ SDLK_EJECT, /* on PowerBook G4 */
/* 205 */ SDLK_UNKNOWN,
/* 206 */ SDLK_UNKNOWN,
/* 207 */ SDLK_UNKNOWN,
/* 208 */ SDLK_UNKNOWN,
/* 209 */ SDLK_UNKNOWN,
/* 210 */ SDLK_UNKNOWN,
/* 211 */ SDLK_UNKNOWN,
/* 212 */ SDLK_BRIGHTNESSUP, /* on PowerBook G4 */
/* 213 */ SDLK_UNKNOWN,
/* 214 */ SDLK_DISPLAYSWITCH, /* on PowerBook G4 */
/* 215 */ SDLK_KBDILLUMTOGGLE,
/* 216 */ SDLK_KBDILLUMDOWN,
/* 217 */ SDLK_KBDILLUMUP,
/* 218 */ SDLK_UNKNOWN,
/* 219 */ SDLK_UNKNOWN,
/* 220 */ SDLK_UNKNOWN,
/* 221 */ SDLK_UNKNOWN,
/* 222 */ SDLK_POWER,
/* 223 */ SDLK_SLEEP,
/* 224 */ SDLK_UNKNOWN,
/* 225 */ SDLK_UNKNOWN,
/* 226 */ SDLK_UNKNOWN,
/* 227 */ SDLK_UNKNOWN,
/* 228 */ SDLK_UNKNOWN,
/* 229 */ SDLK_SEARCH,
/* 230 */ SDLK_BOOKMARKS,
/* 231 */ SDLK_BROWSERRELOAD,
/* 232 */ SDLK_BROWSERSTOP,
/* 233 */ SDLK_BROWSERFORWARD,
/* 234 */ SDLK_BROWSERBACK,
/* 235 */ SDLK_COMPUTER,
/* 236 */ SDLK_EMAIL,
/* 237 */ SDLK_MEDIA,
/* 238 */ SDLK_UNKNOWN,
/* 239 */ SDLK_UNKNOWN,
/* 240 */ SDLK_UNKNOWN,
/* 241 */ SDLK_UNKNOWN,
/* 242 */ SDLK_UNKNOWN,
/* 243 */ SDLK_UNKNOWN,
/* 244 */ SDLK_UNKNOWN,
/* 245 */ SDLK_UNKNOWN,
/* 246 */ SDLK_UNKNOWN,
/* 247 */ SDLK_UNKNOWN,
/* 248 */ SDLK_UNKNOWN,
/* 249 */ SDLK_UNKNOWN,
/* 250 */ SDLK_UNKNOWN,
/* 251 */ SDLK_UNKNOWN,
/* 252 */ SDLK_UNKNOWN,
/* 253 */ SDLK_UNKNOWN,
/* 254 */ SDLK_UNKNOWN,
/* 255 */ SDLK_UNKNOWN
};
/*---------------------------------------------------------------------------*/
/* Used by X11_KeySymToSDLKey(). This is a hybrid of a KeySym-to-layout-key
mapping (needed in X11_GetLayoutKey()) and a fallback KeySym-to-physical-key
mapping under the assumption of a US keyboard layout (needed in
X11_InitKeyboard()). If for a given KeySym...
- the layout and physical codes are the same (must be an SDLK_ constant):
there is one entry,
- the layout and physical codes differ: there are two entries, with the
layout one first,
- there is only a physical code in the table (must be an SDLK_ constant):
it's marked by X11_KEY_PHYSICAL_ONLY_BIT (this is the case when the layout
key code is handled by KeySymToUcs4()),
- there is only a layout code in the table (can't be an SDLK_ constant):
recognizable by the absence of SDL_KEY_CAN_BE_PHYSICAL_BIT.
This list is sorted by KeySym to allow a binary search.
*/
#define X11_KEY_PHYSICAL_ONLY_BIT SDL_KEY_LAYOUT_SPECIAL_BIT
/* SDL_KEY_LAYOUT_SPECIAL_BIT cannot possibly occur in an SDLK_ constant, so we may repurpose that bit for our own use. */
static struct static struct
{ {
KeySym sym; SDL_scancode *table;
SDLKey key; int table_size;
} keySymToSDLKey[KeyCodeTableSize] = } scancode_set[] = {
{ {
/* 0x00xx */ darwin_scancode_table, SDL_arraysize(darwin_scancode_table)}, {
{XK_space, SDLK_SPACE}, xfree86_scancode_table, SDL_arraysize(xfree86_scancode_table)},};
{XK_apostrophe, SDLK_APOSTROPHE | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_comma, SDLK_COMMA | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_minus, SDLK_HYPHENMINUS | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_period, SDLK_PERIOD | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_slash, SDLK_SLASH | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_0, SDLK_0 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_1, SDLK_1 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_2, SDLK_2 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_3, SDLK_3 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_4, SDLK_4 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_5, SDLK_5 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_6, SDLK_6 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_7, SDLK_7 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_8, SDLK_8 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_9, SDLK_9 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_semicolon, SDLK_SEMICOLON | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_less, SDLK_NONUSBACKSLASH | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_equal, SDLK_EQUALS | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_bracketleft, SDLK_LEFTBRACKET | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_backslash, SDLK_BACKSLASH | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_bracketright, SDLK_RIGHTBRACKET | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_grave, SDLK_GRAVE | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_a, SDLK_A | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_b, SDLK_B | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_c, SDLK_C | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_d, SDLK_D | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_e, SDLK_E | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_f, SDLK_F | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_g, SDLK_G | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_h, SDLK_H | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_i, SDLK_I | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_j, SDLK_J | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_k, SDLK_K | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_l, SDLK_L | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_m, SDLK_M | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_n, SDLK_N | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_o, SDLK_O | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_p, SDLK_P | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_q, SDLK_Q | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_r, SDLK_R | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_s, SDLK_S | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_t, SDLK_T | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_u, SDLK_U | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_v, SDLK_V | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_w, SDLK_W | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_x, SDLK_X | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_y, SDLK_Y | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_z, SDLK_Z | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_section, SDLK_NONUSBACKSLASH | X11_KEY_PHYSICAL_ONLY_BIT},
/* 0xFExx */
{XK_ISO_Level3_Shift, SDLK_RALT},
{XK_dead_grave, '`'},
{XK_dead_acute, 0xB4},
{XK_dead_circumflex, '^'},
{XK_dead_tilde, '~'},
{XK_dead_macron, 0xAF},
{XK_dead_breve, 0x2D8},
{XK_dead_abovedot, 0x2D9},
{XK_dead_diaeresis, 0xA8},
{XK_dead_abovering, 0x2DA},
{XK_dead_doubleacute, 0x2DD},
{XK_dead_caron, 0x2C7},
{XK_dead_cedilla, 0xB8},
{XK_dead_ogonek, 0x2DB},
{XK_dead_iota, 0x3B9},
{XK_dead_voiced_sound, 0x309B},
{XK_dead_semivoiced_sound, 0x309C},
{XK_dead_belowdot, 0xB7}, /* that's actually MIDDLE DOT,
but I haven't found a
non-combining DOT BELOW
XK_dead_hook, XK_dead_horn: I
haven't found non-combining
HOOK and HORN characters */
/* 0xFFxx */
{XK_BackSpace, SDLK_BACKSPACE},
{XK_Tab, SDLK_TAB},
{XK_Return, SDLK_RETURN},
{XK_Pause, SDLK_PAUSE},
{XK_Scroll_Lock, SDLK_SCROLLLOCK},
{XK_Escape, SDLK_ESCAPE},
{XK_Home, SDLK_HOME},
{XK_Left, SDLK_LEFT},
{XK_Up, SDLK_UP},
{XK_Right, SDLK_RIGHT},
{XK_Down, SDLK_DOWN},
{XK_Page_Up, SDLK_PAGEUP},
{XK_Page_Down, SDLK_PAGEDOWN},
{XK_End, SDLK_END},
{XK_Print, SDLK_PRINTSCREEN},
{XK_Insert, SDLK_INSERT},
{XK_Menu, SDLK_APPLICATION},
{XK_Break, SDLK_PAUSE},
{XK_Mode_switch, SDLK_MODE},
{XK_Num_Lock, SDLK_KP_NUMLOCKCLEAR},
{XK_KP_Enter, SDLK_KP_ENTER},
{XK_KP_Home, SDLK_KP_7 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_KP_Left, SDLK_KP_4 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_KP_Up, SDLK_KP_8 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_KP_Right, SDLK_KP_6 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_KP_Down, SDLK_KP_2 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_KP_Page_Up, SDLK_KP_9 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_KP_Page_Down, SDLK_KP_3 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_KP_End, SDLK_KP_1 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_KP_Begin, SDLK_KP_5 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_KP_Insert, SDLK_KP_0 | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_KP_Delete, SDLK_KP_PERIOD | X11_KEY_PHYSICAL_ONLY_BIT},
{XK_KP_Multiply, '*'},
{XK_KP_Multiply, SDLK_KP_MULTIPLY},
{XK_KP_Add, '+'},
{XK_KP_Add, SDLK_KP_PLUS},
{XK_KP_Separator, '.'},
{XK_KP_Separator, SDLK_KP_PERIOD},
{XK_KP_Subtract, '-'},
{XK_KP_Subtract, SDLK_KP_MINUS},
{XK_KP_Decimal, '.'},
{XK_KP_Decimal, SDLK_KP_PERIOD},
{XK_KP_Divide, '/'},
{XK_KP_Divide, SDLK_KP_DIVIDE},
{XK_KP_0, '0'},
{XK_KP_0, SDLK_KP_0},
{XK_KP_1, '1'},
{XK_KP_1, SDLK_KP_1},
{XK_KP_2, '2'},
{XK_KP_2, SDLK_KP_2},
{XK_KP_3, '3'},
{XK_KP_3, SDLK_KP_3},
{XK_KP_4, '4'},
{XK_KP_4, SDLK_KP_4},
{XK_KP_5, '5'},
{XK_KP_5, SDLK_KP_5},
{XK_KP_6, '6'},
{XK_KP_6, SDLK_KP_6},
{XK_KP_7, '7'},
{XK_KP_7, SDLK_KP_7},
{XK_KP_8, '8'},
{XK_KP_8, SDLK_KP_8},
{XK_KP_9, '9'},
{XK_KP_9, SDLK_KP_9},
{XK_KP_Equal, '='},
{XK_KP_Equal, SDLK_KP_EQUALS},
{XK_F1, SDLK_F1},
{XK_F2, SDLK_F2},
{XK_F3, SDLK_F3},
{XK_F4, SDLK_F4},
{XK_F5, SDLK_F5},
{XK_F6, SDLK_F6},
{XK_F7, SDLK_F7},
{XK_F8, SDLK_F8},
{XK_F9, SDLK_F9},
{XK_F10, SDLK_F10},
{XK_F11, SDLK_F11},
{XK_F12, SDLK_F12},
{XK_F13, SDLK_F13},
{XK_F14, SDLK_F14},
{XK_F15, SDLK_F15},
{XK_F16, SDLK_F16},
{XK_F17, SDLK_F17},
{XK_F18, SDLK_F18},
{XK_F19, SDLK_F19},
{XK_F20, SDLK_F20},
{XK_F21, SDLK_F21},
{XK_F22, SDLK_F22},
{XK_F23, SDLK_F23},
{XK_F24, SDLK_F24},
{XK_Shift_L, SDLK_LSHIFT},
{XK_Shift_R, SDLK_RSHIFT},
{XK_Control_L, SDLK_LCTRL},
{XK_Control_R, SDLK_RCTRL},
{XK_Caps_Lock, SDLK_CAPSLOCK},
{XK_Shift_Lock, SDLK_CAPSLOCK},
{XK_Meta_L, SDLK_LMETA},
{XK_Meta_R, SDLK_RMETA},
{XK_Alt_L, SDLK_LALT},
{XK_Alt_R, SDLK_RALT},
{XK_Super_L, SDLK_LMETA},
{XK_Super_R, SDLK_RMETA},
{XK_Hyper_L, SDLK_LMETA},
{XK_Hyper_R, SDLK_RMETA},
{XK_Delete, SDLK_DELETE},
{0x1000003, SDLK_KP_ENTER} /* keyboard enter on Mac OS X */
};
/* *INDENT-ON* */
/*
Used for two purposes: - by X11_GetLayoutKey(), with physical =
false, to convert a KeySym to the corresponding layout key code
(SDLK_ ones and some character ones - most character KeySyms are
handled by X11_KeySymToUcs4() after this function returns
SDLK_UNKNOWN for them). - by X11_InitKeyboard(), with physical =
true, to build a makeshift translation table based on the KeySyms
when none of the predefined KeyCode- to-SDLKey tables fits. This
is *not* correct anywhere but on a US layout, since the
translation table deals with physical key codes, while the X11
KeySym corresponds to our concept of a layout key code, but it's
better than nothing.
*/
static SDLKey
X11_KeySymToSDLKey(KeySym sym, SDL_bool physical)
{
/* Do a binary search for sym in the keySymToSDLKey table */
SDLKey key = SDLK_UNKNOWN;
int start = -1;
int end = SDL_arraysize(keySymToSDLKey);
int i;
/* Invariant: keySymToSDLKey[start].sym < sym <
keySymToSDLKey[end].sym (imagine ...[-1] = -inf and
...[arraysize] = inf, these entries needn't be there in reality
because they're never accessed) */
while (end > start + 1) {
i = (start + end) / 2;
if (keySymToSDLKey[i].sym == sym) {
/* found an entry, if it's the second of two back up to the first */
if (keySymToSDLKey[i - 1].sym == sym)
i--;
/* if there are two, the physical one is the second */
if (physical && keySymToSDLKey[i + 1].sym == sym)
i++;
key = keySymToSDLKey[i].key;
break;
} else if (keySymToSDLKey[i].sym < sym)
start = i;
else
end = i;
}
/* if we're being asked for a layout key code, but the table only
has a physical one, or vice versa, return SDLK_UNKNOWN) */
if (!physical && ((key & X11_KEY_PHYSICAL_ONLY_BIT) != 0)
|| physical && ((key & SDL_KEY_CAN_BE_PHYSICAL_BIT) == 0))
key = SDLK_UNKNOWN;
key &= ~X11_KEY_PHYSICAL_ONLY_BIT;
return key;
}
int int
X11_InitKeyboard(_THIS) X11_InitKeyboard(_THIS)
{ {
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
SDL_Keyboard keyboard; SDL_Keyboard keyboard;
SDLKey **table; int i, j;
SDLKey *foundTable; int min_keycode, max_keycode;
int i; SDL_scancode fingerprint_scancodes[] = {
int code; SDL_SCANCODE_HOME,
SDLKey sdlkey; SDL_SCANCODE_PAGEUP,
SDL_SCANCODE_PAGEDOWN
XAutoRepeatOn(data->display);
/* A random collection of KeySym/SDLKey pairs that should be valid
in any keyboard layout (if this isn't the case on yours,
please adjust). Using XKeysymToKeycode on these KeySyms
creates a "fingerprint" of the X server's key-to-KeyCode
mapping which is then matched against all our predefined
KeyCodeToSDLK tables to find the right one (if any).
*/
/* *INDENT-OFF* */
struct
{
KeySym sym;
SDLKey key;
} fingerprint[] =
{
{XK_Tab, SDLK_TAB},
{XK_Return, SDLK_RETURN},
{XK_Escape, SDLK_ESCAPE},
{XK_space, SDLK_SPACE}
}; };
/* *INDENT-ON* */ int fingerprint[3];
SDL_bool fingerprint_detected;
SDL_zero(keyboard);
data->keyboard = SDL_AddKeyboard(&keyboard, -1);
/* Determine which X11 KeyCode to SDL physical key code table to use */ XAutoRepeatOn(data->display);
foundTable = NULL; /* Try to determine which scancodes are being used based on fingerprint */
table = keyCodeToSDLKeyTables; fingerprint_detected = SDL_FALSE;
while ((NULL == foundTable) && (NULL != (*table))) { XDisplayKeycodes(data->display, &min_keycode, &max_keycode);
foundTable = *table; for (i = 0; i < SDL_arraysize(fingerprint_scancodes); ++i) {
for (i = 0; i < SDL_arraysize(fingerprint); i++) { fingerprint[i] =
code = XKeysymToKeycode(data->display, fingerprint[i].sym); XKeysymToKeycode(data->display,
if ((code != 0) && ((*table)[code] != fingerprint[i].key)) { XKeySymTable[fingerprint_scancodes[i]]) -
foundTable = NULL; min_keycode;
}
for (i = 0; i < SDL_arraysize(scancode_set); ++i) {
/* Make sure the scancode set isn't too big */
if ((max_keycode - min_keycode + 1) <= scancode_set[i].table_size) {
continue;
}
for (j = 0; j < SDL_arraysize(fingerprint); ++j) {
if (fingerprint[j] < 0
|| fingerprint[j] >= scancode_set[i].table_size) {
break;
}
if (scancode_set[i].table[fingerprint[j]] !=
fingerprint_scancodes[j]) {
break; break;
} }
} }
table++; if (j == SDL_arraysize(fingerprint)) {
} printf("Using scancode set %d\n", i);
SDL_memcpy(&data->key_layout[min_keycode], scancode_set[i].table,
if (NULL != foundTable) { sizeof(SDL_scancode) * scancode_set[i].table_size);
/* Found a suitable one among the predefined tables */ fingerprint_detected = SDL_TRUE;
data->keyCodeToSDLKTable = foundTable; break;
} else {
/* No suitable table found - build a makeshift table based on
the KeySyms, assuming a US keyboard layout */
#if 1
fprintf(stderr,
"The key codes of your X server are unknown to SDL. Keys may not be recognized properly. To help get this fixed, report this to the SDL mailing list <sdl@libsdl.org> or to Christian Walther <cwalther@gmx.ch>.\n");
#endif
data->keyCodeToSDLKTable =
SDL_malloc(KeyCodeTableSize * sizeof(SDLKey));
if (data->keyCodeToSDLKTable == NULL) {
SDL_OutOfMemory();
return -1;
}
for (code = KeyCodeTableSize; code >= 0; code--) {
data->keyCodeToSDLKTable[code] =
X11_KeySymToSDLKey(XKeycodeToKeysym(data->display, code, 0),
SDL_TRUE);
} }
} }
/* Set some non-default key names */ if (!fingerprint_detected) {
printf
for (code = 0; code < KeyCodeTableSize; code++) { ("Keyboard layout unknown, please send the following to the SDL mailing list (sdl@libsdl.org):\n");
sdlkey = data->keyCodeToSDLKTable[code];
switch (sdlkey) { /* Determine key_layout - only works on US QWERTY layout */
/* The SDLK_*META keys are used as XK_Meta_* by some X for (i = min_keycode; i <= max_keycode; ++i) {
servers, as XK_Super_* by others */ KeySym sym;
case SDLK_LMETA: sym = XKeycodeToKeysym(data->display, i, 0);
case SDLK_RMETA: if (sym) {
switch (XKeycodeToKeysym(data->display, code, 0)) { printf("code = %d, sym = 0x%X (%s) ", i - min_keycode, sym,
/* nothing to do for XK_Meta_* because that's already the default name */ XKeysymToString(sym));
case XK_Super_L: for (j = 0; j < SDL_arraysize(XKeySymTable); ++j) {
SDL_SetKeyName(sdlkey, "left super"); if (XKeySymTable[j] == sym) {
break; data->key_layout[i] = (SDL_scancode) j;
case XK_Super_R: break;
SDL_SetKeyName(sdlkey, "right super"); }
break; }
if (j == SDL_arraysize(XKeySymTable)) {
printf("scancode not found\n");
} else {
printf("scancode = %d (%s)\n", j, SDL_GetScancodeName(j));
}
} }
break;
} }
} }
SDL_SetKeyName(SDLK_APPLICATION, "menu");
SDL_zero(keyboard);
data->keyboard = SDL_AddKeyboard(&keyboard, -1);
X11_UpdateKeymap(this);
SDL_SetScancodeName(SDL_SCANCODE_APPLICATION, "Menu");
return 0; return 0;
} }
SDLKey void
X11_GetLayoutKey(_THIS, SDLKey physicalKey) X11_UpdateKeymap(_THIS)
{ {
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
int code = 0; int i;
KeySym sym; SDL_scancode scancode;
SDLKey layoutKey; SDLKey keymap[SDL_NUM_SCANCODES];
switch (physicalKey) {
case SDLK_UNKNOWN:
return physicalKey;
/* Shortcut handling of keypad numbers because on my PC their
primary KeySyms are not the numbers that I want but
XK_KP_Home, XK_KP_Up etc. The downside is that this gets us
latin numerals even on e.g. an Arabic layout. */
case SDLK_KP_1:
return '1';
case SDLK_KP_2:
return '2';
case SDLK_KP_3:
return '3';
case SDLK_KP_4:
return '4';
case SDLK_KP_5:
return '5';
case SDLK_KP_6:
return '6';
case SDLK_KP_7:
return '7';
case SDLK_KP_8:
return '8';
case SDLK_KP_9:
return '9';
case SDLK_KP_0:
return '0';
case SDLK_KP_PERIOD:
return '.';
default:
break; /* just to avoid a compiler warning */
}
/* Look up physicalKey to get an X11 KeyCode - linear search isn't
terribly efficient, this might have to be optimized. */
while ((code < KeyCodeTableSize) &&
(physicalKey != data->keyCodeToSDLKTable[code])) {
code++;
}
if (code == KeyCodeTableSize) {
return physicalKey;
}
/* Get the corresponding KeySym - this is where the keyboard
layout comes into play */
sym = XKeycodeToKeysym(data->display, code, 0);
/* Try our own KeySym-to-layout-key-code table: it handles all
keys whose layout code is an SDLK_ one, including a few where
X11_KeySymToUcs4() would yield a character, but not a suitable
one as a key name (e.g. space), and some that are character
keys for our purposes, but aren't handled by X11_KeySymToUcs4()
(dead keys, keypad operations). */
layoutKey = X11_KeySymToSDLKey(sym, SDL_FALSE); SDL_GetDefaultKeymap(keymap);
/* If it wasn't handled by X11_KeySymToSDLKey(), it's most for (i = 0; i < SDL_arraysize(data->key_layout); i++) {
probably a plain character KeySym that X11_KeySymToUcs4()
(ripped from X.org) knows. */
if (layoutKey == SDLK_UNKNOWN) { /* Make sure this scancode is a valid character scancode */
unsigned int ucs = X11_KeySymToUcs4(sym); scancode = data->key_layout[i];
if (ucs != 0) if (scancode == SDL_SCANCODE_UNKNOWN ||
layoutKey = (SDLKey) ucs; (keymap[scancode] & SDLK_SCANCODE_MASK)) {
} continue;
}
/* Still no success? Give up. */ keymap[scancode] =
if (layoutKey == SDLK_UNKNOWN) { (SDLKey) X11_KeySymToUcs4(XKeycodeToKeysym(data->display, i, 0));
return physicalKey;
} }
SDL_SetKeymap(data->keyboard, 0, keymap, SDL_NUM_SCANCODES);
return layoutKey;
} }
void void
...@@ -1032,18 +401,6 @@ X11_QuitKeyboard(_THIS) ...@@ -1032,18 +401,6 @@ X11_QuitKeyboard(_THIS)
{ {
SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
if (data->keyCodeToSDLKTable != NULL) {
/* If it's not one of the predefined tables, it was malloced
and must be freed */
SDLKey **table = keyCodeToSDLKeyTables;
while (*table != NULL && *table != data->keyCodeToSDLKTable) {
table++;
}
if (*table == NULL)
SDL_free(data->keyCodeToSDLKTable);
data->keyCodeToSDLKTable = NULL;
}
SDL_DelKeyboard(data->keyboard); SDL_DelKeyboard(data->keyboard);
} }
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#define _SDL_x11keyboard_h #define _SDL_x11keyboard_h
extern int X11_InitKeyboard(_THIS); extern int X11_InitKeyboard(_THIS);
extern SDLKey X11_GetLayoutKey(_THIS, SDLKey physicalKey); extern void X11_UpdateKeymap(_THIS);
extern void X11_QuitKeyboard(_THIS); extern void X11_QuitKeyboard(_THIS);
#endif /* _SDL_x11keyboard_h */ #endif /* _SDL_x11keyboard_h */
......
...@@ -48,6 +48,7 @@ SDL_X11_SYM(Window,XCreateWindow,(Display* a,Window b,int c,int d,unsigned int e ...@@ -48,6 +48,7 @@ SDL_X11_SYM(Window,XCreateWindow,(Display* a,Window b,int c,int d,unsigned int e
SDL_X11_SYM(int,XDefineCursor,(Display* a,Window b,Cursor c),(a,b,c),return) SDL_X11_SYM(int,XDefineCursor,(Display* a,Window b,Cursor c),(a,b,c),return)
SDL_X11_SYM(int,XDeleteProperty,(Display* a,Window b,Atom c),(a,b,c),return) SDL_X11_SYM(int,XDeleteProperty,(Display* a,Window b,Atom c),(a,b,c),return)
SDL_X11_SYM(int,XDestroyWindow,(Display* a,Window b),(a,b),return) SDL_X11_SYM(int,XDestroyWindow,(Display* a,Window b),(a,b),return)
SDL_X11_SYM(int,XDisplayKeycodes,(Display* a,int* b,int* c),(a,b,c),return)
SDL_X11_SYM(char*,XDisplayName,(_Xconst char* a),(a),return) SDL_X11_SYM(char*,XDisplayName,(_Xconst char* a),(a),return)
SDL_X11_SYM(int,XEventsQueued,(Display* a,int b),(a,b),return) SDL_X11_SYM(int,XEventsQueued,(Display* a,int b),(a,b),return)
SDL_X11_SYM(Bool,XFilterEvent,(XEvent *event,Window w),(event,w),return) SDL_X11_SYM(Bool,XFilterEvent,(XEvent *event,Window w),(event,w),return)
...@@ -73,6 +74,7 @@ SDL_X11_SYM(int,XGrabServer,(Display* a),(a),return) ...@@ -73,6 +74,7 @@ SDL_X11_SYM(int,XGrabServer,(Display* a),(a),return)
SDL_X11_SYM(Status,XIconifyWindow,(Display* a,Window b,int c),(a,b,c),return) SDL_X11_SYM(Status,XIconifyWindow,(Display* a,Window b,int c),(a,b,c),return)
SDL_X11_SYM(int,XInstallColormap,(Display* a,Colormap b),(a,b),return) SDL_X11_SYM(int,XInstallColormap,(Display* a,Colormap b),(a,b),return)
SDL_X11_SYM(KeyCode,XKeysymToKeycode,(Display* a,KeySym b),(a,b),return) SDL_X11_SYM(KeyCode,XKeysymToKeycode,(Display* a,KeySym b),(a,b),return)
SDL_X11_SYM(char*,XKeysymToString,(KeySym a),(a),return)
SDL_X11_SYM(int,XKillClient,(Display* a,XID b),(a,b),return) SDL_X11_SYM(int,XKillClient,(Display* a,XID b),(a,b),return)
SDL_X11_SYM(Atom,XInternAtom,(Display* a,_Xconst char* b,Bool c),(a,b,c),return) SDL_X11_SYM(Atom,XInternAtom,(Display* a,_Xconst char* b,Bool c),(a,b,c),return)
SDL_X11_SYM(XPixmapFormatValues*,XListPixmapFormats,(Display* a,int* b),(a,b),return) SDL_X11_SYM(XPixmapFormatValues*,XListPixmapFormats,(Display* a,int* b),(a,b),return)
......
...@@ -171,7 +171,6 @@ X11_CreateDevice(int devindex) ...@@ -171,7 +171,6 @@ X11_CreateDevice(int devindex)
device->SetDisplayGammaRamp = X11_SetDisplayGammaRamp; device->SetDisplayGammaRamp = X11_SetDisplayGammaRamp;
device->GetDisplayGammaRamp = X11_GetDisplayGammaRamp; device->GetDisplayGammaRamp = X11_GetDisplayGammaRamp;
device->PumpEvents = X11_PumpEvents; device->PumpEvents = X11_PumpEvents;
device->GetLayoutKey = X11_GetLayoutKey;
device->CreateWindow = X11_CreateWindow; device->CreateWindow = X11_CreateWindow;
device->CreateWindowFrom = X11_CreateWindowFrom; device->CreateWindowFrom = X11_CreateWindowFrom;
......
...@@ -70,7 +70,7 @@ typedef struct SDL_VideoData ...@@ -70,7 +70,7 @@ typedef struct SDL_VideoData
int mouse; int mouse;
int keyboard; int keyboard;
Atom WM_DELETE_WINDOW; Atom WM_DELETE_WINDOW;
SDLKey *keyCodeToSDLKTable; SDL_scancode key_layout[256];
} SDL_VideoData; } SDL_VideoData;
#endif /* _SDL_x11video_h */ #endif /* _SDL_x11video_h */
......
...@@ -91,6 +91,7 @@ PrintKey(SDL_keysym * sym, int pressed) ...@@ -91,6 +91,7 @@ PrintKey(SDL_keysym * sym, int pressed)
static void static void
PrintText(char *text) PrintText(char *text)
{ {
printf("Text: %s\n", text);
} }
int int
...@@ -124,13 +125,6 @@ main(int argc, char *argv[]) ...@@ -124,13 +125,6 @@ main(int argc, char *argv[])
quit(2); quit(2);
} }
/* Enable UNICODE translation for keyboard input */
SDL_EnableUNICODE(1);
/* Enable auto repeat for keyboard input */
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,
SDL_DEFAULT_REPEAT_INTERVAL);
/* Watch keystrokes */ /* Watch keystrokes */
done = 0; done = 0;
while (!done) { while (!done) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment