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