diff options
Diffstat (limited to '3rdparty/SDL2/src/events/SDL_keyboard.c')
-rw-r--r-- | 3rdparty/SDL2/src/events/SDL_keyboard.c | 1016 |
1 files changed, 0 insertions, 1016 deletions
diff --git a/3rdparty/SDL2/src/events/SDL_keyboard.c b/3rdparty/SDL2/src/events/SDL_keyboard.c deleted file mode 100644 index 15726545c6f..00000000000 --- a/3rdparty/SDL2/src/events/SDL_keyboard.c +++ /dev/null @@ -1,1016 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../SDL_internal.h" - -/* General keyboard handling code for SDL */ - -#include "SDL_timer.h" -#include "SDL_events.h" -#include "SDL_events_c.h" -#include "SDL_assert.h" -#include "../video/SDL_sysvideo.h" - - -/* #define DEBUG_KEYBOARD */ - -/* Global keyboard information */ - -typedef struct SDL_Keyboard SDL_Keyboard; - -struct SDL_Keyboard -{ - /* Data common to all keyboards */ - SDL_Window *focus; - Uint16 modstate; - Uint8 keystate[SDL_NUM_SCANCODES]; - SDL_Keycode keymap[SDL_NUM_SCANCODES]; -}; - -static SDL_Keyboard SDL_keyboard; - -static const SDL_Keycode SDL_default_keymap[SDL_NUM_SCANCODES] = { - 0, 0, 0, 0, - 'a', - 'b', - 'c', - 'd', - 'e', - 'f', - 'g', - 'h', - 'i', - 'j', - 'k', - 'l', - 'm', - 'n', - 'o', - 'p', - 'q', - 'r', - 's', - 't', - 'u', - 'v', - 'w', - 'x', - 'y', - 'z', - '1', - '2', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - '0', - SDLK_RETURN, - SDLK_ESCAPE, - SDLK_BACKSPACE, - SDLK_TAB, - SDLK_SPACE, - '-', - '=', - '[', - ']', - '\\', - '#', - ';', - '\'', - '`', - ',', - '.', - '/', - SDLK_CAPSLOCK, - SDLK_F1, - SDLK_F2, - SDLK_F3, - SDLK_F4, - SDLK_F5, - SDLK_F6, - SDLK_F7, - SDLK_F8, - SDLK_F9, - SDLK_F10, - SDLK_F11, - SDLK_F12, - SDLK_PRINTSCREEN, - SDLK_SCROLLLOCK, - SDLK_PAUSE, - SDLK_INSERT, - SDLK_HOME, - SDLK_PAGEUP, - SDLK_DELETE, - SDLK_END, - SDLK_PAGEDOWN, - SDLK_RIGHT, - SDLK_LEFT, - SDLK_DOWN, - SDLK_UP, - SDLK_NUMLOCKCLEAR, - SDLK_KP_DIVIDE, - SDLK_KP_MULTIPLY, - SDLK_KP_MINUS, - SDLK_KP_PLUS, - SDLK_KP_ENTER, - SDLK_KP_1, - SDLK_KP_2, - SDLK_KP_3, - SDLK_KP_4, - SDLK_KP_5, - SDLK_KP_6, - SDLK_KP_7, - SDLK_KP_8, - SDLK_KP_9, - SDLK_KP_0, - SDLK_KP_PERIOD, - 0, - SDLK_APPLICATION, - SDLK_POWER, - SDLK_KP_EQUALS, - SDLK_F13, - SDLK_F14, - SDLK_F15, - SDLK_F16, - SDLK_F17, - SDLK_F18, - SDLK_F19, - SDLK_F20, - SDLK_F21, - SDLK_F22, - SDLK_F23, - SDLK_F24, - SDLK_EXECUTE, - SDLK_HELP, - SDLK_MENU, - SDLK_SELECT, - SDLK_STOP, - SDLK_AGAIN, - SDLK_UNDO, - SDLK_CUT, - SDLK_COPY, - SDLK_PASTE, - SDLK_FIND, - SDLK_MUTE, - SDLK_VOLUMEUP, - SDLK_VOLUMEDOWN, - 0, 0, 0, - SDLK_KP_COMMA, - SDLK_KP_EQUALSAS400, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - SDLK_ALTERASE, - SDLK_SYSREQ, - SDLK_CANCEL, - SDLK_CLEAR, - SDLK_PRIOR, - SDLK_RETURN2, - SDLK_SEPARATOR, - SDLK_OUT, - SDLK_OPER, - SDLK_CLEARAGAIN, - SDLK_CRSEL, - SDLK_EXSEL, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - SDLK_KP_00, - SDLK_KP_000, - SDLK_THOUSANDSSEPARATOR, - SDLK_DECIMALSEPARATOR, - SDLK_CURRENCYUNIT, - SDLK_CURRENCYSUBUNIT, - SDLK_KP_LEFTPAREN, - SDLK_KP_RIGHTPAREN, - SDLK_KP_LEFTBRACE, - SDLK_KP_RIGHTBRACE, - SDLK_KP_TAB, - SDLK_KP_BACKSPACE, - SDLK_KP_A, - SDLK_KP_B, - SDLK_KP_C, - SDLK_KP_D, - SDLK_KP_E, - SDLK_KP_F, - SDLK_KP_XOR, - SDLK_KP_POWER, - SDLK_KP_PERCENT, - SDLK_KP_LESS, - SDLK_KP_GREATER, - SDLK_KP_AMPERSAND, - SDLK_KP_DBLAMPERSAND, - SDLK_KP_VERTICALBAR, - SDLK_KP_DBLVERTICALBAR, - SDLK_KP_COLON, - SDLK_KP_HASH, - SDLK_KP_SPACE, - SDLK_KP_AT, - SDLK_KP_EXCLAM, - SDLK_KP_MEMSTORE, - SDLK_KP_MEMRECALL, - SDLK_KP_MEMCLEAR, - SDLK_KP_MEMADD, - SDLK_KP_MEMSUBTRACT, - SDLK_KP_MEMMULTIPLY, - SDLK_KP_MEMDIVIDE, - SDLK_KP_PLUSMINUS, - SDLK_KP_CLEAR, - SDLK_KP_CLEARENTRY, - SDLK_KP_BINARY, - SDLK_KP_OCTAL, - SDLK_KP_DECIMAL, - SDLK_KP_HEXADECIMAL, - 0, 0, - SDLK_LCTRL, - SDLK_LSHIFT, - SDLK_LALT, - SDLK_LGUI, - SDLK_RCTRL, - SDLK_RSHIFT, - SDLK_RALT, - SDLK_RGUI, - 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, - SDLK_MODE, - SDLK_AUDIONEXT, - SDLK_AUDIOPREV, - SDLK_AUDIOSTOP, - SDLK_AUDIOPLAY, - SDLK_AUDIOMUTE, - SDLK_MEDIASELECT, - SDLK_WWW, - SDLK_MAIL, - SDLK_CALCULATOR, - SDLK_COMPUTER, - SDLK_AC_SEARCH, - SDLK_AC_HOME, - SDLK_AC_BACK, - SDLK_AC_FORWARD, - SDLK_AC_STOP, - SDLK_AC_REFRESH, - SDLK_AC_BOOKMARKS, - SDLK_BRIGHTNESSDOWN, - SDLK_BRIGHTNESSUP, - SDLK_DISPLAYSWITCH, - SDLK_KBDILLUMTOGGLE, - SDLK_KBDILLUMDOWN, - SDLK_KBDILLUMUP, - SDLK_EJECT, - SDLK_SLEEP, -}; - -static const char *SDL_scancode_names[SDL_NUM_SCANCODES] = { - NULL, NULL, NULL, NULL, - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "0", - "Return", - "Escape", - "Backspace", - "Tab", - "Space", - "-", - "=", - "[", - "]", - "\\", - "#", - ";", - "'", - "`", - ",", - ".", - "/", - "CapsLock", - "F1", - "F2", - "F3", - "F4", - "F5", - "F6", - "F7", - "F8", - "F9", - "F10", - "F11", - "F12", - "PrintScreen", - "ScrollLock", - "Pause", - "Insert", - "Home", - "PageUp", - "Delete", - "End", - "PageDown", - "Right", - "Left", - "Down", - "Up", - "Numlock", - "Keypad /", - "Keypad *", - "Keypad -", - "Keypad +", - "Keypad Enter", - "Keypad 1", - "Keypad 2", - "Keypad 3", - "Keypad 4", - "Keypad 5", - "Keypad 6", - "Keypad 7", - "Keypad 8", - "Keypad 9", - "Keypad 0", - "Keypad .", - NULL, - "Application", - "Power", - "Keypad =", - "F13", - "F14", - "F15", - "F16", - "F17", - "F18", - "F19", - "F20", - "F21", - "F22", - "F23", - "F24", - "Execute", - "Help", - "Menu", - "Select", - "Stop", - "Again", - "Undo", - "Cut", - "Copy", - "Paste", - "Find", - "Mute", - "VolumeUp", - "VolumeDown", - NULL, NULL, NULL, - "Keypad ,", - "Keypad = (AS400)", - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, - "AltErase", - "SysReq", - "Cancel", - "Clear", - "Prior", - "Return", - "Separator", - "Out", - "Oper", - "Clear / Again", - "CrSel", - "ExSel", - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - "Keypad 00", - "Keypad 000", - "ThousandsSeparator", - "DecimalSeparator", - "CurrencyUnit", - "CurrencySubUnit", - "Keypad (", - "Keypad )", - "Keypad {", - "Keypad }", - "Keypad Tab", - "Keypad Backspace", - "Keypad A", - "Keypad B", - "Keypad C", - "Keypad D", - "Keypad E", - "Keypad F", - "Keypad XOR", - "Keypad ^", - "Keypad %", - "Keypad <", - "Keypad >", - "Keypad &", - "Keypad &&", - "Keypad |", - "Keypad ||", - "Keypad :", - "Keypad #", - "Keypad Space", - "Keypad @", - "Keypad !", - "Keypad MemStore", - "Keypad MemRecall", - "Keypad MemClear", - "Keypad MemAdd", - "Keypad MemSubtract", - "Keypad MemMultiply", - "Keypad MemDivide", - "Keypad +/-", - "Keypad Clear", - "Keypad ClearEntry", - "Keypad Binary", - "Keypad Octal", - "Keypad Decimal", - "Keypad Hexadecimal", - NULL, NULL, - "Left Ctrl", - "Left Shift", - "Left Alt", - "Left GUI", - "Right Ctrl", - "Right Shift", - "Right Alt", - "Right GUI", - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, - "ModeSwitch", - "AudioNext", - "AudioPrev", - "AudioStop", - "AudioPlay", - "AudioMute", - "MediaSelect", - "WWW", - "Mail", - "Calculator", - "Computer", - "AC Search", - "AC Home", - "AC Back", - "AC Forward", - "AC Stop", - "AC Refresh", - "AC Bookmarks", - "BrightnessDown", - "BrightnessUp", - "DisplaySwitch", - "KBDIllumToggle", - "KBDIllumDown", - "KBDIllumUp", - "Eject", - "Sleep", -}; - -/* Taken from SDL_iconv() */ -char * -SDL_UCS4ToUTF8(Uint32 ch, char *dst) -{ - Uint8 *p = (Uint8 *) dst; - if (ch <= 0x7F) { - *p = (Uint8) ch; - ++dst; - } else if (ch <= 0x7FF) { - p[0] = 0xC0 | (Uint8) ((ch >> 6) & 0x1F); - p[1] = 0x80 | (Uint8) (ch & 0x3F); - dst += 2; - } else if (ch <= 0xFFFF) { - p[0] = 0xE0 | (Uint8) ((ch >> 12) & 0x0F); - p[1] = 0x80 | (Uint8) ((ch >> 6) & 0x3F); - p[2] = 0x80 | (Uint8) (ch & 0x3F); - dst += 3; - } else if (ch <= 0x1FFFFF) { - p[0] = 0xF0 | (Uint8) ((ch >> 18) & 0x07); - p[1] = 0x80 | (Uint8) ((ch >> 12) & 0x3F); - p[2] = 0x80 | (Uint8) ((ch >> 6) & 0x3F); - p[3] = 0x80 | (Uint8) (ch & 0x3F); - dst += 4; - } else if (ch <= 0x3FFFFFF) { - p[0] = 0xF8 | (Uint8) ((ch >> 24) & 0x03); - p[1] = 0x80 | (Uint8) ((ch >> 18) & 0x3F); - p[2] = 0x80 | (Uint8) ((ch >> 12) & 0x3F); - p[3] = 0x80 | (Uint8) ((ch >> 6) & 0x3F); - p[4] = 0x80 | (Uint8) (ch & 0x3F); - dst += 5; - } else { - p[0] = 0xFC | (Uint8) ((ch >> 30) & 0x01); - p[1] = 0x80 | (Uint8) ((ch >> 24) & 0x3F); - p[2] = 0x80 | (Uint8) ((ch >> 18) & 0x3F); - p[3] = 0x80 | (Uint8) ((ch >> 12) & 0x3F); - p[4] = 0x80 | (Uint8) ((ch >> 6) & 0x3F); - p[5] = 0x80 | (Uint8) (ch & 0x3F); - dst += 6; - } - return dst; -} - -/* Public functions */ -int -SDL_KeyboardInit(void) -{ - SDL_Keyboard *keyboard = &SDL_keyboard; - - /* Set the default keymap */ - SDL_memcpy(keyboard->keymap, SDL_default_keymap, sizeof(SDL_default_keymap)); - return (0); -} - -void -SDL_ResetKeyboard(void) -{ - SDL_Keyboard *keyboard = &SDL_keyboard; - SDL_Scancode scancode; - -#ifdef DEBUG_KEYBOARD - printf("Resetting keyboard\n"); -#endif - for (scancode = 0; scancode < SDL_NUM_SCANCODES; ++scancode) { - if (keyboard->keystate[scancode] == SDL_PRESSED) { - SDL_SendKeyboardKey(SDL_RELEASED, scancode); - } - } -} - -void -SDL_GetDefaultKeymap(SDL_Keycode * keymap) -{ - SDL_memcpy(keymap, SDL_default_keymap, sizeof(SDL_default_keymap)); -} - -void -SDL_SetKeymap(int start, SDL_Keycode * keys, int length) -{ - SDL_Keyboard *keyboard = &SDL_keyboard; - - if (start < 0 || start + length > SDL_NUM_SCANCODES) { - return; - } - - SDL_memcpy(&keyboard->keymap[start], keys, sizeof(*keys) * length); -} - -void -SDL_SetScancodeName(SDL_Scancode scancode, const char *name) -{ - SDL_scancode_names[scancode] = name; -} - -SDL_Window * -SDL_GetKeyboardFocus(void) -{ - SDL_Keyboard *keyboard = &SDL_keyboard; - - return keyboard->focus; -} - -void -SDL_SetKeyboardFocus(SDL_Window * window) -{ - SDL_Keyboard *keyboard = &SDL_keyboard; - - if (keyboard->focus && !window) { - /* We won't get anymore keyboard messages, so reset keyboard state */ - SDL_ResetKeyboard(); - } - - /* See if the current window has lost focus */ - if (keyboard->focus && keyboard->focus != window) { - - /* new window shouldn't think it has mouse captured. */ - SDL_assert(!window || !(window->flags & SDL_WINDOW_MOUSE_CAPTURE)); - - /* old window must lose an existing mouse capture. */ - if (keyboard->focus->flags & SDL_WINDOW_MOUSE_CAPTURE) { - SDL_CaptureMouse(SDL_FALSE); /* drop the capture. */ - SDL_assert(!(keyboard->focus->flags & SDL_WINDOW_MOUSE_CAPTURE)); - } - - SDL_SendWindowEvent(keyboard->focus, SDL_WINDOWEVENT_FOCUS_LOST, - 0, 0); - - /* Ensures IME compositions are committed */ - if (SDL_EventState(SDL_TEXTINPUT, SDL_QUERY)) { - SDL_VideoDevice *video = SDL_GetVideoDevice(); - if (video && video->StopTextInput) { - video->StopTextInput(video); - } - } - } - - keyboard->focus = window; - - if (keyboard->focus) { - SDL_SendWindowEvent(keyboard->focus, SDL_WINDOWEVENT_FOCUS_GAINED, - 0, 0); - - if (SDL_EventState(SDL_TEXTINPUT, SDL_QUERY)) { - SDL_VideoDevice *video = SDL_GetVideoDevice(); - if (video && video->StartTextInput) { - video->StartTextInput(video); - } - } - } -} - -int -SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode) -{ - SDL_Keyboard *keyboard = &SDL_keyboard; - int posted; - SDL_Keymod modifier; - SDL_Keycode keycode; - Uint16 modstate; - Uint32 type; - Uint8 repeat; - - if (!scancode) { - return 0; - } -#ifdef DEBUG_KEYBOARD - printf("The '%s' key has been %s\n", SDL_GetScancodeName(scancode), - state == SDL_PRESSED ? "pressed" : "released"); -#endif - - /* Figure out what type of event this is */ - switch (state) { - case SDL_PRESSED: - type = SDL_KEYDOWN; - break; - case SDL_RELEASED: - type = SDL_KEYUP; - break; - default: - /* Invalid state -- bail */ - return 0; - } - - /* Drop events that don't change state */ - repeat = (state && keyboard->keystate[scancode]); - if (keyboard->keystate[scancode] == state && !repeat) { -#if 0 - printf("Keyboard event didn't change state - dropped!\n"); -#endif - return 0; - } - - /* Update internal keyboard state */ - keyboard->keystate[scancode] = state; - - keycode = keyboard->keymap[scancode]; - - /* Update modifiers state if applicable */ - switch (keycode) { - case SDLK_LCTRL: - modifier = KMOD_LCTRL; - break; - case SDLK_RCTRL: - modifier = KMOD_RCTRL; - break; - case SDLK_LSHIFT: - modifier = KMOD_LSHIFT; - break; - case SDLK_RSHIFT: - modifier = KMOD_RSHIFT; - break; - case SDLK_LALT: - modifier = KMOD_LALT; - break; - case SDLK_RALT: - modifier = KMOD_RALT; - break; - case SDLK_LGUI: - modifier = KMOD_LGUI; - break; - case SDLK_RGUI: - modifier = KMOD_RGUI; - break; - case SDLK_MODE: - modifier = KMOD_MODE; - break; - default: - modifier = KMOD_NONE; - break; - } - if (SDL_KEYDOWN == type) { - modstate = keyboard->modstate; - switch (keycode) { - case SDLK_NUMLOCKCLEAR: - keyboard->modstate ^= KMOD_NUM; - break; - case SDLK_CAPSLOCK: - keyboard->modstate ^= KMOD_CAPS; - break; - default: - keyboard->modstate |= modifier; - break; - } - } else { - keyboard->modstate &= ~modifier; - modstate = keyboard->modstate; - } - - /* Post the event, if desired */ - posted = 0; - if (SDL_GetEventState(type) == SDL_ENABLE) { - SDL_Event event; - event.key.type = type; - event.key.state = state; - event.key.repeat = repeat; - event.key.keysym.scancode = scancode; - event.key.keysym.sym = keycode; - event.key.keysym.mod = modstate; - event.key.windowID = keyboard->focus ? keyboard->focus->id : 0; - posted = (SDL_PushEvent(&event) > 0); - } - return (posted); -} - -int -SDL_SendKeyboardText(const char *text) -{ - SDL_Keyboard *keyboard = &SDL_keyboard; - int posted; - - /* Don't post text events for unprintable characters */ - if ((unsigned char)*text < ' ' || *text == 127) { - return 0; - } - - /* Post the event, if desired */ - posted = 0; - if (SDL_GetEventState(SDL_TEXTINPUT) == SDL_ENABLE) { - SDL_Event event; - event.text.type = SDL_TEXTINPUT; - event.text.windowID = keyboard->focus ? keyboard->focus->id : 0; - SDL_utf8strlcpy(event.text.text, text, SDL_arraysize(event.text.text)); - posted = (SDL_PushEvent(&event) > 0); - } - return (posted); -} - -int -SDL_SendEditingText(const char *text, int start, int length) -{ - SDL_Keyboard *keyboard = &SDL_keyboard; - int posted; - - /* Post the event, if desired */ - posted = 0; - if (SDL_GetEventState(SDL_TEXTEDITING) == SDL_ENABLE) { - SDL_Event event; - event.edit.type = SDL_TEXTEDITING; - event.edit.windowID = keyboard->focus ? keyboard->focus->id : 0; - event.edit.start = start; - event.edit.length = length; - SDL_utf8strlcpy(event.edit.text, text, SDL_arraysize(event.edit.text)); - posted = (SDL_PushEvent(&event) > 0); - } - return (posted); -} - -void -SDL_KeyboardQuit(void) -{ -} - -const Uint8 * -SDL_GetKeyboardState(int *numkeys) -{ - SDL_Keyboard *keyboard = &SDL_keyboard; - - if (numkeys != (int *) 0) { - *numkeys = SDL_NUM_SCANCODES; - } - return keyboard->keystate; -} - -SDL_Keymod -SDL_GetModState(void) -{ - SDL_Keyboard *keyboard = &SDL_keyboard; - - return keyboard->modstate; -} - -void -SDL_SetModState(SDL_Keymod modstate) -{ - SDL_Keyboard *keyboard = &SDL_keyboard; - - keyboard->modstate = modstate; -} - -/* Note that SDL_ToggleModState() is not a public API. SDL_SetModState() is. */ -void -SDL_ToggleModState(const SDL_Keymod modstate, const SDL_bool toggle) -{ - SDL_Keyboard *keyboard = &SDL_keyboard; - if (toggle) { - keyboard->modstate |= modstate; - } else { - keyboard->modstate &= ~modstate; - } -} - - -SDL_Keycode -SDL_GetKeyFromScancode(SDL_Scancode scancode) -{ - SDL_Keyboard *keyboard = &SDL_keyboard; - - if (scancode < SDL_SCANCODE_UNKNOWN || scancode >= SDL_NUM_SCANCODES) { - SDL_InvalidParamError("scancode"); - return 0; - } - - return keyboard->keymap[scancode]; -} - -SDL_Scancode -SDL_GetScancodeFromKey(SDL_Keycode key) -{ - SDL_Keyboard *keyboard = &SDL_keyboard; - SDL_Scancode scancode; - - for (scancode = SDL_SCANCODE_UNKNOWN; scancode < SDL_NUM_SCANCODES; - ++scancode) { - if (keyboard->keymap[scancode] == key) { - return scancode; - } - } - return SDL_SCANCODE_UNKNOWN; -} - -const char * -SDL_GetScancodeName(SDL_Scancode scancode) -{ - const char *name; - if (scancode < SDL_SCANCODE_UNKNOWN || scancode >= SDL_NUM_SCANCODES) { - SDL_InvalidParamError("scancode"); - return ""; - } - - name = SDL_scancode_names[scancode]; - if (name) - return name; - else - return ""; -} - -SDL_Scancode SDL_GetScancodeFromName(const char *name) -{ - int i; - - if (!name || !*name) { - SDL_InvalidParamError("name"); - return SDL_SCANCODE_UNKNOWN; - } - - for (i = 0; i < SDL_arraysize(SDL_scancode_names); ++i) { - if (!SDL_scancode_names[i]) { - continue; - } - if (SDL_strcasecmp(name, SDL_scancode_names[i]) == 0) { - return (SDL_Scancode)i; - } - } - - SDL_InvalidParamError("name"); - return SDL_SCANCODE_UNKNOWN; -} - -const char * -SDL_GetKeyName(SDL_Keycode key) -{ - static char name[8]; - char *end; - - if (key & SDLK_SCANCODE_MASK) { - return - SDL_GetScancodeName((SDL_Scancode) (key & ~SDLK_SCANCODE_MASK)); - } - - switch (key) { - case SDLK_RETURN: - return SDL_GetScancodeName(SDL_SCANCODE_RETURN); - case SDLK_ESCAPE: - return SDL_GetScancodeName(SDL_SCANCODE_ESCAPE); - case SDLK_BACKSPACE: - return SDL_GetScancodeName(SDL_SCANCODE_BACKSPACE); - case SDLK_TAB: - return SDL_GetScancodeName(SDL_SCANCODE_TAB); - case SDLK_SPACE: - return SDL_GetScancodeName(SDL_SCANCODE_SPACE); - case SDLK_DELETE: - return SDL_GetScancodeName(SDL_SCANCODE_DELETE); - default: - /* Unaccented letter keys on latin keyboards are normally - labeled in upper case (and probably on others like Greek or - Cyrillic too, so if you happen to know for sure, please - adapt this). */ - if (key >= 'a' && key <= 'z') { - key -= 32; - } - - end = SDL_UCS4ToUTF8((Uint32) key, name); - *end = '\0'; - return name; - } -} - -SDL_Keycode -SDL_GetKeyFromName(const char *name) -{ - SDL_Keycode key; - - /* Check input */ - if (name == NULL) return SDLK_UNKNOWN; - - /* If it's a single UTF-8 character, then that's the keycode itself */ - key = *(const unsigned char *)name; - if (key >= 0xF0) { - if (SDL_strlen(name) == 4) { - int i = 0; - key = (Uint16)(name[i]&0x07) << 18; - key |= (Uint16)(name[++i]&0x3F) << 12; - key |= (Uint16)(name[++i]&0x3F) << 6; - key |= (Uint16)(name[++i]&0x3F); - return key; - } - return SDLK_UNKNOWN; - } else if (key >= 0xE0) { - if (SDL_strlen(name) == 3) { - int i = 0; - key = (Uint16)(name[i]&0x0F) << 12; - key |= (Uint16)(name[++i]&0x3F) << 6; - key |= (Uint16)(name[++i]&0x3F); - return key; - } - return SDLK_UNKNOWN; - } else if (key >= 0xC0) { - if (SDL_strlen(name) == 2) { - int i = 0; - key = (Uint16)(name[i]&0x1F) << 6; - key |= (Uint16)(name[++i]&0x3F); - return key; - } - return SDLK_UNKNOWN; - } else { - if (SDL_strlen(name) == 1) { - if (key >= 'A' && key <= 'Z') { - key += 32; - } - return key; - } - - /* Get the scancode for this name, and the associated keycode */ - return SDL_default_keymap[SDL_GetScancodeFromName(name)]; - } -} - -/* vi: set ts=4 sw=4 expandtab: */ |