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