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