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/keyset.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/android.h" 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <SDL.h> 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DEBUG 1 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 1 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define D_ACTIVE VERBOSE_CHECK(keys) 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define D_ACTIVE DEBUG 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if DEBUG 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define D(...) VERBOSE_PRINT(keys,__VA_ARGS__) 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define D(...) ((void)0) 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _SKIN_KEY_COMMAND(x,y) #x , 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const char* const command_strings[ SKIN_KEY_COMMAND_MAX ] = { 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_KEY_COMMAND_LIST 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef _SKIN_KEY_COMMAND 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char* 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_key_command_to_str( SkinKeyCommand cmd ) 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cmd > SKIN_KEY_COMMAND_NONE && cmd < SKIN_KEY_COMMAND_MAX) 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return command_strings[cmd]; 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinKeyCommand 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_key_command_from_str( const char* str, int len ) 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (len < 0) 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project len = strlen(str); 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < SKIN_KEY_COMMAND_MAX; nn++) { 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* cmd = command_strings[nn]; 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !memcmp( cmd, str, len ) && cmd[len] == 0 ) 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (SkinKeyCommand) nn; 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return SKIN_KEY_COMMAND_NONE; 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _SKIN_KEY_COMMAND(x,y) y , 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const char* const command_descriptions[ SKIN_KEY_COMMAND_MAX ] = { 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_KEY_COMMAND_LIST 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef _SKIN_KEY_COMMAND 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char* 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_key_command_description( SkinKeyCommand cmd ) 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (cmd > SKIN_KEY_COMMAND_NONE && cmd < SKIN_KEY_COMMAND_MAX) 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return command_descriptions[cmd]; 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _KEYSYM1_(x) _KEYSYM_(x,x) 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _KEYSYM_LIST \ 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(BACKSPACE) \ 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(TAB) \ 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(CLEAR) \ 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(RETURN,ENTER) \ 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(PAUSE) \ 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(ESCAPE) \ 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(SPACE) \ 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(EXCLAIM,EXCLAM) \ 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(QUOTEDBL,DOUBLEQUOTE) \ 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(HASH,HASH) \ 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(DOLLAR) \ 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(AMPERSAND) \ 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(QUOTE) \ 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(LEFTPAREN,LPAREN) \ 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(RIGHTPAREN,RPAREN) \ 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(ASTERISK) \ 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(PLUS) \ 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(COMMA) \ 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(MINUS) \ 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(PERIOD) \ 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(SLASH) \ 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(0) \ 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(1) \ 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(2) \ 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(3) \ 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(4) \ 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(5) \ 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(6) \ 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(7) \ 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(8) \ 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(9) \ 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(COLON) \ 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(SEMICOLON) \ 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(LESS) \ 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(EQUALS,EQUAL) \ 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(GREATER) \ 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(QUESTION) \ 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(AT) \ 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(LEFTBRACKET) \ 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(BACKSLASH) \ 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(RIGHTBRACKET) \ 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(CARET) \ 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(UNDERSCORE) \ 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(BACKQUOTE) \ 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(a,A) \ 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(b,B) \ 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(c,C) \ 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(d,D) \ 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(e,E) \ 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(f,F) \ 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(g,G) \ 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(h,H) \ 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(i,I) \ 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(j,J) \ 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(k,K) \ 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(l,L) \ 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(m,M) \ 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(n,N) \ 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(o,O) \ 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(p,P) \ 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(q,Q) \ 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(r,R) \ 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(s,S) \ 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(t,T) \ 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(u,U) \ 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(v,V) \ 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(w,W) \ 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(x,X) \ 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(y,Y) \ 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(z,Z) \ 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(DELETE) \ 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(KP_PLUS,KEYPAD_PLUS) \ 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(KP_MINUS,KEYPAD_MINUS) \ 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(KP_MULTIPLY,KEYPAD_MULTIPLY) \ 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(KP_DIVIDE,KEYPAD_DIVIDE) \ 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(KP_ENTER,KEYPAD_ENTER) \ 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(KP_PERIOD,KEYPAD_PERIOD) \ 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(KP_EQUALS,KEYPAD_EQUALS) \ 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(KP1,KEYPAD_1) \ 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(KP2,KEYPAD_2) \ 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(KP3,KEYPAD_3) \ 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(KP4,KEYPAD_4) \ 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(KP5,KEYPAD_5) \ 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(KP6,KEYPAD_6) \ 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(KP7,KEYPAD_7) \ 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(KP8,KEYPAD_8) \ 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(KP9,KEYPAD_9) \ 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_(KP0,KEYPAD_0) \ 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(UP) \ 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(DOWN) \ 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(RIGHT) \ 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(LEFT) \ 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(INSERT) \ 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(HOME) \ 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(END) \ 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(PAGEUP) \ 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(PAGEDOWN) \ 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(F1) \ 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(F2) \ 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(F3) \ 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(F4) \ 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(F5) \ 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(F6) \ 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(F7) \ 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(F8) \ 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(F9) \ 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(F10) \ 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(F11) \ 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(F12) \ 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(F13) \ 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(F14) \ 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(F15) \ 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(SCROLLOCK) \ 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(SYSREQ) \ 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(PRINT) \ 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM1_(BREAK) \ 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define _KEYSYM_(x,y) { SDLK_##x, #y }, 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic const struct { int _sym; const char* _str; } keysym_names[] = 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _KEYSYM_LIST 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 0, NULL } 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef _KEYSYM_ 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keysym_str_count( void ) 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return sizeof(keysym_names)/sizeof(keysym_names[0])-1; 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char* 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keysym_str( int index ) 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (index >= 0 && index < skin_keysym_str_count()) 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return keysym_names[index]._str; 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char* 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_key_symmod_to_str( int sym, int mod ) 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static char temp[32]; 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p = temp; 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end = p + sizeof(temp); 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((mod & KMOD_LCTRL) != 0) { 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "Ctrl-"); 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((mod & KMOD_RCTRL) != 0) { 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "RCtrl-"); 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((mod & KMOD_LSHIFT) != 0) { 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "Shift-"); 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((mod & KMOD_RSHIFT) != 0) { 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "RShift-"); 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((mod & KMOD_LALT) != 0) { 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "Alt-"); 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((mod & KMOD_RALT) != 0) { 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "RAlt-"); 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; keysym_names[nn]._sym != 0; nn++) { 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (keysym_names[nn]._sym == sym) { 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "%s", keysym_names[nn]._str); 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return temp;; 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (sym >= 32 && sym <= 127) { 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint(p, end, "%c", sym); 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return temp; 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_key_symmod_from_str( const char* str, int *psym, int *pmod ) 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int mod = 0; 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int match = 1; 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* s0 = str; 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static const struct { const char* prefix; int mod; } mods[] = 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "^", KMOD_LCTRL }, 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "Ctrl", KMOD_LCTRL }, 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "ctrl", KMOD_LCTRL }, 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "RCtrl", KMOD_RCTRL }, 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "rctrl", KMOD_RCTRL }, 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "Alt", KMOD_LALT }, 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "alt", KMOD_LALT }, 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "RAlt", KMOD_RALT }, 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "ralt", KMOD_RALT }, 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "Shift", KMOD_LSHIFT }, 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "shift", KMOD_LSHIFT }, 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "RShift", KMOD_RSHIFT }, 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "rshift", KMOD_RSHIFT }, 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, 0 } 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }; 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (match) { 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project match = 0; 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; mods[nn].prefix != NULL; nn++) { 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* prefix = mods[nn].prefix; 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int len = strlen(prefix); 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !memcmp(str, prefix, len) ) { 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project str += len; 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project match = 1; 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project mod |= mods[nn].mod; 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (str[0] == '-' && str[1] != 0) 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project str++; 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; keysym_names[nn]._sym; nn++) { 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !stricmp(str, keysym_names[nn]._str) ) 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !strcasecmp(str, keysym_names[nn]._str) ) 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *psym = keysym_names[nn]._sym; 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pmod = mod; 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("%s: can't find sym value for '%s' (mod=%d, str=%s)", __FUNCTION__, s0, mod, str); 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct { 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sym; 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int mod; 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinKeyCommand command; 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} SkinKeyItem; 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct SkinKeyset { 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int num_items; 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int max_items; 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinKeyItem* items; 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyset_add( SkinKeyset* kset, int sym, int mod, SkinKeyCommand command ) 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinKeyItem* item = kset->items; 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinKeyItem* end = item + kset->num_items; 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinKeyItem* first = NULL; 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int count = 0; 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "adding binding %s to %s", skin_key_command_to_str(command), skin_key_symmod_to_str(sym,mod)); 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; item < end; item++) { 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (item->command == command) { 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!first) 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project first = item; 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (++count == SKIN_KEY_COMMAND_MAX_BINDINGS) { 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* replace the first (oldest) one in the list */ 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project first->sym = sym; 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project first->mod = mod; 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (item->sym == sym && item->mod == mod) { 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* replace a (sym,mod) binding */ 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project item->command = command; 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (kset->num_items >= kset->max_items) { 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int old_size = kset->max_items; 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int new_size = old_size + (old_size >> 1) + 4; 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinKeyItem* new_items = realloc( kset->items, new_size*sizeof(SkinKeyItem) ); 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (new_items == NULL) { 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project kset->items = new_items; 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project kset->max_items = new_size; 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project item = kset->items + kset->num_items++; 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project item->command = command; 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project item->sym = sym; 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project item->mod = mod; 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 1; 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinKeyset* 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyset_new ( AConfig* root ) 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinKeyset* kset = calloc(1, sizeof(*kset)); 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* node = root->first_child;; 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (kset == NULL) 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; node != NULL; node = node->next ) 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinKeyCommand command; 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sym, mod; 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p; 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project command = skin_key_command_from_str( node->name, -1 ); 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (command == SKIN_KEY_COMMAND_NONE) { 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "ignoring unknown keyset command '%s'", node->name ); 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = (char*)node->value; 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (*p) { 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* q = strpbrk( p, " \t,:" ); 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q == NULL) 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q = p + strlen(p); 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (q > p) { 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int len = q - p; 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char keys[24]; 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (len+1 >= (int)sizeof(keys)) { 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("key binding too long: '%s'", p); 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memcpy( keys, p, len ); 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project keys[len] = 0; 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( skin_key_symmod_from_str( keys, &sym, &mod ) < 0 ) { 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "ignoring unknown keys '%s' for command '%s'", 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project keys, node->name ); 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_keyset_add( kset, sym, mod, command ); 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (*q) 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project q += 1; 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = q; 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return kset; 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinKeyset* 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyset_new_from_text( const char* text ) 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* root = aconfig_node("",""); 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* str = strdup(text); 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinKeyset* result; 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("kset new from:\n%s", text); 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project aconfig_load( root, str ); 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project result = skin_keyset_new( root ); 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free(str); 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D("kset done result=%p", result); 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return result; 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyset_free( SkinKeyset* kset ) 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (kset) { 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free(kset->items); 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project kset->items = NULL; 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project kset->num_items = 0; 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project kset->max_items = 0; 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free(kset); 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyset_get_bindings( SkinKeyset* kset, 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinKeyCommand command, 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinKeyBinding* bindings ) 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (kset) { 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int count = 0; 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinKeyItem* item = kset->items; 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinKeyItem* end = item + kset->num_items; 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; item < end; item++ ) { 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (item->command == command) { 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bindings->sym = item->sym; 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bindings->mod = item->mod; 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bindings ++; 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( ++count >= SKIN_KEY_COMMAND_MAX_BINDINGS ) { 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* shouldn't happen, but be safe */ 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return count; 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* retrieve the command corresponding to a given (sym,mod) pair. returns SKIN_KEY_COMMAND_NONE if not found */ 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinKeyCommand 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyset_get_command( SkinKeyset* kset, int sym, int mod ) 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (kset) { 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinKeyItem* item = kset->items; 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinKeyItem* end = item + kset->num_items; 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; item < end; item++ ) { 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (item->sym == sym && item->mod == mod) { 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return item->command; 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return SKIN_KEY_COMMAND_NONE; 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char* 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_keyset_get_default( void ) 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "BUTTON_CALL F3\n" 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "BUTTON_HANGUP F4\n" 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "BUTTON_HOME Home\n" 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "BUTTON_BACK Escape\n" 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "BUTTON_MENU F2, PageUp\n" 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "BUTTON_STAR Shift-F2, PageDown\n" 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "BUTTON_POWER F7\n" 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "BUTTON_SEARCH F5\n" 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "BUTTON_CAMERA Ctrl-Keypad_5, Ctrl-F3\n" 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "BUTTON_VOLUME_UP Keypad_Plus, Ctrl-F5\n" 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "BUTTON_VOLUME_DOWN Keypad_Minus, Ctrl-F6\n" 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "TOGGLE_NETWORK F8\n" 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "TOGGLE_TRACING F9\n" 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "TOGGLE_FULLSCREEN Alt-Enter\n" 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "BUTTON_DPAD_CENTER Keypad_5\n" 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "BUTTON_DPAD_UP Keypad_8\n" 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "BUTTON_DPAD_LEFT Keypad_4\n" 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "BUTTON_DPAD_RIGHT Keypad_6\n" 5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "BUTTON_DPAD_DOWN Keypad_2\n" 5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "TOGGLE_TRACKBALL F6\n" 5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "SHOW_TRACKBALL Delete\n" 5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "CHANGE_LAYOUT_PREV Keypad_7, Ctrl-F11\n" 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "CHANGE_LAYOUT_NEXT Keypad_9, Ctrl-F12\n" 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "ONION_ALPHA_UP Keypad_Multiply\n" 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "ONION_ALPHA_DOWN Keypad_Divide\n" 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ; 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 543