18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2007-2008 The Android Open Source Project
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project**
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This software is licensed under the terms of the GNU General Public
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** License version 2, as published by the Free Software Foundation, and
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** may be copied, distributed, and modified under those terms.
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project**
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This program is distributed in the hope that it will be useful,
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** but WITHOUT ANY WARRANTY; without even the implied warranty of
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** GNU General Public License for more details.
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/keyboard.h"
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/debug.h"
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/bufprint.h"
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/system.h"
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/android.h"
1771bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine#include "android/keycode-array.h"
1871bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine#include "android/charmap.h"
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  DEBUG  1
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if DEBUG
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  define  D(...)  VERBOSE_PRINT(keys,__VA_ARGS__)
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#  define  D(...)  ((void)0)
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
280158ea3220978ecc0fa1738e4a0bdae83fa36175David 'Digit' Turner#define DEFAULT_ANDROID_CHARMAP  "qwerty2"
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** LAST PRESSED KEYS
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** a small buffer of last pressed keys, this is used to properly
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** implement the Unicode keyboard mode (SDL key up event always have
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ** their .unicode field set to 0
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct {
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int  unicode;  /* Unicode of last pressed key        */
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int  sym;      /* SDL key symbol value (e.g. SDLK_a) */
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int  mod;      /* SDL key modifier value             */
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} LastKey;
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define  MAX_LAST_KEYS  16
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct SkinKeyboard {
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const AKeyCharmap*  charmap;
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinKeyset*         kset;
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char                enabled;
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char                raw_keys;
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char                last_count;
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinRotation        rotation;
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinKeyCommandFunc  command_func;
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    void*               command_opaque;
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinKeyEventFunc    press_func;
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    void*               press_opaque;
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    LastKey             last_keys[ MAX_LAST_KEYS ];
5871bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine
5971bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine    AKeycodeBuffer      keycodes;
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_set_keyset( SkinKeyboard*  keyboard, SkinKeyset*  kset )
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (kset == NULL)
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (keyboard->kset && keyboard->kset != android_keyset) {
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_keyset_free(keyboard->kset);
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    keyboard->kset = kset;
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_set_rotation( SkinKeyboard*     keyboard,
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            SkinRotation      rotation )
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    keyboard->rotation = (rotation & 3);
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_on_command( SkinKeyboard*  keyboard, SkinKeyCommandFunc  cmd_func, void*  cmd_opaque )
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    keyboard->command_func   = cmd_func;
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    keyboard->command_opaque = cmd_opaque;
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_on_key_press( SkinKeyboard*  keyboard, SkinKeyEventFunc  press_func, void*  press_opaque )
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    keyboard->press_func   = press_func;
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    keyboard->press_opaque = press_opaque;
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_add_key_event( SkinKeyboard*  kb,
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                             unsigned       code,
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                             unsigned       down )
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
10171bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine    android_keycodes_add_key_event(&kb->keycodes, code, down);
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_flush( SkinKeyboard*  kb )
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
10871bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine    android_keycodes_flush(&kb->keycodes);
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_cmd( SkinKeyboard*   keyboard,
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   SkinKeyCommand  command,
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   int             param )
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (keyboard->command_func) {
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        keyboard->command_func( keyboard->command_opaque, command, param );
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic LastKey*
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_find_last( SkinKeyboard*  keyboard,
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                         int            sym )
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    LastKey*  k   = keyboard->last_keys;
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    LastKey*  end = k + keyboard->last_count;
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for ( ; k < end; k++ ) {
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (k->sym == sym)
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return k;
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return NULL;
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_add_last( SkinKeyboard*  keyboard,
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        int            sym,
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        int            mod,
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        int            unicode )
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    LastKey*  k = keyboard->last_keys + keyboard->last_count;
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (keyboard->last_count < MAX_LAST_KEYS) {
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        k->sym     = sym;
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        k->mod     = mod;
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        k->unicode = unicode;
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        keyboard->last_count += 1;
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_remove_last( SkinKeyboard*  keyboard,
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           int            sym )
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    LastKey*  k   = keyboard->last_keys;
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    LastKey*  end = k + keyboard->last_count;
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for ( ; k < end; k++ ) {
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (k->sym == sym) {
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           /* we don't need a sorted array, so place the last
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            * element in place at the position of the removed
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            * one... */
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            k[0] = end[-1];
1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            keyboard->last_count -= 1;
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void
1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_clear_last( SkinKeyboard*  keyboard )
1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    keyboard->last_count = 0;
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_rotate_sym( SkinKeyboard*  keyboard,
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                          int            sym )
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    switch (keyboard->rotation) {
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case SKIN_ROTATION_90:
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            switch (sym) {
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case SDLK_LEFT:  sym = SDLK_DOWN; break;
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case SDLK_RIGHT: sym = SDLK_UP; break;
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case SDLK_UP:    sym = SDLK_LEFT; break;
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case SDLK_DOWN:  sym = SDLK_RIGHT; break;
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case SKIN_ROTATION_180:
1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            switch (sym) {
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case SDLK_LEFT:  sym = SDLK_RIGHT; break;
1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case SDLK_RIGHT: sym = SDLK_LEFT; break;
1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case SDLK_UP:    sym = SDLK_DOWN; break;
1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case SDLK_DOWN:  sym = SDLK_UP; break;
1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case SKIN_ROTATION_270:
2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            switch (sym) {
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case SDLK_LEFT:  sym = SDLK_UP; break;
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case SDLK_RIGHT: sym = SDLK_DOWN; break;
2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case SDLK_UP:    sym = SDLK_RIGHT; break;
2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case SDLK_DOWN:  sym = SDLK_LEFT; break;
2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        default: ;
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return  sym;
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic AndroidKeyCode
2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_key_to_code( SkinKeyboard*  keyboard,
2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           unsigned       sym,
2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           int            mod,
2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           int            down )
2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    AndroidKeyCode  code   = 0;
2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int             mod0   = mod;
2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinKeyCommand  command;
2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* first, handle the arrow keys directly */
2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* rotate them if necessary */
2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    sym  = skin_keyboard_rotate_sym(keyboard, sym);
2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    mod &= (KMOD_CTRL | KMOD_ALT | KMOD_SHIFT);
2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    switch (sym) {
2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case SDLK_LEFT:       code = kKeyCodeDpadLeft; break;
2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case SDLK_RIGHT:      code = kKeyCodeDpadRight; break;
2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case SDLK_UP:         code = kKeyCodeDpadUp; break;
2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case SDLK_DOWN:       code = kKeyCodeDpadDown; break;
2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        default: ;
2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (code != 0) {
2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        D("handling arrow (sym=%d mod=%d)", sym, mod);
2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (!keyboard->raw_keys) {
2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            int  doCapL, doCapR, doAltL, doAltR;
2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (!down) {
2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                LastKey*  k = skin_keyboard_find_last(keyboard, sym);
2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (k != NULL) {
2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    mod = k->mod;
2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    skin_keyboard_remove_last( keyboard, sym );
2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            } else {
2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                skin_keyboard_add_last( keyboard, sym, mod, 0);
2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            doCapL = (mod & 0x7ff) & KMOD_LSHIFT;
2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            doCapR = (mod & 0x7ff) & KMOD_RSHIFT;
2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            doAltL = (mod & 0x7ff) & KMOD_LALT;
2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            doAltR = (mod & 0x7ff) & KMOD_RALT;
2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (down) {
2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (doAltL) skin_keyboard_add_key_event( keyboard, kKeyCodeAltLeft, 1 );
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (doAltR) skin_keyboard_add_key_event( keyboard, kKeyCodeAltRight, 1 );
2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (doCapL) skin_keyboard_add_key_event( keyboard, kKeyCodeCapLeft, 1 );
2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (doCapR) skin_keyboard_add_key_event( keyboard, kKeyCodeCapRight, 1 );
2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            skin_keyboard_add_key_event(keyboard, code, down);
2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (!down) {
2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (doCapR) skin_keyboard_add_key_event( keyboard, kKeyCodeCapRight, 0 );
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (doCapL) skin_keyboard_add_key_event( keyboard, kKeyCodeCapLeft, 0 );
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (doAltR) skin_keyboard_add_key_event( keyboard, kKeyCodeAltRight, 0 );
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if (doAltL) skin_keyboard_add_key_event( keyboard, kKeyCodeAltLeft, 0 );
2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            code = 0;
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return code;
2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* special case for keypad keys, ignore them here if numlock is on */
2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if ((mod0 & KMOD_NUM) != 0) {
2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        switch (sym) {
2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case SDLK_KP0:
2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case SDLK_KP1:
2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case SDLK_KP2:
2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case SDLK_KP3:
2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case SDLK_KP4:
2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case SDLK_KP5:
2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case SDLK_KP6:
2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case SDLK_KP7:
2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case SDLK_KP8:
2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case SDLK_KP9:
2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case SDLK_KP_PLUS:
2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case SDLK_KP_MINUS:
2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case SDLK_KP_MULTIPLY:
2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case SDLK_KP_DIVIDE:
2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case SDLK_KP_EQUALS:
2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case SDLK_KP_PERIOD:
2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case SDLK_KP_ENTER:
2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                return 0;
2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* now try all keyset combos */
3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    command = skin_keyset_get_command( keyboard->kset, sym, mod );
3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (command != SKIN_KEY_COMMAND_NONE) {
3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        D("handling command %s from (sym=%d, mod=%d, str=%s)",
3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          skin_key_command_to_str(command), sym, mod, skin_key_symmod_to_str(sym,mod));
3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_keyboard_cmd( keyboard, command, down );
3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return 0;
3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    D("could not handle (sym=%d, mod=%d, str=%s)", sym, mod,
3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      skin_key_symmod_to_str(sym,mod));
3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return -1;
3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this gets called only if the reverse unicode mapping didn't work
3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * or wasn't used (when in raw keys mode)
3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic AndroidKeyCode
3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_raw_key_to_code(SkinKeyboard*  kb, unsigned sym, int  down)
3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    switch(sym){
3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_1:          return kKeyCode1;
3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_2:          return kKeyCode2;
3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_3:          return kKeyCode3;
3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_4:          return kKeyCode4;
3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_5:          return kKeyCode5;
3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_6:          return kKeyCode6;
3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_7:          return kKeyCode7;
3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_8:          return kKeyCode8;
3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_9:          return kKeyCode9;
3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_0:          return kKeyCode0;
3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_q:          return kKeyCodeQ;
3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_w:          return kKeyCodeW;
3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_e:          return kKeyCodeE;
3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_r:          return kKeyCodeR;
3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_t:          return kKeyCodeT;
3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_y:          return kKeyCodeY;
3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_u:          return kKeyCodeU;
3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_i:          return kKeyCodeI;
3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_o:          return kKeyCodeO;
3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_p:          return kKeyCodeP;
3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_a:          return kKeyCodeA;
3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_s:          return kKeyCodeS;
3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_d:          return kKeyCodeD;
3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_f:          return kKeyCodeF;
3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_g:          return kKeyCodeG;
3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_h:          return kKeyCodeH;
3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_j:          return kKeyCodeJ;
3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_k:          return kKeyCodeK;
3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_l:          return kKeyCodeL;
3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_z:          return kKeyCodeZ;
3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_x:          return kKeyCodeX;
3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_c:          return kKeyCodeC;
3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_v:          return kKeyCodeV;
3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_b:          return kKeyCodeB;
3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_n:          return kKeyCodeN;
3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_m:          return kKeyCodeM;
3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_COMMA:      return kKeyCodeComma;
3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_PERIOD:     return kKeyCodePeriod;
3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_SPACE:      return kKeyCodeSpace;
3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_SLASH:      return kKeyCodeSlash;
3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_RETURN:     return kKeyCodeNewline;
3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_BACKSPACE:  return kKeyCodeDel;
3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* these are qwerty keys not on a device keyboard */
3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_TAB:        return kKeyCodeTab;
3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_BACKQUOTE:  return kKeyCodeGrave;
3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_MINUS:      return kKeyCodeMinus;
3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_EQUALS:     return kKeyCodeEquals;
3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_LEFTBRACKET: return kKeyCodeLeftBracket;
3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_RIGHTBRACKET: return kKeyCodeRightBracket;
3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_BACKSLASH:  return kKeyCodeBackslash;
3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_SEMICOLON:  return kKeyCodeSemicolon;
3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_QUOTE:      return kKeyCodeApostrophe;
3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_RSHIFT:     return kKeyCodeCapRight;
3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_LSHIFT:     return kKeyCodeCapLeft;
3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_RMETA:      return kKeyCodeSym;
3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_LMETA:      return kKeyCodeSym;
3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_RALT:       return kKeyCodeAltRight;
3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_LALT:       return kKeyCodeAltLeft;
3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_RCTRL:      return kKeyCodeSym;
3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case SDLK_LCTRL:      return kKeyCodeSym;
3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    default:
3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* fprintf(stderr,"* unknown sdl keysym %d *\n", sym); */
3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void
3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_do_key_event( SkinKeyboard*   kb,
3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            AndroidKeyCode  code,
3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                            int             down )
3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (kb->press_func) {
3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        kb->press_func( kb->press_opaque, code, down );
4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    skin_keyboard_add_key_event(kb, code, down);
4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint
4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_process_unicode_event( SkinKeyboard*  kb,  unsigned int  unicode, int  down )
4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
40871bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine    return android_charmap_reverse_map_unicode(kb->charmap, unicode, down,
40971bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine                                               &kb->keycodes);
4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_enable( SkinKeyboard*  keyboard,
4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                      int            enabled )
4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    keyboard->enabled = enabled;
4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (enabled) {
4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        SDL_EnableUNICODE(!keyboard->raw_keys);
4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        SDL_EnableKeyRepeat(0,0);
4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_process_event( SkinKeyboard*  kb, SDL_Event*  ev, int  down )
4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    unsigned         code;
4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int              unicode = ev->key.keysym.unicode;
4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int              sym     = ev->key.keysym.sym;
4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int              mod     = ev->key.keysym.mod;
4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* ignore key events if we're not enabled */
4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!kb->enabled) {
4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        printf( "ignoring key event sym=%d mod=0x%x unicode=%d\n",
4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                sym, mod, unicode );
4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* first, try the keyboard-mode-independent keys */
4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    code = skin_keyboard_key_to_code( kb, sym, mod, down );
4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (code == 0)
4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if ((int)code > 0) {
4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_keyboard_do_key_event(kb, code, down);
4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_keyboard_flush(kb);
4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* Ctrl-K is used to switch between 'unicode' and 'raw' modes */
4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (sym == SDLK_k)
4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        int  mod2 = mod & 0x7ff;
4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if ( mod2 == KMOD_LCTRL || mod2 == KMOD_RCTRL ) {
4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (down) {
4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                skin_keyboard_clear_last(kb);
4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                kb->raw_keys = !kb->raw_keys;
4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                SDL_EnableUNICODE(!kb->raw_keys);
4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                D( "switching keyboard to %s mode", kb->raw_keys ? "raw" : "unicode" );
4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return;
4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!kb->raw_keys) {
4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project       /* ev->key.keysym.unicode is only valid on keydown events, and will be 0
4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        * on the corresponding keyup ones, so remember the set of last pressed key
4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        * syms to "undo" the job
4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        */
4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if ( !down && unicode == 0 ) {
4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            LastKey*  k = skin_keyboard_find_last(kb, sym);
4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (k != NULL) {
4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                unicode = k->unicode;
4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                skin_keyboard_remove_last(kb, sym);
4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!kb->raw_keys &&
4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_keyboard_process_unicode_event( kb, unicode, down ) > 0)
4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (down)
4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            skin_keyboard_add_last( kb, sym, mod, unicode );
4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_keyboard_flush( kb );
4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    code = skin_keyboard_raw_key_to_code( kb, sym, down );
4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if ( !kb->raw_keys &&
4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         (code == kKeyCodeAltLeft  || code == kKeyCodeAltRight ||
4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          code == kKeyCodeCapLeft  || code == kKeyCodeCapRight ||
4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project          code == kKeyCodeSym) )
4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return;
4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (code == -1) {
4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        D("ignoring keysym %d", sym );
4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } else if (code > 0) {
5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_keyboard_do_key_event(kb, code, down);
5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_keyboard_flush(kb);
5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5059085a28c14f369d231dbae099a690689179f428avchtchetkinestatic SkinKeyboard*
5069085a28c14f369d231dbae099a690689179f428avchtchetkineskin_keyboard_create_from_charmap_name(const char*  charmap_name,
5079085a28c14f369d231dbae099a690689179f428avchtchetkine                                       int  use_raw_keys)
5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinKeyboard*  kb;
5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ANEW0(kb);
5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
51371bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine    kb->charmap = android_get_charmap_by_name(charmap_name);
5149085a28c14f369d231dbae099a690689179f428avchtchetkine    if (!kb->charmap) {
5150158ea3220978ecc0fa1738e4a0bdae83fa36175David 'Digit' Turner        // Charmap name was not found. Default to "qwerty2" */
5160158ea3220978ecc0fa1738e4a0bdae83fa36175David 'Digit' Turner        kb->charmap = android_get_charmap_by_name(DEFAULT_ANDROID_CHARMAP);
5179085a28c14f369d231dbae099a690689179f428avchtchetkine        fprintf(stderr, "### warning, skin requires unknown '%s' charmap, reverting to '%s'\n",
51871bb14f826775867d16e7d382cfdc48e6ca46ccbVladimir Chtchetkine                charmap_name, kb->charmap->name );
5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    kb->raw_keys = use_raw_keys;
5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    kb->enabled  = 0;
5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* add default keyset */
5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (android_keyset)
5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        kb->kset = android_keyset;
5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    else
5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        kb->kset = skin_keyset_new_from_text( skin_keyset_get_default() );
5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return kb;
5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5329085a28c14f369d231dbae099a690689179f428avchtchetkineSkinKeyboard*
53372d561178e62b74923cfe3bc0faa59bcb07c57c3Xavier Ducrohetskin_keyboard_create( const char*  kcm_file_path, int  use_raw_keys )
5349085a28c14f369d231dbae099a690689179f428avchtchetkine{
53572d561178e62b74923cfe3bc0faa59bcb07c57c3Xavier Ducrohet    const char* charmap_name = DEFAULT_ANDROID_CHARMAP;
53672d561178e62b74923cfe3bc0faa59bcb07c57c3Xavier Ducrohet    char        cmap_buff[AKEYCHARMAP_NAME_SIZE];
5379085a28c14f369d231dbae099a690689179f428avchtchetkine
53872d561178e62b74923cfe3bc0faa59bcb07c57c3Xavier Ducrohet    if (kcm_file_path != NULL) {
53972d561178e62b74923cfe3bc0faa59bcb07c57c3Xavier Ducrohet        kcm_extract_charmap_name(kcm_file_path, cmap_buff, sizeof cmap_buff);
54072d561178e62b74923cfe3bc0faa59bcb07c57c3Xavier Ducrohet        charmap_name = cmap_buff;
54172d561178e62b74923cfe3bc0faa59bcb07c57c3Xavier Ducrohet    }
542cccd28ca5064a7bd14282cd774ee5bb7126d5845Xavier Ducrohet    return skin_keyboard_create_from_charmap_name(charmap_name, use_raw_keys);
543cccd28ca5064a7bd14282cd774ee5bb7126d5845Xavier Ducrohet}
544cccd28ca5064a7bd14282cd774ee5bb7126d5845Xavier Ducrohet
5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyboard_free( SkinKeyboard*  keyboard )
5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (keyboard) {
5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        AFREE(keyboard);
5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
552