src/events/SDL_keyboard.c
author Sam Lantinga <slouken@libsdl.org>
Tue, 05 Feb 2008 07:19:23 +0000
changeset 2303 d87417504c75
parent 2300 c97ad1abe05b
child 2305 fbe8ff44c519
permissions -rw-r--r--
First pass implementation of new SDL scancode concept, as discussed with
Christian Walther. Currently only implemented on Mac OS X for sanity
checking purposes.
slouken@0
     1
/*
slouken@0
     2
    SDL - Simple DirectMedia Layer
slouken@1312
     3
    Copyright (C) 1997-2006 Sam Lantinga
slouken@0
     4
slouken@0
     5
    This library is free software; you can redistribute it and/or
slouken@1312
     6
    modify it under the terms of the GNU Lesser General Public
slouken@0
     7
    License as published by the Free Software Foundation; either
slouken@1312
     8
    version 2.1 of the License, or (at your option) any later version.
slouken@0
     9
slouken@0
    10
    This library is distributed in the hope that it will be useful,
slouken@0
    11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
slouken@0
    12
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
slouken@1312
    13
    Lesser General Public License for more details.
slouken@0
    14
slouken@1312
    15
    You should have received a copy of the GNU Lesser General Public
slouken@1312
    16
    License along with this library; if not, write to the Free Software
slouken@1312
    17
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
slouken@0
    18
slouken@0
    19
    Sam Lantinga
slouken@252
    20
    slouken@libsdl.org
slouken@0
    21
*/
slouken@1402
    22
#include "SDL_config.h"
slouken@0
    23
slouken@0
    24
/* General keyboard handling code for SDL */
slouken@0
    25
slouken@1358
    26
#include "SDL_timer.h"
slouken@0
    27
#include "SDL_events.h"
slouken@0
    28
#include "SDL_events_c.h"
slouken@0
    29
#include "SDL_sysevents.h"
slouken@0
    30
slouken@0
    31
slouken@1895
    32
/* Global keyboard information */
slouken@1895
    33
static int SDL_num_keyboards;
slouken@1895
    34
static int SDL_current_keyboard;
slouken@1895
    35
static SDL_Keyboard **SDL_keyboards;
slouken@0
    36
slouken@2303
    37
static SDLKey SDL_default_keymap[SDL_NUM_SCANCODES] = {
slouken@2303
    38
    0, 0, 0, 0,
slouken@2303
    39
    'a',
slouken@2303
    40
    'b',
slouken@2303
    41
    'c',
slouken@2303
    42
    'd',
slouken@2303
    43
    'e',
slouken@2303
    44
    'f',
slouken@2303
    45
    'g',
slouken@2303
    46
    'h',
slouken@2303
    47
    'i',
slouken@2303
    48
    'j',
slouken@2303
    49
    'k',
slouken@2303
    50
    'l',
slouken@2303
    51
    'm',
slouken@2303
    52
    'n',
slouken@2303
    53
    'o',
slouken@2303
    54
    'p',
slouken@2303
    55
    'q',
slouken@2303
    56
    'r',
slouken@2303
    57
    's',
slouken@2303
    58
    't',
slouken@2303
    59
    'u',
slouken@2303
    60
    'v',
slouken@2303
    61
    'w',
slouken@2303
    62
    'x',
slouken@2303
    63
    'y',
slouken@2303
    64
    'z',
slouken@2303
    65
    '1',
slouken@2303
    66
    '2',
slouken@2303
    67
    '3',
slouken@2303
    68
    '4',
slouken@2303
    69
    '5',
slouken@2303
    70
    '6',
slouken@2303
    71
    '7',
slouken@2303
    72
    '8',
slouken@2303
    73
    '9',
slouken@2303
    74
    '0',
slouken@2303
    75
    SDLK_RETURN,
slouken@2303
    76
    SDLK_ESCAPE,
slouken@2303
    77
    SDLK_BACKSPACE,
slouken@2303
    78
    SDLK_TAB,
slouken@2303
    79
    SDLK_SPACE,
slouken@2303
    80
    '-',
slouken@2303
    81
    '=',
slouken@2303
    82
    '[',
slouken@2303
    83
    ']',
slouken@2303
    84
    '\\',
slouken@2303
    85
    '#',
slouken@2303
    86
    ';',
slouken@2303
    87
    '\'',
slouken@2303
    88
    '`',
slouken@2303
    89
    ',',
slouken@2303
    90
    '.',
slouken@2303
    91
    '/',
slouken@2303
    92
    SDLK_CAPSLOCK,
slouken@2303
    93
    SDLK_F1,
slouken@2303
    94
    SDLK_F2,
slouken@2303
    95
    SDLK_F3,
slouken@2303
    96
    SDLK_F4,
slouken@2303
    97
    SDLK_F5,
slouken@2303
    98
    SDLK_F6,
slouken@2303
    99
    SDLK_F7,
slouken@2303
   100
    SDLK_F8,
slouken@2303
   101
    SDLK_F9,
slouken@2303
   102
    SDLK_F10,
slouken@2303
   103
    SDLK_F11,
slouken@2303
   104
    SDLK_F12,
slouken@2303
   105
    SDLK_PRINTSCREEN,
slouken@2303
   106
    SDLK_SCROLLLOCK,
slouken@2303
   107
    SDLK_PAUSE,
slouken@2303
   108
    SDLK_INSERT,
slouken@2303
   109
    SDLK_HOME,
slouken@2303
   110
    SDLK_PAGEUP,
slouken@2303
   111
    SDLK_DELETE,
slouken@2303
   112
    SDLK_END,
slouken@2303
   113
    SDLK_PAGEDOWN,
slouken@2303
   114
    SDLK_RIGHT,
slouken@2303
   115
    SDLK_LEFT,
slouken@2303
   116
    SDLK_DOWN,
slouken@2303
   117
    SDLK_UP,
slouken@2303
   118
    SDLK_NUMLOCKCLEAR,
slouken@2303
   119
    SDLK_KP_DIVIDE,
slouken@2303
   120
    SDLK_KP_MULTIPLY,
slouken@2303
   121
    SDLK_KP_MINUS,
slouken@2303
   122
    SDLK_KP_PLUS,
slouken@2303
   123
    SDLK_KP_ENTER,
slouken@2303
   124
    SDLK_KP_1,
slouken@2303
   125
    SDLK_KP_2,
slouken@2303
   126
    SDLK_KP_3,
slouken@2303
   127
    SDLK_KP_4,
slouken@2303
   128
    SDLK_KP_5,
slouken@2303
   129
    SDLK_KP_6,
slouken@2303
   130
    SDLK_KP_7,
slouken@2303
   131
    SDLK_KP_8,
slouken@2303
   132
    SDLK_KP_9,
slouken@2303
   133
    SDLK_KP_0,
slouken@2303
   134
    SDLK_KP_PERIOD,
slouken@2303
   135
    0,
slouken@2303
   136
    SDLK_APPLICATION,
slouken@2303
   137
    SDLK_POWER,
slouken@2303
   138
    SDLK_KP_EQUALS,
slouken@2303
   139
    SDLK_F13,
slouken@2303
   140
    SDLK_F14,
slouken@2303
   141
    SDLK_F15,
slouken@2303
   142
    SDLK_F16,
slouken@2303
   143
    SDLK_F17,
slouken@2303
   144
    SDLK_F18,
slouken@2303
   145
    SDLK_F19,
slouken@2303
   146
    SDLK_F20,
slouken@2303
   147
    SDLK_F21,
slouken@2303
   148
    SDLK_F22,
slouken@2303
   149
    SDLK_F23,
slouken@2303
   150
    SDLK_F24,
slouken@2303
   151
    SDLK_EXECUTE,
slouken@2303
   152
    SDLK_HELP,
slouken@2303
   153
    SDLK_MENU,
slouken@2303
   154
    SDLK_SELECT,
slouken@2303
   155
    SDLK_STOP,
slouken@2303
   156
    SDLK_AGAIN,
slouken@2303
   157
    SDLK_UNDO,
slouken@2303
   158
    SDLK_CUT,
slouken@2303
   159
    SDLK_COPY,
slouken@2303
   160
    SDLK_PASTE,
slouken@2303
   161
    SDLK_FIND,
slouken@2303
   162
    SDLK_MUTE,
slouken@2303
   163
    SDLK_VOLUMEUP,
slouken@2303
   164
    SDLK_VOLUMEDOWN,
slouken@2303
   165
    0, 0, 0,
slouken@2303
   166
    SDLK_KP_COMMA,
slouken@2303
   167
    SDLK_KP_EQUALSAS400,
slouken@2303
   168
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
slouken@2303
   169
    SDLK_ALTERASE,
slouken@2303
   170
    SDLK_SYSREQ,
slouken@2303
   171
    SDLK_CANCEL,
slouken@2303
   172
    SDLK_CLEAR,
slouken@2303
   173
    SDLK_PRIOR,
slouken@2303
   174
    SDLK_RETURN2,
slouken@2303
   175
    SDLK_SEPARATOR,
slouken@2303
   176
    SDLK_OUT,
slouken@2303
   177
    SDLK_OPER,
slouken@2303
   178
    SDLK_CLEARAGAIN,
slouken@2303
   179
    SDLK_CRSEL,
slouken@2303
   180
    SDLK_EXSEL,
slouken@2303
   181
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
slouken@2303
   182
    SDLK_KP_00,
slouken@2303
   183
    SDLK_KP_000,
slouken@2303
   184
    SDLK_THOUSANDSSEPARATOR,
slouken@2303
   185
    SDLK_DECIMALSEPARATOR,
slouken@2303
   186
    SDLK_CURRENCYUNIT,
slouken@2303
   187
    SDLK_CURRENCYSUBUNIT,
slouken@2303
   188
    SDLK_KP_LEFTPAREN,
slouken@2303
   189
    SDLK_KP_RIGHTPAREN,
slouken@2303
   190
    SDLK_KP_LEFTBRACE,
slouken@2303
   191
    SDLK_KP_RIGHTBRACE,
slouken@2303
   192
    SDLK_KP_TAB,
slouken@2303
   193
    SDLK_KP_BACKSPACE,
slouken@2303
   194
    SDLK_KP_A,
slouken@2303
   195
    SDLK_KP_B,
slouken@2303
   196
    SDLK_KP_C,
slouken@2303
   197
    SDLK_KP_D,
slouken@2303
   198
    SDLK_KP_E,
slouken@2303
   199
    SDLK_KP_F,
slouken@2303
   200
    SDLK_KP_XOR,
slouken@2303
   201
    SDLK_KP_POWER,
slouken@2303
   202
    SDLK_KP_PERCENT,
slouken@2303
   203
    SDLK_KP_LESS,
slouken@2303
   204
    SDLK_KP_GREATER,
slouken@2303
   205
    SDLK_KP_AMPERSAND,
slouken@2303
   206
    SDLK_KP_DBLAMPERSAND,
slouken@2303
   207
    SDLK_KP_VERTICALBAR,
slouken@2303
   208
    SDLK_KP_DBLVERTICALBAR,
slouken@2303
   209
    SDLK_KP_COLON,
slouken@2303
   210
    SDLK_KP_HASH,
slouken@2303
   211
    SDLK_KP_SPACE,
slouken@2303
   212
    SDLK_KP_AT,
slouken@2303
   213
    SDLK_KP_EXCLAM,
slouken@2303
   214
    SDLK_KP_MEMSTORE,
slouken@2303
   215
    SDLK_KP_MEMRECALL,
slouken@2303
   216
    SDLK_KP_MEMCLEAR,
slouken@2303
   217
    SDLK_KP_MEMADD,
slouken@2303
   218
    SDLK_KP_MEMSUBTRACT,
slouken@2303
   219
    SDLK_KP_MEMMULTIPLY,
slouken@2303
   220
    SDLK_KP_MEMDIVIDE,
slouken@2303
   221
    SDLK_KP_PLUSMINUS,
slouken@2303
   222
    SDLK_KP_CLEAR,
slouken@2303
   223
    SDLK_KP_CLEARENTRY,
slouken@2303
   224
    SDLK_KP_BINARY,
slouken@2303
   225
    SDLK_KP_OCTAL,
slouken@2303
   226
    SDLK_KP_DECIMAL,
slouken@2303
   227
    SDLK_KP_HEXADECIMAL,
slouken@2303
   228
    0, 0,
slouken@2303
   229
    SDLK_LCTRL,
slouken@2303
   230
    SDLK_LSHIFT,
slouken@2303
   231
    SDLK_LALT,
slouken@2303
   232
    SDLK_LGUI,
slouken@2303
   233
    SDLK_RCTRL,
slouken@2303
   234
    SDLK_RSHIFT,
slouken@2303
   235
    SDLK_RALT,
slouken@2303
   236
    SDLK_RGUI,
slouken@2303
   237
    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,
slouken@2303
   238
    SDLK_MODE,
slouken@2303
   239
    SDLK_AUDIONEXT,
slouken@2303
   240
    SDLK_AUDIOPREV,
slouken@2303
   241
    SDLK_AUDIOSTOP,
slouken@2303
   242
    SDLK_AUDIOPLAY,
slouken@2303
   243
    SDLK_AUDIOMUTE,
slouken@2303
   244
    SDLK_MEDIASELECT,
slouken@2303
   245
    SDLK_MAIL,
slouken@2303
   246
    SDLK_CALCULATOR,
slouken@2303
   247
    SDLK_COMPUTER,
slouken@2303
   248
    SDLK_AC_SEARCH,
slouken@2303
   249
    SDLK_AC_HOME,
slouken@2303
   250
    SDLK_AC_BACK,
slouken@2303
   251
    SDLK_AC_FORWARD,
slouken@2303
   252
    SDLK_AC_STOP,
slouken@2303
   253
    SDLK_AC_REFRESH,
slouken@2303
   254
    SDLK_AC_BOOKMARKS,
slouken@2303
   255
    SDLK_BRIGHTNESSDOWN,
slouken@2303
   256
    SDLK_BRIGHTNESSUP,
slouken@2303
   257
    SDLK_DISPLAYSWITCH,
slouken@2303
   258
    SDLK_KBDILLUMTOGGLE,
slouken@2303
   259
    SDLK_KBDILLUMDOWN,
slouken@2303
   260
    SDLK_KBDILLUMUP,
slouken@2303
   261
    SDLK_EJECT,
slouken@2303
   262
    SDLK_SLEEP,
slouken@2303
   263
};
slouken@2303
   264
slouken@2303
   265
static const char *SDL_scancode_names[SDL_NUM_SCANCODES] = {
slouken@2303
   266
    NULL, NULL, NULL, NULL,
slouken@2303
   267
    "A",
slouken@2303
   268
    "B",
slouken@2303
   269
    "C",
slouken@2303
   270
    "D",
slouken@2303
   271
    "E",
slouken@2303
   272
    "F",
slouken@2303
   273
    "G",
slouken@2303
   274
    "H",
slouken@2303
   275
    "I",
slouken@2303
   276
    "J",
slouken@2303
   277
    "K",
slouken@2303
   278
    "L",
slouken@2303
   279
    "M",
slouken@2303
   280
    "N",
slouken@2303
   281
    "O",
slouken@2303
   282
    "P",
slouken@2303
   283
    "Q",
slouken@2303
   284
    "R",
slouken@2303
   285
    "S",
slouken@2303
   286
    "T",
slouken@2303
   287
    "U",
slouken@2303
   288
    "V",
slouken@2303
   289
    "W",
slouken@2303
   290
    "X",
slouken@2303
   291
    "Y",
slouken@2303
   292
    "Z",
slouken@2303
   293
    "1",
slouken@2303
   294
    "2",
slouken@2303
   295
    "3",
slouken@2303
   296
    "4",
slouken@2303
   297
    "5",
slouken@2303
   298
    "6",
slouken@2303
   299
    "7",
slouken@2303
   300
    "8",
slouken@2303
   301
    "9",
slouken@2303
   302
    "0",
slouken@2303
   303
    "Return",
slouken@2303
   304
    "Escape",
slouken@2303
   305
    "Backspace",
slouken@2303
   306
    "Tab",
slouken@2303
   307
    "Space",
slouken@2303
   308
    "-",
slouken@2303
   309
    "=",
slouken@2303
   310
    "[",
slouken@2303
   311
    "]",
slouken@2303
   312
    "\\",
slouken@2303
   313
    "#",
slouken@2303
   314
    ";",
slouken@2303
   315
    "'",
slouken@2303
   316
    "`",
slouken@2303
   317
    ",",
slouken@2303
   318
    ".",
slouken@2303
   319
    "/",
slouken@2303
   320
    "CapsLock",
slouken@2303
   321
    "F1",
slouken@2303
   322
    "F2",
slouken@2303
   323
    "F3",
slouken@2303
   324
    "F4",
slouken@2303
   325
    "F5",
slouken@2303
   326
    "F6",
slouken@2303
   327
    "F7",
slouken@2303
   328
    "F8",
slouken@2303
   329
    "F9",
slouken@2303
   330
    "F10",
slouken@2303
   331
    "F11",
slouken@2303
   332
    "F12",
slouken@2303
   333
    "PrintScreen",
slouken@2303
   334
    "ScrollLock",
slouken@2303
   335
    "Pause",
slouken@2303
   336
    "Insert",
slouken@2303
   337
    "Home",
slouken@2303
   338
    "PageUp",
slouken@2303
   339
    "Delete",
slouken@2303
   340
    "End",
slouken@2303
   341
    "PageDown",
slouken@2303
   342
    "Right",
slouken@2303
   343
    "Left",
slouken@2303
   344
    "Down",
slouken@2303
   345
    "Up",
slouken@2303
   346
    "Numlock",
slouken@2303
   347
    "Keypad /",
slouken@2303
   348
    "Keypad *",
slouken@2303
   349
    "Keypad -",
slouken@2303
   350
    "Keypad +",
slouken@2303
   351
    "Keypad Enter",
slouken@2303
   352
    "Keypad 1",
slouken@2303
   353
    "Keypad 2",
slouken@2303
   354
    "Keypad 3",
slouken@2303
   355
    "Keypad 4",
slouken@2303
   356
    "Keypad 5",
slouken@2303
   357
    "Keypad 6",
slouken@2303
   358
    "Keypad 7",
slouken@2303
   359
    "Keypad 8",
slouken@2303
   360
    "Keypad 9",
slouken@2303
   361
    "Keypad 0",
slouken@2303
   362
    "Keypad .",
slouken@2303
   363
    NULL,
slouken@2303
   364
    "Application",
slouken@2303
   365
    "Power",
slouken@2303
   366
    "Keypad =",
slouken@2303
   367
    "F13",
slouken@2303
   368
    "F14",
slouken@2303
   369
    "F15",
slouken@2303
   370
    "F16",
slouken@2303
   371
    "F17",
slouken@2303
   372
    "F18",
slouken@2303
   373
    "F19",
slouken@2303
   374
    "F20",
slouken@2303
   375
    "F21",
slouken@2303
   376
    "F22",
slouken@2303
   377
    "F23",
slouken@2303
   378
    "F24",
slouken@2303
   379
    "Execute",
slouken@2303
   380
    "Help",
slouken@2303
   381
    "Menu",
slouken@2303
   382
    "Select",
slouken@2303
   383
    "Stop",
slouken@2303
   384
    "Again",
slouken@2303
   385
    "Undo",
slouken@2303
   386
    "Cut",
slouken@2303
   387
    "Copy",
slouken@2303
   388
    "Paste",
slouken@2303
   389
    "Find",
slouken@2303
   390
    "Mute",
slouken@2303
   391
    "VolumeUp",
slouken@2303
   392
    "VolumeDown",
slouken@2303
   393
    NULL, NULL, NULL,
slouken@2303
   394
    "Keypad ,",
slouken@2303
   395
    "Keypad = (AS400)",
slouken@2303
   396
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
slouken@2303
   397
    NULL, NULL, NULL, NULL, NULL, NULL,
slouken@2303
   398
    "AltErase",
slouken@2303
   399
    "SysReq",
slouken@2303
   400
    "Cancel",
slouken@2303
   401
    "Clear",
slouken@2303
   402
    "Prior",
slouken@2303
   403
    "Return",
slouken@2303
   404
    "Separator",
slouken@2303
   405
    "Out",
slouken@2303
   406
    "Oper",
slouken@2303
   407
    "Clear / Again",
slouken@2303
   408
    "CrSel",
slouken@2303
   409
    "ExSel",
slouken@2303
   410
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
slouken@2303
   411
    "Keypad 00",
slouken@2303
   412
    "Keypad 000",
slouken@2303
   413
    "ThousandsSeparator",
slouken@2303
   414
    "DecimalSeparator",
slouken@2303
   415
    "CurrencyUnit",
slouken@2303
   416
    "CurrencySubUnit",
slouken@2303
   417
    "Keypad (",
slouken@2303
   418
    "Keypad )",
slouken@2303
   419
    "Keypad {",
slouken@2303
   420
    "Keypad }",
slouken@2303
   421
    "Keypad Tab",
slouken@2303
   422
    "Keypad Backspace",
slouken@2303
   423
    "Keypad A",
slouken@2303
   424
    "Keypad B",
slouken@2303
   425
    "Keypad C",
slouken@2303
   426
    "Keypad D",
slouken@2303
   427
    "Keypad E",
slouken@2303
   428
    "Keypad F",
slouken@2303
   429
    "Keypad XOR",
slouken@2303
   430
    "Keypad ^",
slouken@2303
   431
    "Keypad %",
slouken@2303
   432
    "Keypad <",
slouken@2303
   433
    "Keypad >",
slouken@2303
   434
    "Keypad &",
slouken@2303
   435
    "Keypad &&",
slouken@2303
   436
    "Keypad |",
slouken@2303
   437
    "Keypad ||",
slouken@2303
   438
    "Keypad :",
slouken@2303
   439
    "Keypad #",
slouken@2303
   440
    "Keypad Space",
slouken@2303
   441
    "Keypad @",
slouken@2303
   442
    "Keypad !",
slouken@2303
   443
    "Keypad MemStore",
slouken@2303
   444
    "Keypad MemRecall",
slouken@2303
   445
    "Keypad MemClear",
slouken@2303
   446
    "Keypad MemAdd",
slouken@2303
   447
    "Keypad MemSubtract",
slouken@2303
   448
    "Keypad MemMultiply",
slouken@2303
   449
    "Keypad MemDivide",
slouken@2303
   450
    "Keypad +/-",
slouken@2303
   451
    "Keypad Clear",
slouken@2303
   452
    "Keypad ClearEntry",
slouken@2303
   453
    "Keypad Binary",
slouken@2303
   454
    "Keypad Octal",
slouken@2303
   455
    "Keypad Decimal",
slouken@2303
   456
    "Keypad Hexadecimal",
slouken@2303
   457
    NULL, NULL,
slouken@2303
   458
    "Left Ctrl",
slouken@2303
   459
    "Left Shift",
slouken@2303
   460
    "Left Alt",
slouken@2303
   461
    "Left GUI",
slouken@2303
   462
    "Right Ctrl",
slouken@2303
   463
    "Right Shift",
slouken@2303
   464
    "Right Alt",
slouken@2303
   465
    "Right GUI",
slouken@2303
   466
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
slouken@2303
   467
    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
slouken@2303
   468
    NULL,
slouken@2303
   469
    "ModeSwitch",
slouken@2303
   470
    "AudioNext",
slouken@2303
   471
    "AudioPrev",
slouken@2303
   472
    "AudioStop",
slouken@2303
   473
    "AudioPlay",
slouken@2303
   474
    "AudioMute",
slouken@2303
   475
    "MediaSelect",
slouken@2303
   476
    "Mail",
slouken@2303
   477
    "Calculator",
slouken@2303
   478
    "Computer",
slouken@2303
   479
    "AC Search",
slouken@2303
   480
    "AC Home",
slouken@2303
   481
    "AC Back",
slouken@2303
   482
    "AC Forward",
slouken@2303
   483
    "AC Stop",
slouken@2303
   484
    "AC Refresh",
slouken@2303
   485
    "AC Bookmarks",
slouken@2303
   486
    "BrightnessDown",
slouken@2303
   487
    "BrightnessUp",
slouken@2303
   488
    "DisplaySwitch",
slouken@2303
   489
    "KBDIllumToggle",
slouken@2303
   490
    "KBDIllumDown",
slouken@2303
   491
    "KBDIllumUp",
slouken@2303
   492
    "Eject",
slouken@2303
   493
    "Sleep",
slouken@2303
   494
};
slouken@2303
   495
bob@2295
   496
/* Taken from SDL_iconv() */
slouken@2303
   497
static char *
slouken@2303
   498
SDL_UCS4ToUTF8(Uint32 ch, char *dst)
bob@2295
   499
{
bob@2295
   500
    Uint8 *p = (Uint8 *) dst;
bob@2295
   501
    if (ch <= 0x7F) {
bob@2295
   502
        *p = (Uint8) ch;
bob@2295
   503
        ++dst;
bob@2295
   504
    } else if (ch <= 0x7FF) {
bob@2295
   505
        p[0] = 0xC0 | (Uint8) ((ch >> 6) & 0x1F);
bob@2295
   506
        p[1] = 0x80 | (Uint8) (ch & 0x3F);
bob@2295
   507
        dst += 2;
bob@2295
   508
    } else if (ch <= 0xFFFF) {
bob@2295
   509
        p[0] = 0xE0 | (Uint8) ((ch >> 12) & 0x0F);
bob@2295
   510
        p[1] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);
bob@2295
   511
        p[2] = 0x80 | (Uint8) (ch & 0x3F);
bob@2295
   512
        dst += 3;
bob@2295
   513
    } else if (ch <= 0x1FFFFF) {
bob@2295
   514
        p[0] = 0xF0 | (Uint8) ((ch >> 18) & 0x07);
bob@2295
   515
        p[1] = 0x80 | (Uint8) ((ch >> 12) & 0x3F);
bob@2295
   516
        p[2] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);
bob@2295
   517
        p[3] = 0x80 | (Uint8) (ch & 0x3F);
bob@2295
   518
        dst += 4;
bob@2295
   519
    } else if (ch <= 0x3FFFFFF) {
bob@2295
   520
        p[0] = 0xF8 | (Uint8) ((ch >> 24) & 0x03);
bob@2295
   521
        p[1] = 0x80 | (Uint8) ((ch >> 18) & 0x3F);
bob@2295
   522
        p[2] = 0x80 | (Uint8) ((ch >> 12) & 0x3F);
bob@2295
   523
        p[3] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);
bob@2295
   524
        p[4] = 0x80 | (Uint8) (ch & 0x3F);
bob@2295
   525
        dst += 5;
bob@2295
   526
    } else {
bob@2295
   527
        p[0] = 0xFC | (Uint8) ((ch >> 30) & 0x01);
bob@2295
   528
        p[1] = 0x80 | (Uint8) ((ch >> 24) & 0x3F);
bob@2295
   529
        p[2] = 0x80 | (Uint8) ((ch >> 18) & 0x3F);
bob@2295
   530
        p[3] = 0x80 | (Uint8) ((ch >> 12) & 0x3F);
bob@2295
   531
        p[4] = 0x80 | (Uint8) ((ch >> 6) & 0x3F);
bob@2295
   532
        p[5] = 0x80 | (Uint8) (ch & 0x3F);
bob@2295
   533
        dst += 6;
bob@2295
   534
    }
bob@2295
   535
    return dst;
bob@2295
   536
}
bob@2295
   537
slouken@0
   538
/* Public functions */
slouken@1895
   539
int
slouken@1895
   540
SDL_KeyboardInit(void)
slouken@0
   541
{
slouken@1895
   542
    return (0);
slouken@1123
   543
}
slouken@0
   544
slouken@1895
   545
SDL_Keyboard *
slouken@1895
   546
SDL_GetKeyboard(int index)
slouken@0
   547
{
slouken@1895
   548
    if (index < 0 || index >= SDL_num_keyboards) {
slouken@1895
   549
        return NULL;
slouken@1895
   550
    }
slouken@1895
   551
    return SDL_keyboards[index];
slouken@0
   552
}
slouken@0
   553
slouken@1895
   554
int
slouken@1895
   555
SDL_AddKeyboard(const SDL_Keyboard * keyboard, int index)
slouken@0
   556
{
slouken@1895
   557
    SDL_Keyboard **keyboards;
slouken@0
   558
slouken@1895
   559
    /* Add the keyboard to the list of keyboards */
slouken@1895
   560
    if (index < 0 || index >= SDL_num_keyboards || SDL_keyboards[index]) {
slouken@1895
   561
        keyboards =
slouken@1895
   562
            (SDL_Keyboard **) SDL_realloc(SDL_keyboards,
slouken@1895
   563
                                          (SDL_num_keyboards +
slouken@1895
   564
                                           1) * sizeof(*keyboards));
slouken@1895
   565
        if (!keyboards) {
slouken@1895
   566
            SDL_OutOfMemory();
slouken@1895
   567
            return -1;
slouken@1895
   568
        }
slouken@1895
   569
slouken@1895
   570
        SDL_keyboards = keyboards;
slouken@1895
   571
        index = SDL_num_keyboards++;
slouken@1895
   572
    }
slouken@1895
   573
    SDL_keyboards[index] =
slouken@1895
   574
        (SDL_Keyboard *) SDL_malloc(sizeof(*SDL_keyboards[index]));
slouken@1895
   575
    if (!SDL_keyboards[index]) {
slouken@1895
   576
        SDL_OutOfMemory();
slouken@1895
   577
        return -1;
slouken@1895
   578
    }
slouken@1895
   579
    *SDL_keyboards[index] = *keyboard;
slouken@1895
   580
slouken@1895
   581
    return index;
slouken@0
   582
}
slouken@0
   583
slouken@1895
   584
void
slouken@1895
   585
SDL_DelKeyboard(int index)
slouken@0
   586
{
slouken@1895
   587
    SDL_Keyboard *keyboard = SDL_GetKeyboard(index);
slouken@1895
   588
slouken@1895
   589
    if (!keyboard) {
slouken@1895
   590
        return;
slouken@1895
   591
    }
slouken@1895
   592
slouken@1895
   593
    if (keyboard->FreeKeyboard) {
slouken@1895
   594
        keyboard->FreeKeyboard(keyboard);
slouken@1895
   595
    }
slouken@1895
   596
    SDL_free(keyboard);
slouken@1895
   597
slouken@1895
   598
    SDL_keyboards[index] = NULL;
slouken@0
   599
}
slouken@0
   600
slouken@1895
   601
void
slouken@1895
   602
SDL_ResetKeyboard(int index)
slouken@0
   603
{
slouken@1895
   604
    SDL_Keyboard *keyboard = SDL_GetKeyboard(index);
slouken@2303
   605
    SDL_scancode scancode;
slouken@0
   606
slouken@1895
   607
    if (!keyboard) {
slouken@1895
   608
        return;
slouken@1895
   609
    }
slouken@1895
   610
slouken@2303
   611
    for (scancode = 0; scancode < SDL_NUM_SCANCODES; ++scancode) {
slouken@2303
   612
        if (keyboard->keystate[scancode] == SDL_PRESSED) {
slouken@2303
   613
            SDL_SendKeyboardKey(index, SDL_RELEASED, scancode);
slouken@1895
   614
        }
slouken@1895
   615
    }
slouken@0
   616
}
slouken@0
   617
slouken@1895
   618
void
slouken@2303
   619
SDL_GetDefaultKeymap(SDLKey * keymap)
slouken@0
   620
{
slouken@2303
   621
    SDL_memcpy(keymap, SDL_default_keymap, sizeof(SDL_default_keymap));
slouken@1895
   622
}
slouken@1895
   623
slouken@1895
   624
void
slouken@2303
   625
SDL_SetKeymap(int index, int start, SDLKey * keys, int length)
slouken@1895
   626
{
slouken@2303
   627
    SDL_Keyboard *keyboard = SDL_GetKeyboard(index);
slouken@1895
   628
slouken@1895
   629
    if (!keyboard) {
slouken@1895
   630
        return;
slouken@1895
   631
    }
slouken@1895
   632
slouken@2303
   633
    if (start < 0 || start + length > SDL_NUM_SCANCODES) {
slouken@2303
   634
        return;
slouken@1895
   635
    }
slouken@2268
   636
slouken@2303
   637
    SDL_memcpy(&keyboard->keymap[start], keys, sizeof(*keys) * length);
slouken@1895
   638
}
slouken@1895
   639
slouken@1895
   640
void
slouken@2303
   641
SDL_SetScancodeName(SDL_scancode scancode, const char *name)
slouken@2268
   642
{
slouken@2303
   643
    SDL_scancode_names[scancode] = name;
slouken@2268
   644
}
slouken@2268
   645
slouken@2268
   646
void
slouken@1895
   647
SDL_SetKeyboardFocus(int index, SDL_WindowID windowID)
slouken@1895
   648
{
slouken@1895
   649
    SDL_Keyboard *keyboard = SDL_GetKeyboard(index);
slouken@1895
   650
    int i;
slouken@1895
   651
    SDL_bool focus;
slouken@1895
   652
slouken@1895
   653
    if (!keyboard || (keyboard->focus == windowID)) {
slouken@1895
   654
        return;
slouken@1895
   655
    }
slouken@1895
   656
slouken@1895
   657
    /* See if the current window has lost focus */
slouken@1895
   658
    if (keyboard->focus) {
slouken@1895
   659
        focus = SDL_FALSE;
slouken@1895
   660
        for (i = 0; i < SDL_num_keyboards; ++i) {
slouken@1895
   661
            SDL_Keyboard *check;
slouken@1895
   662
            if (i != index) {
slouken@1895
   663
                check = SDL_GetKeyboard(i);
slouken@1895
   664
                if (check && check->focus == keyboard->focus) {
slouken@1895
   665
                    focus = SDL_TRUE;
slouken@1895
   666
                    break;
slouken@1895
   667
                }
slouken@1895
   668
            }
slouken@1895
   669
        }
slouken@1895
   670
        if (!focus) {
slouken@1895
   671
            SDL_SendWindowEvent(keyboard->focus, SDL_WINDOWEVENT_FOCUS_LOST,
slouken@1895
   672
                                0, 0);
slouken@1895
   673
        }
slouken@1895
   674
    }
slouken@1895
   675
slouken@1895
   676
    keyboard->focus = windowID;
slouken@1895
   677
slouken@1895
   678
    if (keyboard->focus) {
slouken@1895
   679
        focus = SDL_FALSE;
slouken@1895
   680
        for (i = 0; i < SDL_num_keyboards; ++i) {
slouken@1895
   681
            SDL_Keyboard *check;
slouken@1895
   682
            if (i != index) {
slouken@1895
   683
                check = SDL_GetKeyboard(i);
slouken@1895
   684
                if (check && check->focus == keyboard->focus) {
slouken@1895
   685
                    focus = SDL_TRUE;
slouken@1895
   686
                    break;
slouken@1895
   687
                }
slouken@1895
   688
            }
slouken@1895
   689
        }
slouken@1895
   690
        if (!focus) {
slouken@1895
   691
            SDL_SendWindowEvent(keyboard->focus, SDL_WINDOWEVENT_FOCUS_GAINED,
slouken@1895
   692
                                0, 0);
slouken@1895
   693
        }
slouken@1895
   694
    }
slouken@1895
   695
}
slouken@1895
   696
slouken@1895
   697
int
slouken@2303
   698
SDL_SendKeyboardKey(int index, Uint8 state, SDL_scancode scancode)
slouken@1895
   699
{
slouken@1895
   700
    SDL_Keyboard *keyboard = SDL_GetKeyboard(index);
slouken@2129
   701
    int posted;
slouken@1895
   702
    Uint16 modstate;
slouken@1895
   703
    Uint8 type;
slouken@1895
   704
slouken@2303
   705
    if (!keyboard || !scancode) {
slouken@1895
   706
        return 0;
slouken@1895
   707
    }
slouken@0
   708
#if 0
slouken@2303
   709
    printf("The '%s' key has been %s\n", SDL_GetScancodeName(scancode),
slouken@1895
   710
           state == SDL_PRESSED ? "pressed" : "released");
slouken@0
   711
#endif
slouken@1895
   712
    if (state == SDL_PRESSED) {
slouken@1895
   713
        modstate = keyboard->modstate;
slouken@2303
   714
        switch (scancode) {
slouken@2303
   715
        case SDL_SCANCODE_NUMLOCKCLEAR:
slouken@1895
   716
            keyboard->modstate ^= KMOD_NUM;
slouken@1895
   717
            break;
slouken@2303
   718
        case SDL_SCANCODE_CAPSLOCK:
slouken@1895
   719
            keyboard->modstate ^= KMOD_CAPS;
slouken@1895
   720
            break;
slouken@2303
   721
        case SDL_SCANCODE_LCTRL:
slouken@1895
   722
            keyboard->modstate |= KMOD_LCTRL;
slouken@1895
   723
            break;
slouken@2303
   724
        case SDL_SCANCODE_RCTRL:
slouken@1895
   725
            keyboard->modstate |= KMOD_RCTRL;
slouken@1895
   726
            break;
slouken@2303
   727
        case SDL_SCANCODE_LSHIFT:
slouken@1895
   728
            keyboard->modstate |= KMOD_LSHIFT;
slouken@1895
   729
            break;
slouken@2303
   730
        case SDL_SCANCODE_RSHIFT:
slouken@1895
   731
            keyboard->modstate |= KMOD_RSHIFT;
slouken@1895
   732
            break;
slouken@2303
   733
        case SDL_SCANCODE_LALT:
slouken@1895
   734
            keyboard->modstate |= KMOD_LALT;
slouken@1895
   735
            break;
slouken@2303
   736
        case SDL_SCANCODE_RALT:
slouken@1895
   737
            keyboard->modstate |= KMOD_RALT;
slouken@1895
   738
            break;
slouken@2303
   739
        case SDL_SCANCODE_LGUI:
slouken@2303
   740
            keyboard->modstate |= KMOD_LGUI;
slouken@1895
   741
            break;
slouken@2303
   742
        case SDL_SCANCODE_RGUI:
slouken@2303
   743
            keyboard->modstate |= KMOD_RGUI;
slouken@1895
   744
            break;
slouken@2303
   745
        case SDL_SCANCODE_MODE:
slouken@1895
   746
            keyboard->modstate |= KMOD_MODE;
slouken@1895
   747
            break;
slouken@1895
   748
        default:
slouken@1895
   749
            break;
slouken@1895
   750
        }
slouken@1895
   751
    } else {
slouken@2303
   752
        switch (scancode) {
slouken@2303
   753
        case SDL_SCANCODE_NUMLOCKCLEAR:
slouken@2303
   754
        case SDL_SCANCODE_CAPSLOCK:
slouken@1895
   755
            break;
slouken@2303
   756
        case SDL_SCANCODE_LCTRL:
slouken@1895
   757
            keyboard->modstate &= ~KMOD_LCTRL;
slouken@1895
   758
            break;
slouken@2303
   759
        case SDL_SCANCODE_RCTRL:
slouken@1895
   760
            keyboard->modstate &= ~KMOD_RCTRL;
slouken@1895
   761
            break;
slouken@2303
   762
        case SDL_SCANCODE_LSHIFT:
slouken@1895
   763
            keyboard->modstate &= ~KMOD_LSHIFT;
slouken@1895
   764
            break;
slouken@2303
   765
        case SDL_SCANCODE_RSHIFT:
slouken@1895
   766
            keyboard->modstate &= ~KMOD_RSHIFT;
slouken@1895
   767
            break;
slouken@2303
   768
        case SDL_SCANCODE_LALT:
slouken@1895
   769
            keyboard->modstate &= ~KMOD_LALT;
slouken@1895
   770
            break;
slouken@2303
   771
        case SDL_SCANCODE_RALT:
slouken@1895
   772
            keyboard->modstate &= ~KMOD_RALT;
slouken@1895
   773
            break;
slouken@2303
   774
        case SDL_SCANCODE_LGUI:
slouken@2303
   775
            keyboard->modstate &= ~KMOD_LGUI;
slouken@1895
   776
            break;
slouken@2303
   777
        case SDL_SCANCODE_RGUI:
slouken@2303
   778
            keyboard->modstate &= ~KMOD_RGUI;
slouken@1895
   779
            break;
slouken@2303
   780
        case SDL_SCANCODE_MODE:
slouken@1895
   781
            keyboard->modstate &= ~KMOD_MODE;
slouken@1895
   782
            break;
slouken@1895
   783
        default:
slouken@1895
   784
            break;
slouken@1895
   785
        }
slouken@1895
   786
        modstate = keyboard->modstate;
slouken@1895
   787
    }
slouken@0
   788
slouken@1895
   789
    /* Figure out what type of event this is */
slouken@1895
   790
    switch (state) {
slouken@1895
   791
    case SDL_PRESSED:
slouken@1895
   792
        type = SDL_KEYDOWN;
slouken@1895
   793
        break;
slouken@1895
   794
    case SDL_RELEASED:
slouken@1895
   795
        type = SDL_KEYUP;
slouken@1895
   796
        break;
slouken@1895
   797
    default:
slouken@1895
   798
        /* Invalid state -- bail */
slouken@1895
   799
        return 0;
slouken@1895
   800
    }
slouken@0
   801
slouken@2303
   802
    /* Drop events that don't change state */
slouken@2303
   803
    if (keyboard->keystate[scancode] == state) {
slouken@1895
   804
#if 0
slouken@2303
   805
        printf("Keyboard event didn't change state - dropped!\n");
slouken@1895
   806
#endif
slouken@2303
   807
        return 0;
slouken@2303
   808
    }
slouken@0
   809
slouken@2303
   810
    /* Update internal keyboard state */
slouken@2303
   811
    keyboard->keystate[scancode] = state;
slouken@0
   812
slouken@1895
   813
    /* Post the event, if desired */
slouken@1895
   814
    posted = 0;
slouken@1895
   815
    if (SDL_ProcessEvents[type] == SDL_ENABLE) {
slouken@1895
   816
        SDL_Event event;
slouken@1895
   817
        event.key.type = type;
slouken@1895
   818
        event.key.which = (Uint8) index;
slouken@1895
   819
        event.key.state = state;
slouken@1895
   820
        event.key.keysym.scancode = scancode;
slouken@2303
   821
        event.key.keysym.sym = keyboard->keymap[scancode];
slouken@1895
   822
        event.key.keysym.mod = modstate;
slouken@1895
   823
        event.key.keysym.unicode = 0;
slouken@1895
   824
        event.key.windowID = keyboard->focus;
slouken@1895
   825
        posted = (SDL_PushEvent(&event) > 0);
slouken@1895
   826
    }
slouken@1895
   827
    return (posted);
slouken@1895
   828
}
slouken@1327
   829
slouken@1895
   830
int
slouken@1895
   831
SDL_SendKeyboardText(int index, const char *text)
slouken@1895
   832
{
slouken@1895
   833
    SDL_Keyboard *keyboard = SDL_GetKeyboard(index);
slouken@1895
   834
    int posted;
slouken@0
   835
slouken@1895
   836
    if (!keyboard) {
slouken@1895
   837
        return 0;
slouken@1895
   838
    }
slouken@1895
   839
slouken@1895
   840
    /* Post the event, if desired */
slouken@1895
   841
    posted = 0;
slouken@1895
   842
    if (SDL_ProcessEvents[SDL_TEXTINPUT] == SDL_ENABLE) {
slouken@1895
   843
        SDL_Event event;
slouken@1895
   844
        event.text.type = SDL_TEXTINPUT;
slouken@1895
   845
        event.text.which = (Uint8) index;
slouken@1895
   846
        SDL_strlcpy(event.text.text, text, SDL_arraysize(event.text.text));
slouken@1959
   847
        event.text.windowID = keyboard->focus;
slouken@1895
   848
        posted = (SDL_PushEvent(&event) > 0);
slouken@1895
   849
    }
slouken@1895
   850
    return (posted);
slouken@0
   851
}
slouken@0
   852
slouken@2303
   853
void
slouken@2303
   854
SDL_KeyboardQuit(void)
slouken@2303
   855
{
slouken@2303
   856
    int i;
slouken@2303
   857
slouken@2303
   858
    for (i = 0; i < SDL_num_keyboards; ++i) {
slouken@2303
   859
        SDL_DelKeyboard(i);
slouken@2303
   860
    }
slouken@2303
   861
    SDL_num_keyboards = 0;
slouken@2303
   862
    SDL_current_keyboard = 0;
slouken@2303
   863
slouken@2303
   864
    if (SDL_keyboards) {
slouken@2303
   865
        SDL_free(SDL_keyboards);
slouken@2303
   866
        SDL_keyboards = NULL;
slouken@2303
   867
    }
slouken@2303
   868
}
slouken@2303
   869
slouken@2303
   870
int
slouken@2303
   871
SDL_GetNumKeyboards(void)
slouken@2303
   872
{
slouken@2303
   873
    return SDL_num_keyboards;
slouken@2303
   874
}
slouken@2303
   875
slouken@2303
   876
int
slouken@2303
   877
SDL_SelectKeyboard(int index)
slouken@2303
   878
{
slouken@2303
   879
    if (index >= 0 && index < SDL_num_keyboards) {
slouken@2303
   880
        SDL_current_keyboard = index;
slouken@2303
   881
    }
slouken@2303
   882
    return SDL_current_keyboard;
slouken@2303
   883
}
slouken@2303
   884
slouken@2303
   885
Uint8 *
slouken@2303
   886
SDL_GetKeyboardState(int *numkeys)
slouken@2303
   887
{
slouken@2303
   888
    SDL_Keyboard *keyboard = SDL_GetKeyboard(SDL_current_keyboard);
slouken@2303
   889
slouken@2303
   890
    if (numkeys != (int *) 0) {
slouken@2303
   891
        *numkeys = SDL_NUM_SCANCODES;
slouken@2303
   892
    }
slouken@2303
   893
slouken@2303
   894
    if (!keyboard) {
slouken@2303
   895
        return NULL;
slouken@2303
   896
    }
slouken@2303
   897
    return keyboard->keystate;
slouken@2303
   898
}
slouken@2303
   899
slouken@2303
   900
SDLMod
slouken@2303
   901
SDL_GetModState(void)
slouken@2303
   902
{
slouken@2303
   903
    SDL_Keyboard *keyboard = SDL_GetKeyboard(SDL_current_keyboard);
slouken@2303
   904
slouken@2303
   905
    if (!keyboard) {
slouken@2303
   906
        return KMOD_NONE;
slouken@2303
   907
    }
slouken@2303
   908
    return keyboard->modstate;
slouken@2303
   909
}
slouken@2303
   910
slouken@2303
   911
void
slouken@2303
   912
SDL_SetModState(SDLMod modstate)
slouken@2303
   913
{
slouken@2303
   914
    SDL_Keyboard *keyboard = SDL_GetKeyboard(SDL_current_keyboard);
slouken@2303
   915
slouken@2303
   916
    if (!keyboard) {
slouken@2303
   917
        return;
slouken@2303
   918
    }
slouken@2303
   919
    keyboard->modstate = modstate;
slouken@2303
   920
}
slouken@2303
   921
slouken@2303
   922
SDLKey
slouken@2303
   923
SDL_GetKeyFromScancode(SDL_scancode scancode)
slouken@2303
   924
{
slouken@2303
   925
    SDL_Keyboard *keyboard = SDL_GetKeyboard(SDL_current_keyboard);
slouken@2303
   926
slouken@2303
   927
    if (!keyboard) {
slouken@2303
   928
        return SDLK_UNKNOWN;
slouken@2303
   929
    }
slouken@2303
   930
    return keyboard->keymap[scancode];
slouken@2303
   931
}
slouken@2303
   932
slouken@2303
   933
SDL_scancode
slouken@2303
   934
SDL_GetScancodeFromKey(SDLKey key)
slouken@2303
   935
{
slouken@2303
   936
    SDL_Keyboard *keyboard = SDL_GetKeyboard(SDL_current_keyboard);
slouken@2303
   937
    SDL_scancode scancode;
slouken@2303
   938
slouken@2303
   939
    if (!keyboard) {
slouken@2303
   940
        return SDL_SCANCODE_UNKNOWN;
slouken@2303
   941
    }
slouken@2303
   942
slouken@2303
   943
    for (scancode = SDL_SCANCODE_UNKNOWN; scancode < SDL_NUM_SCANCODES;
slouken@2303
   944
         ++scancode) {
slouken@2303
   945
        if (keyboard->keymap[scancode] == key) {
slouken@2303
   946
            return scancode;
slouken@2303
   947
        }
slouken@2303
   948
    }
slouken@2303
   949
    return SDL_SCANCODE_UNKNOWN;
slouken@2303
   950
}
slouken@2303
   951
slouken@2303
   952
const char *
slouken@2303
   953
SDL_GetScancodeName(SDL_scancode scancode)
slouken@2303
   954
{
slouken@2303
   955
    const char *name = SDL_scancode_names[scancode];
slouken@2303
   956
slouken@2303
   957
    if (name)
slouken@2303
   958
        return name;
slouken@2303
   959
    else
slouken@2303
   960
        return "";
slouken@2303
   961
}
slouken@2303
   962
slouken@2303
   963
const char *
slouken@2303
   964
SDL_GetKeyName(SDLKey key)
slouken@2303
   965
{
slouken@2303
   966
    static char name[8];
slouken@2303
   967
    char *end;
slouken@2303
   968
slouken@2303
   969
    if (key & SDLK_SCANCODE_MASK) {
slouken@2303
   970
        return
slouken@2303
   971
            SDL_GetScancodeName((SDL_scancode) (key & ~SDLK_SCANCODE_MASK));
slouken@2303
   972
    }
slouken@2303
   973
slouken@2303
   974
    /* Unaccented letter keys on latin keyboards are normally
slouken@2303
   975
       labeled in upper case (and probably on others like Greek or
slouken@2303
   976
       Cyrillic too, so if you happen to know for sure, please
slouken@2303
   977
       adapt this). */
slouken@2303
   978
    if (key >= 'a' && key <= 'z') {
slouken@2303
   979
        key -= 32;
slouken@2303
   980
    }
slouken@2303
   981
slouken@2303
   982
    end = SDL_UCS4ToUTF8((Uint32) key, name);
slouken@2303
   983
    *end = '\0';
slouken@2303
   984
    return name;
slouken@2303
   985
}
slouken@2303
   986
slouken@1895
   987
/* vi: set ts=4 sw=4 expandtab: */