/*
  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 _ANDROID_KeyInfo
#define _ANDROID_KeyInfo

#include "SDL_scancode.h"
#include "SDL_keycode.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_t mod;
} AndroidKeyInfo;

/* So far only ASCII characters here */
static AndroidKeyInfo unicharToAndroidKeyInfoTable[] = {
/*  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 /* _ANDROID_KeyInfo */

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