/*
  Simple DirectMedia Layer
  Copyright (C) 1997-2021 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.
*/

#ifndef _UIKIT_KeyInfo
#define _UIKIT_KeyInfo

#include "SDL_scancode.h"

/*
    This file is used by the keyboard code in SDL_uikitview.m to convert between characters
    passed in from the iPhone's virtual keyboard, and tuples of SDL_Scancode and SDL_keymods.
    For example unicharToUIKeyInfoTable['a'] would give you the scan code and keymod for lower
    case a.
*/

typedef struct
{
    SDL_Scancode code;
    Uint16 mod;
} UIKitKeyInfo;

/* So far only ASCII characters here */
static UIKitKeyInfo unicharToUIKeyInfoTable[] = {
/*  0 */  {  SDL_SCANCODE_UNKNOWN, 0 },
/*  1 */  {  SDL_SCANCODE_UNKNOWN, 0 },
/*  2 */  {  SDL_SCANCODE_UNKNOWN, 0 },
/*  3 */  {  SDL_SCANCODE_UNKNOWN, 0 },
/*  4 */  {  SDL_SCANCODE_UNKNOWN, 0 },
/*  5 */  {  SDL_SCANCODE_UNKNOWN, 0 },
/*  6 */  {  SDL_SCANCODE_UNKNOWN, 0 },
/*  7 */  {  SDL_SCANCODE_UNKNOWN, 0 },
/*  8 */  {  SDL_SCANCODE_UNKNOWN, 0 },
/*  9 */  {  SDL_SCANCODE_UNKNOWN, 0 },
/*  10 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  11 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  12 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  13 */ {   SDL_SCANCODE_RETURN, 0 },
/*  14 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  15 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  16 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  17 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  18 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  19 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  20 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  21 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  22 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  23 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  24 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  25 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  26 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  27 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  28 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  29 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  30 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  31 */ {   SDL_SCANCODE_UNKNOWN, 0 },
/*  32 */ {   SDL_SCANCODE_SPACE, 0 },
/*  33 */ {   SDL_SCANCODE_1,    KMOD_SHIFT },        /* plus shift modifier '!' */
/*  34 */ {   SDL_SCANCODE_APOSTROPHE, KMOD_SHIFT },    /* plus shift modifier '"' */
/*  35 */ {   SDL_SCANCODE_3, KMOD_SHIFT },            /* plus shift modifier '#' */
/*  36 */ {   SDL_SCANCODE_4, KMOD_SHIFT },            /* plus shift modifier '$' */
/*  37 */ {   SDL_SCANCODE_5, KMOD_SHIFT },            /* plus shift modifier '%' */
/*  38 */ {   SDL_SCANCODE_7, KMOD_SHIFT },            /* plus shift modifier '&' */
/*  39 */ {   SDL_SCANCODE_APOSTROPHE, 0 },    /* '''                       */
/*  40 */ {   SDL_SCANCODE_9, KMOD_SHIFT },             /* plus shift modifier '(' */
/*  41 */ {   SDL_SCANCODE_0, KMOD_SHIFT },            /* plus shift modifier ')' */
/*  42 */ {   SDL_SCANCODE_8, KMOD_SHIFT },            /* '*' */
/*  43 */ {   SDL_SCANCODE_EQUALS, KMOD_SHIFT },    /* plus shift modifier '+' */
/*  44 */ {   SDL_SCANCODE_COMMA, 0 },        /* ','                       */
/*  45 */ {   SDL_SCANCODE_MINUS, 0 },        /* '-'                       */
/*  46 */ {   SDL_SCANCODE_PERIOD, 0 },        /* '.'                       */
/*  47 */ {   SDL_SCANCODE_SLASH, 0 },        /* '/'                       */
/*  48 */ {   SDL_SCANCODE_0, 0    },
/*  49 */ {   SDL_SCANCODE_1, 0 },
/*  50 */ {   SDL_SCANCODE_2, 0 },
/*  51 */ {   SDL_SCANCODE_3, 0 },
/*  52 */ {   SDL_SCANCODE_4, 0 },
/*  53 */ {   SDL_SCANCODE_5, 0 },
/*  54 */ {   SDL_SCANCODE_6, 0 },
/*  55 */ {   SDL_SCANCODE_7, 0 },
/*  56 */ {   SDL_SCANCODE_8, 0 },
/*  57 */ {   SDL_SCANCODE_9, 0 },
/*  58 */ {   SDL_SCANCODE_SEMICOLON,  KMOD_SHIFT },    /* plus shift modifier ';' */
/*  59 */ {   SDL_SCANCODE_SEMICOLON, 0 },
/*  60 */ {   SDL_SCANCODE_COMMA,  KMOD_SHIFT },         /* plus shift modifier '<' */
/*  61 */ {   SDL_SCANCODE_EQUALS, 0 },
/*  62 */ {   SDL_SCANCODE_PERIOD,  KMOD_SHIFT },        /* plus shift modifier '>' */
/*  63 */ {   SDL_SCANCODE_SLASH,  KMOD_SHIFT },        /* plus shift modifier '?' */
/*  64 */ {   SDL_SCANCODE_2,  KMOD_SHIFT },            /* plus shift modifier '@' */
/*  65 */ {   SDL_SCANCODE_A,  KMOD_SHIFT },            /* all the following need shift modifiers */
/*  66 */ {   SDL_SCANCODE_B,  KMOD_SHIFT },
/*  67 */ {   SDL_SCANCODE_C,  KMOD_SHIFT },
/*  68 */ {   SDL_SCANCODE_D,  KMOD_SHIFT },
/*  69 */ {   SDL_SCANCODE_E,  KMOD_SHIFT },
/*  70 */ {   SDL_SCANCODE_F,  KMOD_SHIFT },
/*  71 */ {   SDL_SCANCODE_G,  KMOD_SHIFT },
/*  72 */ {   SDL_SCANCODE_H,  KMOD_SHIFT },
/*  73 */ {   SDL_SCANCODE_I,  KMOD_SHIFT },
/*  74 */ {   SDL_SCANCODE_J,  KMOD_SHIFT },
/*  75 */ {   SDL_SCANCODE_K,  KMOD_SHIFT },
/*  76 */ {   SDL_SCANCODE_L,  KMOD_SHIFT },
/*  77 */ {   SDL_SCANCODE_M,  KMOD_SHIFT },
/*  78 */ {   SDL_SCANCODE_N,  KMOD_SHIFT },
/*  79 */ {   SDL_SCANCODE_O,  KMOD_SHIFT },
/*  80 */ {   SDL_SCANCODE_P,  KMOD_SHIFT },
/*  81 */ {   SDL_SCANCODE_Q,  KMOD_SHIFT },
/*  82 */ {   SDL_SCANCODE_R,  KMOD_SHIFT },
/*  83 */ {   SDL_SCANCODE_S,  KMOD_SHIFT },
/*  84 */ {   SDL_SCANCODE_T,  KMOD_SHIFT },
/*  85 */ {   SDL_SCANCODE_U,  KMOD_SHIFT },
/*  86 */ {   SDL_SCANCODE_V,  KMOD_SHIFT },
/*  87 */ {   SDL_SCANCODE_W,  KMOD_SHIFT },
/*  88 */ {   SDL_SCANCODE_X,  KMOD_SHIFT },
/*  89 */ {   SDL_SCANCODE_Y,  KMOD_SHIFT },
/*  90 */ {   SDL_SCANCODE_Z,  KMOD_SHIFT },
/*  91 */ {   SDL_SCANCODE_LEFTBRACKET, 0 },
/*  92 */ {   SDL_SCANCODE_BACKSLASH, 0 },
/*  93 */ {   SDL_SCANCODE_RIGHTBRACKET, 0 },
/*  94 */ {   SDL_SCANCODE_6,  KMOD_SHIFT },            /* plus shift modifier '^' */
/*  95 */ {   SDL_SCANCODE_MINUS,  KMOD_SHIFT },        /* plus shift modifier '_' */
/*  96 */ {   SDL_SCANCODE_GRAVE,  KMOD_SHIFT },        /* '`' */
/*  97 */ {   SDL_SCANCODE_A, 0    },
/*  98 */ {   SDL_SCANCODE_B, 0 },
/*  99 */ {   SDL_SCANCODE_C, 0 },
/*  100 */{    SDL_SCANCODE_D, 0 },
/*  101 */{    SDL_SCANCODE_E, 0 },
/*  102 */{    SDL_SCANCODE_F, 0 },
/*  103 */{    SDL_SCANCODE_G, 0 },
/*  104 */{    SDL_SCANCODE_H, 0 },
/*  105 */{    SDL_SCANCODE_I, 0 },
/*  106 */{    SDL_SCANCODE_J, 0 },
/*  107 */{    SDL_SCANCODE_K, 0 },
/*  108 */{    SDL_SCANCODE_L, 0 },
/*  109 */{    SDL_SCANCODE_M, 0 },
/*  110 */{    SDL_SCANCODE_N, 0 },
/*  111 */{    SDL_SCANCODE_O, 0 },
/*  112 */{    SDL_SCANCODE_P, 0 },
/*  113 */{    SDL_SCANCODE_Q, 0 },
/*  114 */{    SDL_SCANCODE_R, 0 },
/*  115 */{    SDL_SCANCODE_S, 0 },
/*  116 */{    SDL_SCANCODE_T, 0 },
/*  117 */{    SDL_SCANCODE_U, 0 },
/*  118 */{    SDL_SCANCODE_V, 0 },
/*  119 */{    SDL_SCANCODE_W, 0 },
/*  120 */{    SDL_SCANCODE_X, 0 },
/*  121 */{    SDL_SCANCODE_Y, 0 },
/*  122 */{    SDL_SCANCODE_Z, 0 },
/*  123 */{    SDL_SCANCODE_LEFTBRACKET, KMOD_SHIFT },    /* plus shift modifier '{' */
/*  124 */{    SDL_SCANCODE_BACKSLASH, KMOD_SHIFT },    /* plus shift modifier '|' */
/*  125 */{    SDL_SCANCODE_RIGHTBRACKET, KMOD_SHIFT },    /* plus shift modifier '}' */
/*  126 */{    SDL_SCANCODE_GRAVE, KMOD_SHIFT },         /* plus shift modifier '~' */
/*  127 */{    SDL_SCANCODE_BACKSPACE, KMOD_SHIFT }
};

#endif /* _UIKIT_KeyInfo */

/* vi: set ts=4 sw=4 expandtab: */
