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