diff options
Diffstat (limited to 'android')
-rw-r--r-- | android/hw-events.c | 161 | ||||
-rw-r--r-- | android/hw-events.h | 351 |
2 files changed, 430 insertions, 82 deletions
diff --git a/android/hw-events.c b/android/hw-events.c index e72440c..7c3f9e9 100644 --- a/android/hw-events.c +++ b/android/hw-events.c @@ -17,108 +17,115 @@ typedef struct { const char* name; int value; -} PairRec; +} EventInfo; -#define EV_TYPE(n,v) { STRINGIFY(n), (v) }, -#define BTN_CODE(n,v) { STRINGIFY(n), (v) }, -#define REL_CODE(n,v) { STRINGIFY(n), (v) }, -#define ABS_CODE(n,v) { STRINGIFY(n), (v) }, +#define EV_TYPE(n,v) { "EV_" STRINGIFY(n), (v) }, -static const PairRec _ev_types_tab[] = +#define BTN_CODE(n,v) { "BTN_" STRINGIFY(n), (v) }, +#define KEY_CODE(n,v) { "KEY_" STRINGIFY(n), (v) }, +#define REL_CODE(n,v) { "REL_" STRINGIFY(n), (v) }, +#define ABS_CODE(n,v) { "ABS_" STRINGIFY(n), (v) }, +#define END_CODE { NULL, 0 } + +static const EventInfo _ev_types_tab[] = { EVENT_TYPE_LIST - { NULL, 0 } + END_CODE }; -static const PairRec _btn_codes_list[] = +static const EventInfo _key_codes_list[] = { + EVENT_KEY_LIST EVENT_BTN_LIST - { NULL, 0 } + END_CODE }; -static const PairRec _rel_codes_list[] = +static const EventInfo _rel_codes_list[] = { EVENT_REL_LIST - { NULL, 0 } + END_CODE }; - -static const PairRec _abs_codes_list[] = +static const EventInfo _abs_codes_list[] = { EVENT_ABS_LIST - { NULL, 0 } + END_CODE }; #undef EV_TYPE #undef BTN_CODE +#undef KEY_CODE #undef REL_CODE #undef ABS_CODE +typedef const EventInfo* EventList; + +typedef struct { + int type; + const EventInfo* table; +} EventCodeList; + + +static const EventCodeList _codes[] = { + { EV_KEY, _key_codes_list }, + { EV_REL, _rel_codes_list }, + { EV_ABS, _abs_codes_list }, + { -1, NULL } +}; + +static EventList +eventList_findByType( int type ) +{ + int nn; + + for (nn = 0; _codes[nn].type >= 0; nn++) { + if (_codes[nn].type == type) + return _codes[nn].table; + } + return NULL; +} + static int -count_list( const PairRec* list ) +eventList_getCount( EventList list ) { - int nn = 0; - while (list[nn].name != NULL) - nn += 1; + int nn; + + if (list == NULL) + return 0; + for (nn = 0; list[nn].name != NULL; nn++) { + /* nothing */ + } return nn; } static int -scan_list( const PairRec* list, - const char* prefix, - const char* name, - int namelen ) +eventList_findCodeByName( EventList list, + const char* name, + int namelen ) { - int len; - if (namelen <= 0) return -1; - len = strlen(prefix); - if (namelen <= len) - return -1; - if ( memcmp( name, prefix, len ) != 0 ) - return -1; - - name += len; - namelen -= len; - - for ( ; list->name != NULL; list += 1 ) - { - if ( memcmp( list->name, name, namelen ) == 0 && list->name[namelen] == 0 ) + for ( ; list != NULL; list += 1 ) { + if ( !memcmp(name, list->name, namelen) && + list->name[namelen] == 0 ) + { return list->value; + } } return -1; } - -typedef struct { - int type; - const char* prefix; - const PairRec* pairs; -} TypeListRec; - -typedef const TypeListRec* TypeList; - -static const TypeListRec _types_list[] = -{ - { EV_KEY, "BTN_", _btn_codes_list }, - { EV_REL, "REL_", _rel_codes_list }, - { EV_ABS, "ABS_", _abs_codes_list }, - { -1, NULL, NULL } -}; - - -static TypeList -find_type_list( int type ) +static char* +eventList_bufprintCode( EventList list, + int index, + char* buf, + char* bufend ) { - TypeList list = _types_list; - - for ( ; list->type >= 0; list += 1 ) - if (list->type == type) - return list; + if (list == NULL) + return buf; - return NULL; + return bufprint(buf, bufend, "%s", list[index].name); } @@ -131,7 +138,7 @@ android_event_from_str( const char* name, const char* p; const char* pend; const char* q; - TypeList list; + EventList list; char* end; *ptype = 0; @@ -144,7 +151,7 @@ android_event_from_str( const char* name, if (q == NULL || q > pend) q = pend; - *ptype = scan_list( _ev_types_tab, "EV_", p, q-p ); + *ptype = eventList_findCodeByName( _ev_types_tab, p, q-p ); if (*ptype < 0) { *ptype = (int) strtol( p, &end, 0 ); if (end != q) @@ -159,12 +166,8 @@ android_event_from_str( const char* name, if (q == NULL || q > pend) q = pend; - list = find_type_list( *ptype ); - - *pcode = -1; - if (list != NULL) { - *pcode = scan_list( list->pairs, list->prefix, p, q-p ); - } + list = eventList_findByType( *ptype ); + *pcode = eventList_findCodeByName( list, p, q-p ); if (*pcode < 0) { *pcode = (int) strtol( p, &end, 0 ); if (end != q) @@ -189,35 +192,29 @@ android_event_from_str( const char* name, int android_event_get_type_count( void ) { - return count_list( _ev_types_tab ); + return eventList_getCount( _ev_types_tab ); } char* android_event_bufprint_type_str( char* buff, char* end, int type_index ) { - return bufprint( buff, end, "EV_%s", _ev_types_tab[type_index].name ); + return eventList_bufprintCode( _ev_types_tab, type_index, buff, end ); } /* returns the list of valid event code string aliases for a given event type */ int android_event_get_code_count( int type ) { - TypeList list = find_type_list(type); + EventList list = eventList_findByType(type); - if (list == NULL) - return 0; - - return count_list( list->pairs ); + return eventList_getCount(list); } char* android_event_bufprint_code_str( char* buff, char* end, int type, int code_index ) { - TypeList list = find_type_list(type); - - if (list == NULL) - return buff; + EventList list = eventList_findByType(type); - return bufprint( buff, end, "%s%s", list->prefix, list->pairs[code_index].name ); + return eventList_bufprintCode(list, code_index, buff, end); } diff --git a/android/hw-events.h b/android/hw-events.h index 74100b8..488c299 100644 --- a/android/hw-events.h +++ b/android/hw-events.h @@ -38,6 +38,357 @@ typedef enum { } EventType; #undef EV_TYPE +/* BEWARE: The following codes are defined by the Linux kernel headers. + * The Android "Menu" key is KEY_SOFT1, *not* KEY_MENU + */ +#define EVENT_KEY_LIST \ + KEY_CODE(ESC ,1) \ + KEY_CODE(1 ,2) \ + KEY_CODE(2 ,3) \ + KEY_CODE(3 ,4) \ + KEY_CODE(4 ,5) \ + KEY_CODE(5 ,6) \ + KEY_CODE(6 ,7) \ + KEY_CODE(7 ,8) \ + KEY_CODE(8 ,9) \ + KEY_CODE(9 ,10) \ + KEY_CODE(0 ,11) \ + KEY_CODE(MINUS ,12) \ + KEY_CODE(EQUAL ,13) \ + KEY_CODE(BACKSPACE ,14) \ + KEY_CODE(TAB ,15) \ + KEY_CODE(Q ,16) \ + KEY_CODE(W ,17) \ + KEY_CODE(E ,18) \ + KEY_CODE(R ,19) \ + KEY_CODE(T ,20) \ + KEY_CODE(Y ,21) \ + KEY_CODE(U ,22) \ + KEY_CODE(I ,23) \ + KEY_CODE(O ,24) \ + KEY_CODE(P ,25) \ + KEY_CODE(LEFTBRACE ,26) \ + KEY_CODE(RIGHTBRACE ,27) \ + KEY_CODE(ENTER ,28) \ + KEY_CODE(LEFTCTRL ,29) \ + KEY_CODE(A ,30) \ + KEY_CODE(S ,31) \ + KEY_CODE(D ,32) \ + KEY_CODE(F ,33) \ + KEY_CODE(G ,34) \ + KEY_CODE(H ,35) \ + KEY_CODE(J ,36) \ + KEY_CODE(K ,37) \ + KEY_CODE(L ,38) \ + KEY_CODE(SEMICOLON ,39) \ + KEY_CODE(APOSTROPHE ,40) \ + KEY_CODE(GRAVE ,41) \ + KEY_CODE(LEFTSHIFT ,42) \ + KEY_CODE(BACKSLASH ,43) \ + KEY_CODE(Z ,44) \ + KEY_CODE(X ,45) \ + KEY_CODE(C ,46) \ + KEY_CODE(V ,47) \ + KEY_CODE(B ,48) \ + KEY_CODE(N ,49) \ + KEY_CODE(M ,50) \ + KEY_CODE(COMMA ,51) \ + KEY_CODE(DOT ,52) \ + KEY_CODE(SLASH ,53) \ + KEY_CODE(RIGHTSHIFT ,54) \ + KEY_CODE(KPASTERISK ,55) \ + KEY_CODE(LEFTALT ,56) \ + KEY_CODE(SPACE ,57) \ + KEY_CODE(CAPSLOCK ,58) \ + KEY_CODE(F1 ,59) \ + KEY_CODE(F2 ,60) \ + KEY_CODE(F3 ,61) \ + KEY_CODE(F4 ,62) \ + KEY_CODE(F5 ,63) \ + KEY_CODE(F6 ,64) \ + KEY_CODE(F7 ,65) \ + KEY_CODE(F8 ,66) \ + KEY_CODE(F9 ,67) \ + KEY_CODE(F10 ,68) \ + KEY_CODE(NUMLOCK ,69) \ + KEY_CODE(SCROLLLOCK ,70) \ + KEY_CODE(KP7 ,71) \ + KEY_CODE(KP8 ,72) \ + KEY_CODE(KP9 ,73) \ + KEY_CODE(KPMINUS ,74) \ + KEY_CODE(KP4 ,75) \ + KEY_CODE(KP5 ,76) \ + KEY_CODE(KP6 ,77) \ + KEY_CODE(KPPLUS ,78) \ + KEY_CODE(KP1 ,79) \ + KEY_CODE(KP2 ,80) \ + KEY_CODE(KP3 ,81) \ + KEY_CODE(KP0 ,82) \ + KEY_CODE(KPDOT ,83) \ + KEY_CODE(ZENKAKUHANKAKU,85) \ + KEY_CODE(102ND ,86) \ + KEY_CODE(F11 ,87) \ + KEY_CODE(F12 ,88) \ + KEY_CODE(RO ,89) \ + KEY_CODE(KATAKANA ,90) \ + KEY_CODE(HIRAGANA ,91) \ + KEY_CODE(HENKAN ,92) \ + KEY_CODE(KATAKANAHIRAGANA,93) \ + KEY_CODE(MUHENKAN ,94) \ + KEY_CODE(KPJPCOMMA ,95) \ + KEY_CODE(KPENTER ,96) \ + KEY_CODE(RIGHTCTRL ,97) \ + KEY_CODE(KPSLASH ,98) \ + KEY_CODE(SYSRQ ,99) \ + KEY_CODE(RIGHTALT ,100) \ + KEY_CODE(LINEFEED ,101) \ + KEY_CODE(HOME ,102) \ + KEY_CODE(UP ,103) \ + KEY_CODE(PAGEUP ,104) \ + KEY_CODE(LEFT ,105) \ + KEY_CODE(RIGHT ,106) \ + KEY_CODE(END ,107) \ + KEY_CODE(DOWN ,108) \ + KEY_CODE(PAGEDOWN ,109) \ + KEY_CODE(INSERT ,110) \ + KEY_CODE(DELETE ,111) \ + KEY_CODE(MACRO ,112) \ + KEY_CODE(MUTE ,113) \ + KEY_CODE(VOLUMEDOWN ,114) \ + KEY_CODE(VOLUMEUP ,115) \ + KEY_CODE(POWER ,116) \ + KEY_CODE(KPEQUAL ,117) \ + KEY_CODE(KPPLUSMINUS ,118) \ + KEY_CODE(PAUSE ,119) \ + KEY_CODE(KPCOMMA ,121) \ + KEY_CODE(HANGEUL ,122) \ + KEY_CODE(HANJA ,123) \ + KEY_CODE(YEN ,124) \ + KEY_CODE(LEFTMETA ,125) \ + KEY_CODE(RIGHTMETA ,126) \ + KEY_CODE(COMPOSE ,127) \ + KEY_CODE(STOP ,128) \ + KEY_CODE(AGAIN ,129) \ + KEY_CODE(PROPS ,130) \ + KEY_CODE(UNDO ,131) \ + KEY_CODE(FRONT ,132) \ + KEY_CODE(COPY ,133) \ + KEY_CODE(OPEN ,134) \ + KEY_CODE(PASTE ,135) \ + KEY_CODE(FIND ,136) \ + KEY_CODE(CUT ,137) \ + KEY_CODE(HELP ,138) \ + KEY_CODE(MENU ,139) \ + KEY_CODE(CALC ,140) \ + KEY_CODE(SETUP ,141) \ + KEY_CODE(SLEEP ,142) \ + KEY_CODE(WAKEUP ,143) \ + KEY_CODE(FILE ,144) \ + KEY_CODE(SENDFILE ,145) \ + KEY_CODE(DELETEFILE ,146) \ + KEY_CODE(XFER ,147) \ + KEY_CODE(PROG1 ,148) \ + KEY_CODE(PROG2 ,149) \ + KEY_CODE(WWW ,150) \ + KEY_CODE(MSDOS ,151) \ + KEY_CODE(COFFEE ,152) \ + KEY_CODE(DIRECTION ,153) \ + KEY_CODE(CYCLEWINDOWS,154) \ + KEY_CODE(MAIL ,155) \ + KEY_CODE(BOOKMARKS ,156) \ + KEY_CODE(COMPUTER ,157) \ + KEY_CODE(BACK ,158) \ + KEY_CODE(FORWARD ,159) \ + KEY_CODE(CLOSECD ,160) \ + KEY_CODE(EJECTCD ,161) \ + KEY_CODE(EJECTCLOSECD,162) \ + KEY_CODE(NEXTSONG ,163) \ + KEY_CODE(PLAYPAUSE ,164) \ + KEY_CODE(PREVIOUSSONG,165) \ + KEY_CODE(STOPCD ,166) \ + KEY_CODE(RECORD ,167) \ + KEY_CODE(REWIND ,168) \ + KEY_CODE(PHONE ,169) \ + KEY_CODE(ISO ,170) \ + KEY_CODE(CONFIG ,171) \ + KEY_CODE(HOMEPAGE ,172) \ + KEY_CODE(REFRESH ,173) \ + KEY_CODE(EXIT ,174) \ + KEY_CODE(MOVE ,175) \ + KEY_CODE(EDIT ,176) \ + KEY_CODE(SCROLLUP ,177) \ + KEY_CODE(SCROLLDOWN ,178) \ + KEY_CODE(KPLEFTPAREN ,179) \ + KEY_CODE(KPRIGHTPAREN,180) \ + KEY_CODE(NEW ,181) \ + KEY_CODE(REDO ,182) \ + KEY_CODE(F13 ,183) \ + KEY_CODE(F14 ,184) \ + KEY_CODE(F15 ,185) \ + KEY_CODE(F16 ,186) \ + KEY_CODE(F17 ,187) \ + KEY_CODE(F18 ,188) \ + KEY_CODE(F19 ,189) \ + KEY_CODE(F20 ,190) \ + KEY_CODE(F21 ,191) \ + KEY_CODE(F22 ,192) \ + KEY_CODE(F23 ,193) \ + KEY_CODE(F24 ,194) \ + KEY_CODE(PLAYCD ,200) \ + KEY_CODE(PAUSECD ,201) \ + KEY_CODE(PROG3 ,202) \ + KEY_CODE(PROG4 ,203) \ + KEY_CODE(SUSPEND ,205) \ + KEY_CODE(CLOSE ,206) \ + KEY_CODE(PLAY ,207) \ + KEY_CODE(FASTFORWARD ,208) \ + KEY_CODE(BASSBOOST ,209) \ + KEY_CODE(PRINT ,210) \ + KEY_CODE(HP ,211) \ + KEY_CODE(CAMERA ,212) \ + KEY_CODE(SOUND ,213) \ + KEY_CODE(QUESTION ,214) \ + KEY_CODE(EMAIL ,215) \ + KEY_CODE(CHAT ,216) \ + KEY_CODE(SEARCH ,217) \ + KEY_CODE(CONNECT ,218) \ + KEY_CODE(FINANCE ,219) \ + KEY_CODE(SPORT ,220) \ + KEY_CODE(SHOP ,221) \ + KEY_CODE(ALTERASE ,222) \ + KEY_CODE(CANCEL ,223) \ + KEY_CODE(BRIGHTNESSDOWN,224) \ + KEY_CODE(BRIGHTNESSUP,225) \ + KEY_CODE(MEDIA ,226) \ + KEY_CODE(STAR ,227) \ + KEY_CODE(SHARP ,228) \ + KEY_CODE(SOFT1 ,229) \ + KEY_CODE(SOFT2 ,230) \ + KEY_CODE(SEND ,231) \ + KEY_CODE(CENTER ,232) \ + KEY_CODE(HEADSETHOOK ,233) \ + KEY_CODE(0_5 ,234) \ + KEY_CODE(2_5 ,235) \ + KEY_CODE(SWITCHVIDEOMODE,236) \ + KEY_CODE(KBDILLUMTOGGLE,237) \ + KEY_CODE(KBDILLUMDOWN,238) \ + KEY_CODE(KBDILLUMUP ,239) \ + KEY_CODE(REPLY ,232) \ + KEY_CODE(FORWARDMAIL ,233) \ + KEY_CODE(SAVE ,234) \ + KEY_CODE(DOCUMENTS ,235) \ + KEY_CODE(BATTERY ,236) \ + KEY_CODE(UNKNOWN ,240) \ + KEY_CODE(NUM ,241) \ + KEY_CODE(FOCUS ,242) \ + KEY_CODE(PLUS ,243) \ + KEY_CODE(NOTIFICATION,244) \ + KEY_CODE(OK ,0x160) \ + KEY_CODE(SELECT ,0x161) \ + KEY_CODE(GOTO ,0x162) \ + KEY_CODE(CLEAR ,0x163) \ + KEY_CODE(POWER2 ,0x164) \ + KEY_CODE(OPTION ,0x165) \ + KEY_CODE(INFO ,0x166) \ + KEY_CODE(TIME ,0x167) \ + KEY_CODE(VENDOR ,0x168) \ + KEY_CODE(ARCHIVE ,0x169) \ + KEY_CODE(PROGRAM ,0x16a) \ + KEY_CODE(CHANNEL ,0x16b) \ + KEY_CODE(FAVORITES ,0x16c) \ + KEY_CODE(EPG ,0x16d) \ + KEY_CODE(PVR ,0x16e) \ + KEY_CODE(MHP ,0x16f) \ + KEY_CODE(LANGUAGE ,0x170) \ + KEY_CODE(TITLE ,0x171) \ + KEY_CODE(SUBTITLE ,0x172) \ + KEY_CODE(ANGLE ,0x173) \ + KEY_CODE(ZOOM ,0x174) \ + KEY_CODE(MODE ,0x175) \ + KEY_CODE(KEYBOARD ,0x176) \ + KEY_CODE(SCREEN ,0x177) \ + KEY_CODE(PC ,0x178) \ + KEY_CODE(TV ,0x179) \ + KEY_CODE(TV2 ,0x17a) \ + KEY_CODE(VCR ,0x17b) \ + KEY_CODE(VCR2 ,0x17c) \ + KEY_CODE(SAT ,0x17d) \ + KEY_CODE(SAT2 ,0x17e) \ + KEY_CODE(CD ,0x17f) \ + KEY_CODE(TAPE ,0x180) \ + KEY_CODE(RADIO ,0x181) \ + KEY_CODE(TUNER ,0x182) \ + KEY_CODE(PLAYER ,0x183) \ + KEY_CODE(TEXT ,0x184) \ + KEY_CODE(DVD ,0x185) \ + KEY_CODE(AUX ,0x186) \ + KEY_CODE(MP3 ,0x187) \ + KEY_CODE(AUDIO ,0x188) \ + KEY_CODE(VIDEO ,0x189) \ + KEY_CODE(DIRECTORY ,0x18a) \ + KEY_CODE(LIST ,0x18b) \ + KEY_CODE(MEMO ,0x18c) \ + KEY_CODE(CALENDAR ,0x18d) \ + KEY_CODE(RED ,0x18e) \ + KEY_CODE(GREEN ,0x18f) \ + KEY_CODE(YELLOW ,0x190) \ + KEY_CODE(BLUE ,0x191) \ + KEY_CODE(CHANNELUP ,0x192) \ + KEY_CODE(CHANNELDOWN ,0x193) \ + KEY_CODE(FIRST ,0x194) \ + KEY_CODE(LAST ,0x195) \ + KEY_CODE(AB ,0x196) \ + KEY_CODE(NEXT ,0x197) \ + KEY_CODE(RESTART ,0x198) \ + KEY_CODE(SLOW ,0x199) \ + KEY_CODE(SHUFFLE ,0x19a) \ + KEY_CODE(BREAK ,0x19b) \ + KEY_CODE(PREVIOUS ,0x19c) \ + KEY_CODE(DIGITS ,0x19d) \ + KEY_CODE(TEEN ,0x19e) \ + KEY_CODE(TWEN ,0x19f) \ + KEY_CODE(DEL_EOL ,0x1c0) \ + KEY_CODE(DEL_EOS ,0x1c1) \ + KEY_CODE(INS_LINE ,0x1c2) \ + KEY_CODE(DEL_LINE ,0x1c3) \ + KEY_CODE(FN ,0x1d0) \ + KEY_CODE(FN_ESC ,0x1d1) \ + KEY_CODE(FN_F1 ,0x1d2) \ + KEY_CODE(FN_F2 ,0x1d3) \ + KEY_CODE(FN_F3 ,0x1d4) \ + KEY_CODE(FN_F4 ,0x1d5) \ + KEY_CODE(FN_F5 ,0x1d6) \ + KEY_CODE(FN_F6 ,0x1d7) \ + KEY_CODE(FN_F7 ,0x1d8) \ + KEY_CODE(FN_F8 ,0x1d9) \ + KEY_CODE(FN_F9 ,0x1da) \ + KEY_CODE(FN_F10 ,0x1db) \ + KEY_CODE(FN_F11 ,0x1dc) \ + KEY_CODE(FN_F12 ,0x1dd) \ + KEY_CODE(FN_1 ,0x1de) \ + KEY_CODE(FN_2 ,0x1df) \ + KEY_CODE(FN_D ,0x1e0) \ + KEY_CODE(FN_E ,0x1e1) \ + KEY_CODE(FN_F ,0x1e2) \ + KEY_CODE(FN_S ,0x1e3) \ + KEY_CODE(FN_B ,0x1e4) \ + KEY_CODE(BRL_DOT1 ,0x1f1) \ + KEY_CODE(BRL_DOT2 ,0x1f2) \ + KEY_CODE(BRL_DOT3 ,0x1f3) \ + KEY_CODE(BRL_DOT4 ,0x1f4) \ + KEY_CODE(BRL_DOT5 ,0x1f5) \ + KEY_CODE(BRL_DOT6 ,0x1f6) \ + KEY_CODE(BRL_DOT7 ,0x1f7) \ + KEY_CODE(BRL_DOT8 ,0x1f8) \ + +#undef KEY_CODE +#define KEY_CODE(n,v) GLUE(KEY_,n) = v, +typedef enum { + EVENT_KEY_LIST +} EventKeyCode; +#undef KEY_CODE + + #define EVENT_BTN_LIST \ BTN_CODE(MISC,0x100) \ BTN_CODE(0,0x100) \ |