summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Härdeman <david@hardeman.nu>2015-07-21 23:40:10 +0200
committerDavid Härdeman <david@hardeman.nu>2015-07-21 23:40:10 +0200
commit5655eb321535c288325f6fff47b60f680d08ce21 (patch)
tree2519dad860aeee6234c4213bea1756e1a9efec56
parentf685878d4eb057d29c2b8087a1c55eb027bb7dda (diff)
Add input reading capabilities to server
-rw-r--r--Makefile9
-rw-r--r--linux-input-keycodes.c428
-rw-r--r--linux-input-keycodes.h432
-rw-r--r--linux-input.h1199
-rw-r--r--rcm-server-main.c135
-rw-r--r--rcm-server-main.h4
-rwxr-xr-xtools/generate-input-keycodes.sh60
7 files changed, 1802 insertions, 465 deletions
diff --git a/Makefile b/Makefile
index e0783f4..b24c909 100644
--- a/Makefile
+++ b/Makefile
@@ -12,14 +12,14 @@ EXTRA_CFLAGS =
GENERIC_LDFLAGS =
EXTRA_LDFLAGS =
-COMMON_HEADERS = linux-input-keycodes.h linux-input-enum.h shared.h
+COMMON_HEADERS = linux-input-keycodes.h linux-input.h shared.h
RCM_PACKAGES = libudev libsystemd
RCM_CFLAGS = ${GENERIC_CFLAGS} ${EXTRA_CFLAGS} $(shell pkg-config --cflags ${RCM_PACKAGES})
RCM_LDFLAGS = ${GENERIC_LDFLAGS} ${EXTRA_LDFLAGS} $(shell pkg-config --libs ${RCM_PACKAGES})
RCM_COMPILE = $(CC) $(RCM_CFLAGS)
RCM_LINK = $(CC) $(RCM_CFLAGS) $(RCM_LDFLAGS)
-RCM_OBJECTS = rcm-server-main.o rcm-server-keymap.o
+RCM_OBJECTS = rcm-server-main.o rcm-server-keymap.o linux-input-keycodes.o
RCM_HEADERS = rcm-server-main.h rcm-server-keymap.h utils.h $(COMMON_HEADERS)
RCC_PACKAGES = gtk+-3.0
@@ -27,7 +27,7 @@ RCC_CFLAGS = ${GENERIC_CFLAGS} ${EXTRA_CFLAGS} $(shell pkg-config --cflags ${RCC
RCC_LDFLAGS = ${GENERIC_LDFLAGS} ${EXTRA_LDFLAGS} $(shell pkg-config --libs ${RCC_PACKAGES})
RCC_COMPILE = $(CC) $(RCC_CFLAGS)
RCC_LINK = $(CC) $(RCC_CFLAGS) $(RCC_LDFLAGS)
-RCC_OBJECTS = rcm-client-main.o rcm-client-hardware-list.o rcm-client-hardware-info.o rcm-client-receive.o rcm-client-transmit.o generated.o
+RCC_OBJECTS = rcm-client-main.o rcm-client-hardware-list.o rcm-client-hardware-info.o rcm-client-receive.o rcm-client-transmit.o generated.o linux-input-keycodes.o
RCC_HEADERS = rcm-client-main.h rcm-client-hardware-list.h rcm-client-hardware-info.h rcm-client-receive.h rcm-client-transmit.h generated.h $(COMMON_HEADERS)
INSTALL = install -c
@@ -48,6 +48,9 @@ mandir = ${prefix}/share/man
all: rcm-server rcm-client
.DEFAULT: all
+linux-input-keycodes.o: linux-input-keycodes.c $(COMMON_HEADERS)
+ $(CC) $(GENERIC_CFLAGS) $(EXTRA_CFLAGS) -o $@ -c $<
+
rcm-client-%.o: rcm-client-%.c $(RCC_HEADERS)
$(RCC_COMPILE) -o $@ -c $<
diff --git a/linux-input-keycodes.c b/linux-input-keycodes.c
new file mode 100644
index 0000000..b9d2499
--- /dev/null
+++ b/linux-input-keycodes.c
@@ -0,0 +1,428 @@
+/* AUTOGENERATED: DO NOT EDIT */
+
+#include "linux-input.h"
+#include "linux-input-keycodes.h"
+
+struct linux_input_keycode linux_input_keycodes[] = {
+ { "KEY_RESERVED", KEY_RESERVED, false, NULL },
+ { "KEY_ESC", KEY_ESC, false, NULL },
+ { "KEY_1", KEY_1, false, NULL },
+ { "KEY_2", KEY_2, false, NULL },
+ { "KEY_3", KEY_3, false, NULL },
+ { "KEY_4", KEY_4, false, NULL },
+ { "KEY_5", KEY_5, false, NULL },
+ { "KEY_6", KEY_6, false, NULL },
+ { "KEY_7", KEY_7, false, NULL },
+ { "KEY_8", KEY_8, false, NULL },
+ { "KEY_9", KEY_9, false, NULL },
+ { "KEY_0", KEY_0, false, NULL },
+ { "KEY_MINUS", KEY_MINUS, false, NULL },
+ { "KEY_EQUAL", KEY_EQUAL, false, NULL },
+ { "KEY_BACKSPACE", KEY_BACKSPACE, false, NULL },
+ { "KEY_TAB", KEY_TAB, false, NULL },
+ { "KEY_Q", KEY_Q, false, NULL },
+ { "KEY_W", KEY_W, false, NULL },
+ { "KEY_E", KEY_E, false, NULL },
+ { "KEY_R", KEY_R, false, NULL },
+ { "KEY_T", KEY_T, false, NULL },
+ { "KEY_Y", KEY_Y, false, NULL },
+ { "KEY_U", KEY_U, false, NULL },
+ { "KEY_I", KEY_I, false, NULL },
+ { "KEY_O", KEY_O, false, NULL },
+ { "KEY_P", KEY_P, false, NULL },
+ { "KEY_LEFTBRACE", KEY_LEFTBRACE, false, NULL },
+ { "KEY_RIGHTBRACE", KEY_RIGHTBRACE, false, NULL },
+ { "KEY_ENTER", KEY_ENTER, false, NULL },
+ { "KEY_LEFTCTRL", KEY_LEFTCTRL, false, NULL },
+ { "KEY_A", KEY_A, false, NULL },
+ { "KEY_S", KEY_S, false, NULL },
+ { "KEY_D", KEY_D, false, NULL },
+ { "KEY_F", KEY_F, false, NULL },
+ { "KEY_G", KEY_G, false, NULL },
+ { "KEY_H", KEY_H, false, NULL },
+ { "KEY_J", KEY_J, false, NULL },
+ { "KEY_K", KEY_K, false, NULL },
+ { "KEY_L", KEY_L, false, NULL },
+ { "KEY_SEMICOLON", KEY_SEMICOLON, false, NULL },
+ { "KEY_APOSTROPHE", KEY_APOSTROPHE, false, NULL },
+ { "KEY_GRAVE", KEY_GRAVE, false, NULL },
+ { "KEY_LEFTSHIFT", KEY_LEFTSHIFT, false, NULL },
+ { "KEY_BACKSLASH", KEY_BACKSLASH, false, NULL },
+ { "KEY_Z", KEY_Z, false, NULL },
+ { "KEY_X", KEY_X, false, NULL },
+ { "KEY_C", KEY_C, false, NULL },
+ { "KEY_V", KEY_V, false, NULL },
+ { "KEY_B", KEY_B, false, NULL },
+ { "KEY_N", KEY_N, false, NULL },
+ { "KEY_M", KEY_M, false, NULL },
+ { "KEY_COMMA", KEY_COMMA, false, NULL },
+ { "KEY_DOT", KEY_DOT, false, NULL },
+ { "KEY_SLASH", KEY_SLASH, false, NULL },
+ { "KEY_RIGHTSHIFT", KEY_RIGHTSHIFT, false, NULL },
+ { "KEY_KPASTERISK", KEY_KPASTERISK, false, NULL },
+ { "KEY_LEFTALT", KEY_LEFTALT, false, NULL },
+ { "KEY_SPACE", KEY_SPACE, false, NULL },
+ { "KEY_CAPSLOCK", KEY_CAPSLOCK, false, NULL },
+ { "KEY_F1", KEY_F1, false, NULL },
+ { "KEY_F2", KEY_F2, false, NULL },
+ { "KEY_F3", KEY_F3, false, NULL },
+ { "KEY_F4", KEY_F4, false, NULL },
+ { "KEY_F5", KEY_F5, false, NULL },
+ { "KEY_F6", KEY_F6, false, NULL },
+ { "KEY_F7", KEY_F7, false, NULL },
+ { "KEY_F8", KEY_F8, false, NULL },
+ { "KEY_F9", KEY_F9, false, NULL },
+ { "KEY_F10", KEY_F10, false, NULL },
+ { "KEY_NUMLOCK", KEY_NUMLOCK, false, NULL },
+ { "KEY_SCROLLLOCK", KEY_SCROLLLOCK, false, NULL },
+ { "KEY_KP7", KEY_KP7, false, NULL },
+ { "KEY_KP8", KEY_KP8, false, NULL },
+ { "KEY_KP9", KEY_KP9, false, NULL },
+ { "KEY_KPMINUS", KEY_KPMINUS, false, NULL },
+ { "KEY_KP4", KEY_KP4, false, NULL },
+ { "KEY_KP5", KEY_KP5, false, NULL },
+ { "KEY_KP6", KEY_KP6, false, NULL },
+ { "KEY_KPPLUS", KEY_KPPLUS, false, NULL },
+ { "KEY_KP1", KEY_KP1, false, NULL },
+ { "KEY_KP2", KEY_KP2, false, NULL },
+ { "KEY_KP3", KEY_KP3, false, NULL },
+ { "KEY_KP0", KEY_KP0, false, NULL },
+ { "KEY_KPDOT", KEY_KPDOT, false, NULL },
+ { "KEY_ZENKAKUHANKAKU", KEY_ZENKAKUHANKAKU, false, NULL },
+ { "KEY_102ND", KEY_102ND, false, NULL },
+ { "KEY_F11", KEY_F11, false, NULL },
+ { "KEY_F12", KEY_F12, false, NULL },
+ { "KEY_RO", KEY_RO, false, NULL },
+ { "KEY_KATAKANA", KEY_KATAKANA, false, NULL },
+ { "KEY_HIRAGANA", KEY_HIRAGANA, false, NULL },
+ { "KEY_HENKAN", KEY_HENKAN, false, NULL },
+ { "KEY_KATAKANAHIRAGANA", KEY_KATAKANAHIRAGANA, false, NULL },
+ { "KEY_MUHENKAN", KEY_MUHENKAN, false, NULL },
+ { "KEY_KPJPCOMMA", KEY_KPJPCOMMA, false, NULL },
+ { "KEY_KPENTER", KEY_KPENTER, false, NULL },
+ { "KEY_RIGHTCTRL", KEY_RIGHTCTRL, false, NULL },
+ { "KEY_KPSLASH", KEY_KPSLASH, false, NULL },
+ { "KEY_SYSRQ", KEY_SYSRQ, false, NULL },
+ { "KEY_RIGHTALT", KEY_RIGHTALT, false, NULL },
+ { "KEY_LINEFEED", KEY_LINEFEED, false, NULL },
+ { "KEY_HOME", KEY_HOME, false, NULL },
+ { "KEY_UP", KEY_UP, false, NULL },
+ { "KEY_PAGEUP", KEY_PAGEUP, false, NULL },
+ { "KEY_LEFT", KEY_LEFT, false, NULL },
+ { "KEY_RIGHT", KEY_RIGHT, false, NULL },
+ { "KEY_END", KEY_END, false, NULL },
+ { "KEY_DOWN", KEY_DOWN, false, NULL },
+ { "KEY_PAGEDOWN", KEY_PAGEDOWN, false, NULL },
+ { "KEY_INSERT", KEY_INSERT, false, NULL },
+ { "KEY_DELETE", KEY_DELETE, false, NULL },
+ { "KEY_MACRO", KEY_MACRO, false, NULL },
+ { "KEY_MUTE", KEY_MUTE, false, NULL },
+ { "KEY_VOLUMEDOWN", KEY_VOLUMEDOWN, false, NULL },
+ { "KEY_VOLUMEUP", KEY_VOLUMEUP, false, NULL },
+ { "KEY_POWER", KEY_POWER, false, NULL },
+ { "KEY_KPEQUAL", KEY_KPEQUAL, false, NULL },
+ { "KEY_KPPLUSMINUS", KEY_KPPLUSMINUS, false, NULL },
+ { "KEY_PAUSE", KEY_PAUSE, false, NULL },
+ { "KEY_SCALE", KEY_SCALE, false, NULL },
+ { "KEY_KPCOMMA", KEY_KPCOMMA, false, NULL },
+ { "KEY_HANGEUL", KEY_HANGEUL, false, NULL },
+ { "KEY_HANGUEL", KEY_HANGUEL, true, NULL },
+ { "KEY_HANJA", KEY_HANJA, false, NULL },
+ { "KEY_YEN", KEY_YEN, false, NULL },
+ { "KEY_LEFTMETA", KEY_LEFTMETA, false, NULL },
+ { "KEY_RIGHTMETA", KEY_RIGHTMETA, false, NULL },
+ { "KEY_COMPOSE", KEY_COMPOSE, false, NULL },
+ { "KEY_STOP", KEY_STOP, false, NULL },
+ { "KEY_AGAIN", KEY_AGAIN, false, NULL },
+ { "KEY_PROPS", KEY_PROPS, false, NULL },
+ { "KEY_UNDO", KEY_UNDO, false, NULL },
+ { "KEY_FRONT", KEY_FRONT, false, NULL },
+ { "KEY_COPY", KEY_COPY, false, NULL },
+ { "KEY_OPEN", KEY_OPEN, false, NULL },
+ { "KEY_PASTE", KEY_PASTE, false, NULL },
+ { "KEY_FIND", KEY_FIND, false, NULL },
+ { "KEY_CUT", KEY_CUT, false, NULL },
+ { "KEY_HELP", KEY_HELP, false, NULL },
+ { "KEY_MENU", KEY_MENU, false, NULL },
+ { "KEY_CALC", KEY_CALC, false, NULL },
+ { "KEY_SETUP", KEY_SETUP, false, NULL },
+ { "KEY_SLEEP", KEY_SLEEP, false, NULL },
+ { "KEY_WAKEUP", KEY_WAKEUP, false, NULL },
+ { "KEY_FILE", KEY_FILE, false, NULL },
+ { "KEY_SENDFILE", KEY_SENDFILE, false, NULL },
+ { "KEY_DELETEFILE", KEY_DELETEFILE, false, NULL },
+ { "KEY_XFER", KEY_XFER, false, NULL },
+ { "KEY_PROG1", KEY_PROG1, false, NULL },
+ { "KEY_PROG2", KEY_PROG2, false, NULL },
+ { "KEY_WWW", KEY_WWW, false, NULL },
+ { "KEY_MSDOS", KEY_MSDOS, false, NULL },
+ { "KEY_COFFEE", KEY_COFFEE, false, NULL },
+ { "KEY_SCREENLOCK", KEY_SCREENLOCK, true, NULL },
+ { "KEY_DIRECTION", KEY_DIRECTION, false, NULL },
+ { "KEY_CYCLEWINDOWS", KEY_CYCLEWINDOWS, false, NULL },
+ { "KEY_MAIL", KEY_MAIL, false, NULL },
+ { "KEY_BOOKMARKS", KEY_BOOKMARKS, false, NULL },
+ { "KEY_COMPUTER", KEY_COMPUTER, false, NULL },
+ { "KEY_BACK", KEY_BACK, false, NULL },
+ { "KEY_FORWARD", KEY_FORWARD, false, NULL },
+ { "KEY_CLOSECD", KEY_CLOSECD, false, NULL },
+ { "KEY_EJECTCD", KEY_EJECTCD, false, NULL },
+ { "KEY_EJECTCLOSECD", KEY_EJECTCLOSECD, false, NULL },
+ { "KEY_NEXTSONG", KEY_NEXTSONG, false, NULL },
+ { "KEY_PLAYPAUSE", KEY_PLAYPAUSE, false, NULL },
+ { "KEY_PREVIOUSSONG", KEY_PREVIOUSSONG, false, NULL },
+ { "KEY_STOPCD", KEY_STOPCD, false, NULL },
+ { "KEY_RECORD", KEY_RECORD, false, NULL },
+ { "KEY_REWIND", KEY_REWIND, false, NULL },
+ { "KEY_PHONE", KEY_PHONE, false, NULL },
+ { "KEY_ISO", KEY_ISO, false, NULL },
+ { "KEY_CONFIG", KEY_CONFIG, false, NULL },
+ { "KEY_HOMEPAGE", KEY_HOMEPAGE, false, NULL },
+ { "KEY_REFRESH", KEY_REFRESH, false, NULL },
+ { "KEY_EXIT", KEY_EXIT, false, NULL },
+ { "KEY_MOVE", KEY_MOVE, false, NULL },
+ { "KEY_EDIT", KEY_EDIT, false, NULL },
+ { "KEY_SCROLLUP", KEY_SCROLLUP, false, NULL },
+ { "KEY_SCROLLDOWN", KEY_SCROLLDOWN, false, NULL },
+ { "KEY_KPLEFTPAREN", KEY_KPLEFTPAREN, false, NULL },
+ { "KEY_KPRIGHTPAREN", KEY_KPRIGHTPAREN, false, NULL },
+ { "KEY_NEW", KEY_NEW, false, NULL },
+ { "KEY_REDO", KEY_REDO, false, NULL },
+ { "KEY_F13", KEY_F13, false, NULL },
+ { "KEY_F14", KEY_F14, false, NULL },
+ { "KEY_F15", KEY_F15, false, NULL },
+ { "KEY_F16", KEY_F16, false, NULL },
+ { "KEY_F17", KEY_F17, false, NULL },
+ { "KEY_F18", KEY_F18, false, NULL },
+ { "KEY_F19", KEY_F19, false, NULL },
+ { "KEY_F20", KEY_F20, false, NULL },
+ { "KEY_F21", KEY_F21, false, NULL },
+ { "KEY_F22", KEY_F22, false, NULL },
+ { "KEY_F23", KEY_F23, false, NULL },
+ { "KEY_F24", KEY_F24, false, NULL },
+ { "KEY_PLAYCD", KEY_PLAYCD, false, NULL },
+ { "KEY_PAUSECD", KEY_PAUSECD, false, NULL },
+ { "KEY_PROG3", KEY_PROG3, false, NULL },
+ { "KEY_PROG4", KEY_PROG4, false, NULL },
+ { "KEY_DASHBOARD", KEY_DASHBOARD, false, NULL },
+ { "KEY_SUSPEND", KEY_SUSPEND, false, NULL },
+ { "KEY_CLOSE", KEY_CLOSE, false, NULL },
+ { "KEY_PLAY", KEY_PLAY, false, NULL },
+ { "KEY_FASTFORWARD", KEY_FASTFORWARD, false, NULL },
+ { "KEY_BASSBOOST", KEY_BASSBOOST, false, NULL },
+ { "KEY_PRINT", KEY_PRINT, false, NULL },
+ { "KEY_HP", KEY_HP, false, NULL },
+ { "KEY_CAMERA", KEY_CAMERA, false, NULL },
+ { "KEY_SOUND", KEY_SOUND, false, NULL },
+ { "KEY_QUESTION", KEY_QUESTION, false, NULL },
+ { "KEY_EMAIL", KEY_EMAIL, false, NULL },
+ { "KEY_CHAT", KEY_CHAT, false, NULL },
+ { "KEY_SEARCH", KEY_SEARCH, false, NULL },
+ { "KEY_CONNECT", KEY_CONNECT, false, NULL },
+ { "KEY_FINANCE", KEY_FINANCE, false, NULL },
+ { "KEY_SPORT", KEY_SPORT, false, NULL },
+ { "KEY_SHOP", KEY_SHOP, false, NULL },
+ { "KEY_ALTERASE", KEY_ALTERASE, false, NULL },
+ { "KEY_CANCEL", KEY_CANCEL, false, NULL },
+ { "KEY_BRIGHTNESSDOWN", KEY_BRIGHTNESSDOWN, false, NULL },
+ { "KEY_BRIGHTNESSUP", KEY_BRIGHTNESSUP, false, NULL },
+ { "KEY_MEDIA", KEY_MEDIA, false, NULL },
+ { "KEY_SWITCHVIDEOMODE", KEY_SWITCHVIDEOMODE, false, NULL },
+ { "KEY_KBDILLUMTOGGLE", KEY_KBDILLUMTOGGLE, false, NULL },
+ { "KEY_KBDILLUMDOWN", KEY_KBDILLUMDOWN, false, NULL },
+ { "KEY_KBDILLUMUP", KEY_KBDILLUMUP, false, NULL },
+ { "KEY_SEND", KEY_SEND, false, NULL },
+ { "KEY_REPLY", KEY_REPLY, false, NULL },
+ { "KEY_FORWARDMAIL", KEY_FORWARDMAIL, false, NULL },
+ { "KEY_SAVE", KEY_SAVE, false, NULL },
+ { "KEY_DOCUMENTS", KEY_DOCUMENTS, false, NULL },
+ { "KEY_BATTERY", KEY_BATTERY, false, NULL },
+ { "KEY_BLUETOOTH", KEY_BLUETOOTH, false, NULL },
+ { "KEY_WLAN", KEY_WLAN, false, NULL },
+ { "KEY_UWB", KEY_UWB, false, NULL },
+ { "KEY_UNKNOWN", KEY_UNKNOWN, false, NULL },
+ { "KEY_VIDEO_NEXT", KEY_VIDEO_NEXT, false, NULL },
+ { "KEY_VIDEO_PREV", KEY_VIDEO_PREV, false, NULL },
+ { "KEY_BRIGHTNESS_CYCLE", KEY_BRIGHTNESS_CYCLE, false, NULL },
+ { "KEY_BRIGHTNESS_AUTO", KEY_BRIGHTNESS_AUTO, false, NULL },
+ { "KEY_BRIGHTNESS_ZERO", KEY_BRIGHTNESS_ZERO, true, NULL },
+ { "KEY_DISPLAY_OFF", KEY_DISPLAY_OFF, false, NULL },
+ { "KEY_WWAN", KEY_WWAN, false, NULL },
+ { "KEY_WIMAX", KEY_WIMAX, true, NULL },
+ { "KEY_RFKILL", KEY_RFKILL, false, NULL },
+ { "KEY_MICMUTE", KEY_MICMUTE, false, NULL },
+ { "KEY_OK", KEY_OK, false, NULL },
+ { "KEY_SELECT", KEY_SELECT, false, NULL },
+ { "KEY_GOTO", KEY_GOTO, false, NULL },
+ { "KEY_CLEAR", KEY_CLEAR, false, NULL },
+ { "KEY_POWER2", KEY_POWER2, false, NULL },
+ { "KEY_OPTION", KEY_OPTION, false, NULL },
+ { "KEY_INFO", KEY_INFO, false, NULL },
+ { "KEY_TIME", KEY_TIME, false, NULL },
+ { "KEY_VENDOR", KEY_VENDOR, false, NULL },
+ { "KEY_ARCHIVE", KEY_ARCHIVE, false, NULL },
+ { "KEY_PROGRAM", KEY_PROGRAM, false, NULL },
+ { "KEY_CHANNEL", KEY_CHANNEL, false, NULL },
+ { "KEY_FAVORITES", KEY_FAVORITES, false, NULL },
+ { "KEY_EPG", KEY_EPG, false, NULL },
+ { "KEY_PVR", KEY_PVR, false, NULL },
+ { "KEY_MHP", KEY_MHP, false, NULL },
+ { "KEY_LANGUAGE", KEY_LANGUAGE, false, NULL },
+ { "KEY_TITLE", KEY_TITLE, false, NULL },
+ { "KEY_SUBTITLE", KEY_SUBTITLE, false, NULL },
+ { "KEY_ANGLE", KEY_ANGLE, false, NULL },
+ { "KEY_ZOOM", KEY_ZOOM, false, NULL },
+ { "KEY_MODE", KEY_MODE, false, NULL },
+ { "KEY_KEYBOARD", KEY_KEYBOARD, false, NULL },
+ { "KEY_SCREEN", KEY_SCREEN, false, NULL },
+ { "KEY_PC", KEY_PC, false, NULL },
+ { "KEY_TV", KEY_TV, false, NULL },
+ { "KEY_TV2", KEY_TV2, false, NULL },
+ { "KEY_VCR", KEY_VCR, false, NULL },
+ { "KEY_VCR2", KEY_VCR2, false, NULL },
+ { "KEY_SAT", KEY_SAT, false, NULL },
+ { "KEY_SAT2", KEY_SAT2, false, NULL },
+ { "KEY_CD", KEY_CD, false, NULL },
+ { "KEY_TAPE", KEY_TAPE, false, NULL },
+ { "KEY_RADIO", KEY_RADIO, false, NULL },
+ { "KEY_TUNER", KEY_TUNER, false, NULL },
+ { "KEY_PLAYER", KEY_PLAYER, false, NULL },
+ { "KEY_TEXT", KEY_TEXT, false, NULL },
+ { "KEY_DVD", KEY_DVD, false, NULL },
+ { "KEY_AUX", KEY_AUX, false, NULL },
+ { "KEY_MP3", KEY_MP3, false, NULL },
+ { "KEY_AUDIO", KEY_AUDIO, false, NULL },
+ { "KEY_VIDEO", KEY_VIDEO, false, NULL },
+ { "KEY_DIRECTORY", KEY_DIRECTORY, false, NULL },
+ { "KEY_LIST", KEY_LIST, false, NULL },
+ { "KEY_MEMO", KEY_MEMO, false, NULL },
+ { "KEY_CALENDAR", KEY_CALENDAR, false, NULL },
+ { "KEY_RED", KEY_RED, false, NULL },
+ { "KEY_GREEN", KEY_GREEN, false, NULL },
+ { "KEY_YELLOW", KEY_YELLOW, false, NULL },
+ { "KEY_BLUE", KEY_BLUE, false, NULL },
+ { "KEY_CHANNELUP", KEY_CHANNELUP, false, NULL },
+ { "KEY_CHANNELDOWN", KEY_CHANNELDOWN, false, NULL },
+ { "KEY_FIRST", KEY_FIRST, false, NULL },
+ { "KEY_LAST", KEY_LAST, false, NULL },
+ { "KEY_AB", KEY_AB, false, NULL },
+ { "KEY_NEXT", KEY_NEXT, false, NULL },
+ { "KEY_RESTART", KEY_RESTART, false, NULL },
+ { "KEY_SLOW", KEY_SLOW, false, NULL },
+ { "KEY_SHUFFLE", KEY_SHUFFLE, false, NULL },
+ { "KEY_BREAK", KEY_BREAK, false, NULL },
+ { "KEY_PREVIOUS", KEY_PREVIOUS, false, NULL },
+ { "KEY_DIGITS", KEY_DIGITS, false, NULL },
+ { "KEY_TEEN", KEY_TEEN, false, NULL },
+ { "KEY_TWEN", KEY_TWEN, false, NULL },
+ { "KEY_VIDEOPHONE", KEY_VIDEOPHONE, false, NULL },
+ { "KEY_GAMES", KEY_GAMES, false, NULL },
+ { "KEY_ZOOMIN", KEY_ZOOMIN, false, NULL },
+ { "KEY_ZOOMOUT", KEY_ZOOMOUT, false, NULL },
+ { "KEY_ZOOMRESET", KEY_ZOOMRESET, false, NULL },
+ { "KEY_WORDPROCESSOR", KEY_WORDPROCESSOR, false, NULL },
+ { "KEY_EDITOR", KEY_EDITOR, false, NULL },
+ { "KEY_SPREADSHEET", KEY_SPREADSHEET, false, NULL },
+ { "KEY_GRAPHICSEDITOR", KEY_GRAPHICSEDITOR, false, NULL },
+ { "KEY_PRESENTATION", KEY_PRESENTATION, false, NULL },
+ { "KEY_DATABASE", KEY_DATABASE, false, NULL },
+ { "KEY_NEWS", KEY_NEWS, false, NULL },
+ { "KEY_VOICEMAIL", KEY_VOICEMAIL, false, NULL },
+ { "KEY_ADDRESSBOOK", KEY_ADDRESSBOOK, false, NULL },
+ { "KEY_MESSENGER", KEY_MESSENGER, false, NULL },
+ { "KEY_DISPLAYTOGGLE", KEY_DISPLAYTOGGLE, false, NULL },
+ { "KEY_BRIGHTNESS_TOGGLE", KEY_BRIGHTNESS_TOGGLE, true, NULL },
+ { "KEY_SPELLCHECK", KEY_SPELLCHECK, false, NULL },
+ { "KEY_LOGOFF", KEY_LOGOFF, false, NULL },
+ { "KEY_DOLLAR", KEY_DOLLAR, false, NULL },
+ { "KEY_EURO", KEY_EURO, false, NULL },
+ { "KEY_FRAMEBACK", KEY_FRAMEBACK, false, NULL },
+ { "KEY_FRAMEFORWARD", KEY_FRAMEFORWARD, false, NULL },
+ { "KEY_CONTEXT_MENU", KEY_CONTEXT_MENU, false, NULL },
+ { "KEY_MEDIA_REPEAT", KEY_MEDIA_REPEAT, false, NULL },
+ { "KEY_10CHANNELSUP", KEY_10CHANNELSUP, false, NULL },
+ { "KEY_10CHANNELSDOWN", KEY_10CHANNELSDOWN, false, NULL },
+ { "KEY_IMAGES", KEY_IMAGES, false, NULL },
+ { "KEY_DEL_EOL", KEY_DEL_EOL, false, NULL },
+ { "KEY_DEL_EOS", KEY_DEL_EOS, false, NULL },
+ { "KEY_INS_LINE", KEY_INS_LINE, false, NULL },
+ { "KEY_DEL_LINE", KEY_DEL_LINE, false, NULL },
+ { "KEY_FN", KEY_FN, false, NULL },
+ { "KEY_FN_ESC", KEY_FN_ESC, false, NULL },
+ { "KEY_FN_F1", KEY_FN_F1, false, NULL },
+ { "KEY_FN_F2", KEY_FN_F2, false, NULL },
+ { "KEY_FN_F3", KEY_FN_F3, false, NULL },
+ { "KEY_FN_F4", KEY_FN_F4, false, NULL },
+ { "KEY_FN_F5", KEY_FN_F5, false, NULL },
+ { "KEY_FN_F6", KEY_FN_F6, false, NULL },
+ { "KEY_FN_F7", KEY_FN_F7, false, NULL },
+ { "KEY_FN_F8", KEY_FN_F8, false, NULL },
+ { "KEY_FN_F9", KEY_FN_F9, false, NULL },
+ { "KEY_FN_F10", KEY_FN_F10, false, NULL },
+ { "KEY_FN_F11", KEY_FN_F11, false, NULL },
+ { "KEY_FN_F12", KEY_FN_F12, false, NULL },
+ { "KEY_FN_1", KEY_FN_1, false, NULL },
+ { "KEY_FN_2", KEY_FN_2, false, NULL },
+ { "KEY_FN_D", KEY_FN_D, false, NULL },
+ { "KEY_FN_E", KEY_FN_E, false, NULL },
+ { "KEY_FN_F", KEY_FN_F, false, NULL },
+ { "KEY_FN_S", KEY_FN_S, false, NULL },
+ { "KEY_FN_B", KEY_FN_B, false, NULL },
+ { "KEY_BRL_DOT1", KEY_BRL_DOT1, false, NULL },
+ { "KEY_BRL_DOT2", KEY_BRL_DOT2, false, NULL },
+ { "KEY_BRL_DOT3", KEY_BRL_DOT3, false, NULL },
+ { "KEY_BRL_DOT4", KEY_BRL_DOT4, false, NULL },
+ { "KEY_BRL_DOT5", KEY_BRL_DOT5, false, NULL },
+ { "KEY_BRL_DOT6", KEY_BRL_DOT6, false, NULL },
+ { "KEY_BRL_DOT7", KEY_BRL_DOT7, false, NULL },
+ { "KEY_BRL_DOT8", KEY_BRL_DOT8, false, NULL },
+ { "KEY_BRL_DOT9", KEY_BRL_DOT9, false, NULL },
+ { "KEY_BRL_DOT10", KEY_BRL_DOT10, false, NULL },
+ { "KEY_NUMERIC_0", KEY_NUMERIC_0, false, NULL },
+ { "KEY_NUMERIC_1", KEY_NUMERIC_1, false, NULL },
+ { "KEY_NUMERIC_2", KEY_NUMERIC_2, false, NULL },
+ { "KEY_NUMERIC_3", KEY_NUMERIC_3, false, NULL },
+ { "KEY_NUMERIC_4", KEY_NUMERIC_4, false, NULL },
+ { "KEY_NUMERIC_5", KEY_NUMERIC_5, false, NULL },
+ { "KEY_NUMERIC_6", KEY_NUMERIC_6, false, NULL },
+ { "KEY_NUMERIC_7", KEY_NUMERIC_7, false, NULL },
+ { "KEY_NUMERIC_8", KEY_NUMERIC_8, false, NULL },
+ { "KEY_NUMERIC_9", KEY_NUMERIC_9, false, NULL },
+ { "KEY_NUMERIC_STAR", KEY_NUMERIC_STAR, false, NULL },
+ { "KEY_NUMERIC_POUND", KEY_NUMERIC_POUND, false, NULL },
+ { "KEY_CAMERA_FOCUS", KEY_CAMERA_FOCUS, false, NULL },
+ { "KEY_WPS_BUTTON", KEY_WPS_BUTTON, false, NULL },
+ { "KEY_TOUCHPAD_TOGGLE", KEY_TOUCHPAD_TOGGLE, false, NULL },
+ { "KEY_TOUCHPAD_ON", KEY_TOUCHPAD_ON, false, NULL },
+ { "KEY_TOUCHPAD_OFF", KEY_TOUCHPAD_OFF, false, NULL },
+ { "KEY_CAMERA_ZOOMIN", KEY_CAMERA_ZOOMIN, false, NULL },
+ { "KEY_CAMERA_ZOOMOUT", KEY_CAMERA_ZOOMOUT, false, NULL },
+ { "KEY_CAMERA_UP", KEY_CAMERA_UP, false, NULL },
+ { "KEY_CAMERA_DOWN", KEY_CAMERA_DOWN, false, NULL },
+ { "KEY_CAMERA_LEFT", KEY_CAMERA_LEFT, false, NULL },
+ { "KEY_CAMERA_RIGHT", KEY_CAMERA_RIGHT, false, NULL },
+ { "KEY_ATTENDANT_ON", KEY_ATTENDANT_ON, false, NULL },
+ { "KEY_ATTENDANT_OFF", KEY_ATTENDANT_OFF, false, NULL },
+ { "KEY_ATTENDANT_TOGGLE", KEY_ATTENDANT_TOGGLE, false, NULL },
+ { "KEY_LIGHTS_TOGGLE", KEY_LIGHTS_TOGGLE, false, NULL },
+ { "KEY_ALS_TOGGLE", KEY_ALS_TOGGLE, false, NULL },
+ { "KEY_BUTTONCONFIG", KEY_BUTTONCONFIG, false, NULL },
+ { "KEY_TASKMANAGER", KEY_TASKMANAGER, false, NULL },
+ { "KEY_JOURNAL", KEY_JOURNAL, false, NULL },
+ { "KEY_CONTROLPANEL", KEY_CONTROLPANEL, false, NULL },
+ { "KEY_APPSELECT", KEY_APPSELECT, false, NULL },
+ { "KEY_SCREENSAVER", KEY_SCREENSAVER, false, NULL },
+ { "KEY_VOICECOMMAND", KEY_VOICECOMMAND, false, NULL },
+ { "KEY_BRIGHTNESS_MIN", KEY_BRIGHTNESS_MIN, false, NULL },
+ { "KEY_BRIGHTNESS_MAX", KEY_BRIGHTNESS_MAX, false, NULL },
+ { "KEY_KBDINPUTASSIST_PREV", KEY_KBDINPUTASSIST_PREV, false, NULL },
+ { "KEY_KBDINPUTASSIST_NEXT", KEY_KBDINPUTASSIST_NEXT, false, NULL },
+ { "KEY_KBDINPUTASSIST_PREVGROUP", KEY_KBDINPUTASSIST_PREVGROUP, false, NULL },
+ { "KEY_KBDINPUTASSIST_NEXTGROUP", KEY_KBDINPUTASSIST_NEXTGROUP, false, NULL },
+ { "KEY_KBDINPUTASSIST_ACCEPT", KEY_KBDINPUTASSIST_ACCEPT, false, NULL },
+ { "KEY_KBDINPUTASSIST_CANCEL", KEY_KBDINPUTASSIST_CANCEL, false, NULL },
+ { "KEY_MIN_INTERESTING", KEY_MIN_INTERESTING, true, NULL },
+ { "KEY_MAX", KEY_MAX, false, NULL },
+ { "KEY_CNT", KEY_CNT, false, NULL },
+ { NULL, 0, false, NULL }
+};
diff --git a/linux-input-keycodes.h b/linux-input-keycodes.h
index 37021a5..d0b6f8c 100644
--- a/linux-input-keycodes.h
+++ b/linux-input-keycodes.h
@@ -3,436 +3,18 @@
/* AUTOGENERATED: DO NOT EDIT */
-#include "linux-input-enum.h"
+#include <unistd.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include "linux-input.h"
struct linux_input_keycode {
const char *name;
- enum linux_input_keyval value;
+ uint32_t value;
bool alias;
void *cairo_surface;
};
-struct linux_input_keycode linux_input_keycodes[] = {
- { "KEY_RESERVED", KEY_RESERVED, false, NULL },
- { "KEY_ESC", KEY_ESC, false, NULL },
- { "KEY_1", KEY_1, false, NULL },
- { "KEY_2", KEY_2, false, NULL },
- { "KEY_3", KEY_3, false, NULL },
- { "KEY_4", KEY_4, false, NULL },
- { "KEY_5", KEY_5, false, NULL },
- { "KEY_6", KEY_6, false, NULL },
- { "KEY_7", KEY_7, false, NULL },
- { "KEY_8", KEY_8, false, NULL },
- { "KEY_9", KEY_9, false, NULL },
- { "KEY_0", KEY_0, false, NULL },
- { "KEY_MINUS", KEY_MINUS, false, NULL },
- { "KEY_EQUAL", KEY_EQUAL, false, NULL },
- { "KEY_BACKSPACE", KEY_BACKSPACE, false, NULL },
- { "KEY_TAB", KEY_TAB, false, NULL },
- { "KEY_Q", KEY_Q, false, NULL },
- { "KEY_W", KEY_W, false, NULL },
- { "KEY_E", KEY_E, false, NULL },
- { "KEY_R", KEY_R, false, NULL },
- { "KEY_T", KEY_T, false, NULL },
- { "KEY_Y", KEY_Y, false, NULL },
- { "KEY_U", KEY_U, false, NULL },
- { "KEY_I", KEY_I, false, NULL },
- { "KEY_O", KEY_O, false, NULL },
- { "KEY_P", KEY_P, false, NULL },
- { "KEY_LEFTBRACE", KEY_LEFTBRACE, false, NULL },
- { "KEY_RIGHTBRACE", KEY_RIGHTBRACE, false, NULL },
- { "KEY_ENTER", KEY_ENTER, false, NULL },
- { "KEY_LEFTCTRL", KEY_LEFTCTRL, false, NULL },
- { "KEY_A", KEY_A, false, NULL },
- { "KEY_S", KEY_S, false, NULL },
- { "KEY_D", KEY_D, false, NULL },
- { "KEY_F", KEY_F, false, NULL },
- { "KEY_G", KEY_G, false, NULL },
- { "KEY_H", KEY_H, false, NULL },
- { "KEY_J", KEY_J, false, NULL },
- { "KEY_K", KEY_K, false, NULL },
- { "KEY_L", KEY_L, false, NULL },
- { "KEY_SEMICOLON", KEY_SEMICOLON, false, NULL },
- { "KEY_APOSTROPHE", KEY_APOSTROPHE, false, NULL },
- { "KEY_GRAVE", KEY_GRAVE, false, NULL },
- { "KEY_LEFTSHIFT", KEY_LEFTSHIFT, false, NULL },
- { "KEY_BACKSLASH", KEY_BACKSLASH, false, NULL },
- { "KEY_Z", KEY_Z, false, NULL },
- { "KEY_X", KEY_X, false, NULL },
- { "KEY_C", KEY_C, false, NULL },
- { "KEY_V", KEY_V, false, NULL },
- { "KEY_B", KEY_B, false, NULL },
- { "KEY_N", KEY_N, false, NULL },
- { "KEY_M", KEY_M, false, NULL },
- { "KEY_COMMA", KEY_COMMA, false, NULL },
- { "KEY_DOT", KEY_DOT, false, NULL },
- { "KEY_SLASH", KEY_SLASH, false, NULL },
- { "KEY_RIGHTSHIFT", KEY_RIGHTSHIFT, false, NULL },
- { "KEY_KPASTERISK", KEY_KPASTERISK, false, NULL },
- { "KEY_LEFTALT", KEY_LEFTALT, false, NULL },
- { "KEY_SPACE", KEY_SPACE, false, NULL },
- { "KEY_CAPSLOCK", KEY_CAPSLOCK, false, NULL },
- { "KEY_F1", KEY_F1, false, NULL },
- { "KEY_F2", KEY_F2, false, NULL },
- { "KEY_F3", KEY_F3, false, NULL },
- { "KEY_F4", KEY_F4, false, NULL },
- { "KEY_F5", KEY_F5, false, NULL },
- { "KEY_F6", KEY_F6, false, NULL },
- { "KEY_F7", KEY_F7, false, NULL },
- { "KEY_F8", KEY_F8, false, NULL },
- { "KEY_F9", KEY_F9, false, NULL },
- { "KEY_F10", KEY_F10, false, NULL },
- { "KEY_NUMLOCK", KEY_NUMLOCK, false, NULL },
- { "KEY_SCROLLLOCK", KEY_SCROLLLOCK, false, NULL },
- { "KEY_KP7", KEY_KP7, false, NULL },
- { "KEY_KP8", KEY_KP8, false, NULL },
- { "KEY_KP9", KEY_KP9, false, NULL },
- { "KEY_KPMINUS", KEY_KPMINUS, false, NULL },
- { "KEY_KP4", KEY_KP4, false, NULL },
- { "KEY_KP5", KEY_KP5, false, NULL },
- { "KEY_KP6", KEY_KP6, false, NULL },
- { "KEY_KPPLUS", KEY_KPPLUS, false, NULL },
- { "KEY_KP1", KEY_KP1, false, NULL },
- { "KEY_KP2", KEY_KP2, false, NULL },
- { "KEY_KP3", KEY_KP3, false, NULL },
- { "KEY_KP0", KEY_KP0, false, NULL },
- { "KEY_KPDOT", KEY_KPDOT, false, NULL },
- { "KEY_ZENKAKUHANKAKU", KEY_ZENKAKUHANKAKU, false, NULL },
- { "KEY_102ND", KEY_102ND, false, NULL },
- { "KEY_F11", KEY_F11, false, NULL },
- { "KEY_F12", KEY_F12, false, NULL },
- { "KEY_RO", KEY_RO, false, NULL },
- { "KEY_KATAKANA", KEY_KATAKANA, false, NULL },
- { "KEY_HIRAGANA", KEY_HIRAGANA, false, NULL },
- { "KEY_HENKAN", KEY_HENKAN, false, NULL },
- { "KEY_KATAKANAHIRAGANA", KEY_KATAKANAHIRAGANA, false, NULL },
- { "KEY_MUHENKAN", KEY_MUHENKAN, false, NULL },
- { "KEY_KPJPCOMMA", KEY_KPJPCOMMA, false, NULL },
- { "KEY_KPENTER", KEY_KPENTER, false, NULL },
- { "KEY_RIGHTCTRL", KEY_RIGHTCTRL, false, NULL },
- { "KEY_KPSLASH", KEY_KPSLASH, false, NULL },
- { "KEY_SYSRQ", KEY_SYSRQ, false, NULL },
- { "KEY_RIGHTALT", KEY_RIGHTALT, false, NULL },
- { "KEY_LINEFEED", KEY_LINEFEED, false, NULL },
- { "KEY_HOME", KEY_HOME, false, NULL },
- { "KEY_UP", KEY_UP, false, NULL },
- { "KEY_PAGEUP", KEY_PAGEUP, false, NULL },
- { "KEY_LEFT", KEY_LEFT, false, NULL },
- { "KEY_RIGHT", KEY_RIGHT, false, NULL },
- { "KEY_END", KEY_END, false, NULL },
- { "KEY_DOWN", KEY_DOWN, false, NULL },
- { "KEY_PAGEDOWN", KEY_PAGEDOWN, false, NULL },
- { "KEY_INSERT", KEY_INSERT, false, NULL },
- { "KEY_DELETE", KEY_DELETE, false, NULL },
- { "KEY_MACRO", KEY_MACRO, false, NULL },
- { "KEY_MUTE", KEY_MUTE, false, NULL },
- { "KEY_VOLUMEDOWN", KEY_VOLUMEDOWN, false, NULL },
- { "KEY_VOLUMEUP", KEY_VOLUMEUP, false, NULL },
- { "KEY_POWER", KEY_POWER, false, NULL },
- { "KEY_KPEQUAL", KEY_KPEQUAL, false, NULL },
- { "KEY_KPPLUSMINUS", KEY_KPPLUSMINUS, false, NULL },
- { "KEY_PAUSE", KEY_PAUSE, false, NULL },
- { "KEY_SCALE", KEY_SCALE, false, NULL },
- { "KEY_KPCOMMA", KEY_KPCOMMA, false, NULL },
- { "KEY_HANGEUL", KEY_HANGEUL, false, NULL },
- { "KEY_HANGUEL", KEY_HANGUEL, true, NULL },
- { "KEY_HANJA", KEY_HANJA, false, NULL },
- { "KEY_YEN", KEY_YEN, false, NULL },
- { "KEY_LEFTMETA", KEY_LEFTMETA, false, NULL },
- { "KEY_RIGHTMETA", KEY_RIGHTMETA, false, NULL },
- { "KEY_COMPOSE", KEY_COMPOSE, false, NULL },
- { "KEY_STOP", KEY_STOP, false, NULL },
- { "KEY_AGAIN", KEY_AGAIN, false, NULL },
- { "KEY_PROPS", KEY_PROPS, false, NULL },
- { "KEY_UNDO", KEY_UNDO, false, NULL },
- { "KEY_FRONT", KEY_FRONT, false, NULL },
- { "KEY_COPY", KEY_COPY, false, NULL },
- { "KEY_OPEN", KEY_OPEN, false, NULL },
- { "KEY_PASTE", KEY_PASTE, false, NULL },
- { "KEY_FIND", KEY_FIND, false, NULL },
- { "KEY_CUT", KEY_CUT, false, NULL },
- { "KEY_HELP", KEY_HELP, false, NULL },
- { "KEY_MENU", KEY_MENU, false, NULL },
- { "KEY_CALC", KEY_CALC, false, NULL },
- { "KEY_SETUP", KEY_SETUP, false, NULL },
- { "KEY_SLEEP", KEY_SLEEP, false, NULL },
- { "KEY_WAKEUP", KEY_WAKEUP, false, NULL },
- { "KEY_FILE", KEY_FILE, false, NULL },
- { "KEY_SENDFILE", KEY_SENDFILE, false, NULL },
- { "KEY_DELETEFILE", KEY_DELETEFILE, false, NULL },
- { "KEY_XFER", KEY_XFER, false, NULL },
- { "KEY_PROG1", KEY_PROG1, false, NULL },
- { "KEY_PROG2", KEY_PROG2, false, NULL },
- { "KEY_WWW", KEY_WWW, false, NULL },
- { "KEY_MSDOS", KEY_MSDOS, false, NULL },
- { "KEY_COFFEE", KEY_COFFEE, false, NULL },
- { "KEY_SCREENLOCK", KEY_SCREENLOCK, true, NULL },
- { "KEY_DIRECTION", KEY_DIRECTION, false, NULL },
- { "KEY_CYCLEWINDOWS", KEY_CYCLEWINDOWS, false, NULL },
- { "KEY_MAIL", KEY_MAIL, false, NULL },
- { "KEY_BOOKMARKS", KEY_BOOKMARKS, false, NULL },
- { "KEY_COMPUTER", KEY_COMPUTER, false, NULL },
- { "KEY_BACK", KEY_BACK, false, NULL },
- { "KEY_FORWARD", KEY_FORWARD, false, NULL },
- { "KEY_CLOSECD", KEY_CLOSECD, false, NULL },
- { "KEY_EJECTCD", KEY_EJECTCD, false, NULL },
- { "KEY_EJECTCLOSECD", KEY_EJECTCLOSECD, false, NULL },
- { "KEY_NEXTSONG", KEY_NEXTSONG, false, NULL },
- { "KEY_PLAYPAUSE", KEY_PLAYPAUSE, false, NULL },
- { "KEY_PREVIOUSSONG", KEY_PREVIOUSSONG, false, NULL },
- { "KEY_STOPCD", KEY_STOPCD, false, NULL },
- { "KEY_RECORD", KEY_RECORD, false, NULL },
- { "KEY_REWIND", KEY_REWIND, false, NULL },
- { "KEY_PHONE", KEY_PHONE, false, NULL },
- { "KEY_ISO", KEY_ISO, false, NULL },
- { "KEY_CONFIG", KEY_CONFIG, false, NULL },
- { "KEY_HOMEPAGE", KEY_HOMEPAGE, false, NULL },
- { "KEY_REFRESH", KEY_REFRESH, false, NULL },
- { "KEY_EXIT", KEY_EXIT, false, NULL },
- { "KEY_MOVE", KEY_MOVE, false, NULL },
- { "KEY_EDIT", KEY_EDIT, false, NULL },
- { "KEY_SCROLLUP", KEY_SCROLLUP, false, NULL },
- { "KEY_SCROLLDOWN", KEY_SCROLLDOWN, false, NULL },
- { "KEY_KPLEFTPAREN", KEY_KPLEFTPAREN, false, NULL },
- { "KEY_KPRIGHTPAREN", KEY_KPRIGHTPAREN, false, NULL },
- { "KEY_NEW", KEY_NEW, false, NULL },
- { "KEY_REDO", KEY_REDO, false, NULL },
- { "KEY_F13", KEY_F13, false, NULL },
- { "KEY_F14", KEY_F14, false, NULL },
- { "KEY_F15", KEY_F15, false, NULL },
- { "KEY_F16", KEY_F16, false, NULL },
- { "KEY_F17", KEY_F17, false, NULL },
- { "KEY_F18", KEY_F18, false, NULL },
- { "KEY_F19", KEY_F19, false, NULL },
- { "KEY_F20", KEY_F20, false, NULL },
- { "KEY_F21", KEY_F21, false, NULL },
- { "KEY_F22", KEY_F22, false, NULL },
- { "KEY_F23", KEY_F23, false, NULL },
- { "KEY_F24", KEY_F24, false, NULL },
- { "KEY_PLAYCD", KEY_PLAYCD, false, NULL },
- { "KEY_PAUSECD", KEY_PAUSECD, false, NULL },
- { "KEY_PROG3", KEY_PROG3, false, NULL },
- { "KEY_PROG4", KEY_PROG4, false, NULL },
- { "KEY_DASHBOARD", KEY_DASHBOARD, false, NULL },
- { "KEY_SUSPEND", KEY_SUSPEND, false, NULL },
- { "KEY_CLOSE", KEY_CLOSE, false, NULL },
- { "KEY_PLAY", KEY_PLAY, false, NULL },
- { "KEY_FASTFORWARD", KEY_FASTFORWARD, false, NULL },
- { "KEY_BASSBOOST", KEY_BASSBOOST, false, NULL },
- { "KEY_PRINT", KEY_PRINT, false, NULL },
- { "KEY_HP", KEY_HP, false, NULL },
- { "KEY_CAMERA", KEY_CAMERA, false, NULL },
- { "KEY_SOUND", KEY_SOUND, false, NULL },
- { "KEY_QUESTION", KEY_QUESTION, false, NULL },
- { "KEY_EMAIL", KEY_EMAIL, false, NULL },
- { "KEY_CHAT", KEY_CHAT, false, NULL },
- { "KEY_SEARCH", KEY_SEARCH, false, NULL },
- { "KEY_CONNECT", KEY_CONNECT, false, NULL },
- { "KEY_FINANCE", KEY_FINANCE, false, NULL },
- { "KEY_SPORT", KEY_SPORT, false, NULL },
- { "KEY_SHOP", KEY_SHOP, false, NULL },
- { "KEY_ALTERASE", KEY_ALTERASE, false, NULL },
- { "KEY_CANCEL", KEY_CANCEL, false, NULL },
- { "KEY_BRIGHTNESSDOWN", KEY_BRIGHTNESSDOWN, false, NULL },
- { "KEY_BRIGHTNESSUP", KEY_BRIGHTNESSUP, false, NULL },
- { "KEY_MEDIA", KEY_MEDIA, false, NULL },
- { "KEY_SWITCHVIDEOMODE", KEY_SWITCHVIDEOMODE, false, NULL },
- { "KEY_KBDILLUMTOGGLE", KEY_KBDILLUMTOGGLE, false, NULL },
- { "KEY_KBDILLUMDOWN", KEY_KBDILLUMDOWN, false, NULL },
- { "KEY_KBDILLUMUP", KEY_KBDILLUMUP, false, NULL },
- { "KEY_SEND", KEY_SEND, false, NULL },
- { "KEY_REPLY", KEY_REPLY, false, NULL },
- { "KEY_FORWARDMAIL", KEY_FORWARDMAIL, false, NULL },
- { "KEY_SAVE", KEY_SAVE, false, NULL },
- { "KEY_DOCUMENTS", KEY_DOCUMENTS, false, NULL },
- { "KEY_BATTERY", KEY_BATTERY, false, NULL },
- { "KEY_BLUETOOTH", KEY_BLUETOOTH, false, NULL },
- { "KEY_WLAN", KEY_WLAN, false, NULL },
- { "KEY_UWB", KEY_UWB, false, NULL },
- { "KEY_UNKNOWN", KEY_UNKNOWN, false, NULL },
- { "KEY_VIDEO_NEXT", KEY_VIDEO_NEXT, false, NULL },
- { "KEY_VIDEO_PREV", KEY_VIDEO_PREV, false, NULL },
- { "KEY_BRIGHTNESS_CYCLE", KEY_BRIGHTNESS_CYCLE, false, NULL },
- { "KEY_BRIGHTNESS_AUTO", KEY_BRIGHTNESS_AUTO, false, NULL },
- { "KEY_BRIGHTNESS_ZERO", KEY_BRIGHTNESS_ZERO, true, NULL },
- { "KEY_DISPLAY_OFF", KEY_DISPLAY_OFF, false, NULL },
- { "KEY_WWAN", KEY_WWAN, false, NULL },
- { "KEY_WIMAX", KEY_WIMAX, true, NULL },
- { "KEY_RFKILL", KEY_RFKILL, false, NULL },
- { "KEY_MICMUTE", KEY_MICMUTE, false, NULL },
- { "KEY_OK", KEY_OK, false, NULL },
- { "KEY_SELECT", KEY_SELECT, false, NULL },
- { "KEY_GOTO", KEY_GOTO, false, NULL },
- { "KEY_CLEAR", KEY_CLEAR, false, NULL },
- { "KEY_POWER2", KEY_POWER2, false, NULL },
- { "KEY_OPTION", KEY_OPTION, false, NULL },
- { "KEY_INFO", KEY_INFO, false, NULL },
- { "KEY_TIME", KEY_TIME, false, NULL },
- { "KEY_VENDOR", KEY_VENDOR, false, NULL },
- { "KEY_ARCHIVE", KEY_ARCHIVE, false, NULL },
- { "KEY_PROGRAM", KEY_PROGRAM, false, NULL },
- { "KEY_CHANNEL", KEY_CHANNEL, false, NULL },
- { "KEY_FAVORITES", KEY_FAVORITES, false, NULL },
- { "KEY_EPG", KEY_EPG, false, NULL },
- { "KEY_PVR", KEY_PVR, false, NULL },
- { "KEY_MHP", KEY_MHP, false, NULL },
- { "KEY_LANGUAGE", KEY_LANGUAGE, false, NULL },
- { "KEY_TITLE", KEY_TITLE, false, NULL },
- { "KEY_SUBTITLE", KEY_SUBTITLE, false, NULL },
- { "KEY_ANGLE", KEY_ANGLE, false, NULL },
- { "KEY_ZOOM", KEY_ZOOM, false, NULL },
- { "KEY_MODE", KEY_MODE, false, NULL },
- { "KEY_KEYBOARD", KEY_KEYBOARD, false, NULL },
- { "KEY_SCREEN", KEY_SCREEN, false, NULL },
- { "KEY_PC", KEY_PC, false, NULL },
- { "KEY_TV", KEY_TV, false, NULL },
- { "KEY_TV2", KEY_TV2, false, NULL },
- { "KEY_VCR", KEY_VCR, false, NULL },
- { "KEY_VCR2", KEY_VCR2, false, NULL },
- { "KEY_SAT", KEY_SAT, false, NULL },
- { "KEY_SAT2", KEY_SAT2, false, NULL },
- { "KEY_CD", KEY_CD, false, NULL },
- { "KEY_TAPE", KEY_TAPE, false, NULL },
- { "KEY_RADIO", KEY_RADIO, false, NULL },
- { "KEY_TUNER", KEY_TUNER, false, NULL },
- { "KEY_PLAYER", KEY_PLAYER, false, NULL },
- { "KEY_TEXT", KEY_TEXT, false, NULL },
- { "KEY_DVD", KEY_DVD, false, NULL },
- { "KEY_AUX", KEY_AUX, false, NULL },
- { "KEY_MP3", KEY_MP3, false, NULL },
- { "KEY_AUDIO", KEY_AUDIO, false, NULL },
- { "KEY_VIDEO", KEY_VIDEO, false, NULL },
- { "KEY_DIRECTORY", KEY_DIRECTORY, false, NULL },
- { "KEY_LIST", KEY_LIST, false, NULL },
- { "KEY_MEMO", KEY_MEMO, false, NULL },
- { "KEY_CALENDAR", KEY_CALENDAR, false, NULL },
- { "KEY_RED", KEY_RED, false, NULL },
- { "KEY_GREEN", KEY_GREEN, false, NULL },
- { "KEY_YELLOW", KEY_YELLOW, false, NULL },
- { "KEY_BLUE", KEY_BLUE, false, NULL },
- { "KEY_CHANNELUP", KEY_CHANNELUP, false, NULL },
- { "KEY_CHANNELDOWN", KEY_CHANNELDOWN, false, NULL },
- { "KEY_FIRST", KEY_FIRST, false, NULL },
- { "KEY_LAST", KEY_LAST, false, NULL },
- { "KEY_AB", KEY_AB, false, NULL },
- { "KEY_NEXT", KEY_NEXT, false, NULL },
- { "KEY_RESTART", KEY_RESTART, false, NULL },
- { "KEY_SLOW", KEY_SLOW, false, NULL },
- { "KEY_SHUFFLE", KEY_SHUFFLE, false, NULL },
- { "KEY_BREAK", KEY_BREAK, false, NULL },
- { "KEY_PREVIOUS", KEY_PREVIOUS, false, NULL },
- { "KEY_DIGITS", KEY_DIGITS, false, NULL },
- { "KEY_TEEN", KEY_TEEN, false, NULL },
- { "KEY_TWEN", KEY_TWEN, false, NULL },
- { "KEY_VIDEOPHONE", KEY_VIDEOPHONE, false, NULL },
- { "KEY_GAMES", KEY_GAMES, false, NULL },
- { "KEY_ZOOMIN", KEY_ZOOMIN, false, NULL },
- { "KEY_ZOOMOUT", KEY_ZOOMOUT, false, NULL },
- { "KEY_ZOOMRESET", KEY_ZOOMRESET, false, NULL },
- { "KEY_WORDPROCESSOR", KEY_WORDPROCESSOR, false, NULL },
- { "KEY_EDITOR", KEY_EDITOR, false, NULL },
- { "KEY_SPREADSHEET", KEY_SPREADSHEET, false, NULL },
- { "KEY_GRAPHICSEDITOR", KEY_GRAPHICSEDITOR, false, NULL },
- { "KEY_PRESENTATION", KEY_PRESENTATION, false, NULL },
- { "KEY_DATABASE", KEY_DATABASE, false, NULL },
- { "KEY_NEWS", KEY_NEWS, false, NULL },
- { "KEY_VOICEMAIL", KEY_VOICEMAIL, false, NULL },
- { "KEY_ADDRESSBOOK", KEY_ADDRESSBOOK, false, NULL },
- { "KEY_MESSENGER", KEY_MESSENGER, false, NULL },
- { "KEY_DISPLAYTOGGLE", KEY_DISPLAYTOGGLE, false, NULL },
- { "KEY_BRIGHTNESS_TOGGLE", KEY_BRIGHTNESS_TOGGLE, true, NULL },
- { "KEY_SPELLCHECK", KEY_SPELLCHECK, false, NULL },
- { "KEY_LOGOFF", KEY_LOGOFF, false, NULL },
- { "KEY_DOLLAR", KEY_DOLLAR, false, NULL },
- { "KEY_EURO", KEY_EURO, false, NULL },
- { "KEY_FRAMEBACK", KEY_FRAMEBACK, false, NULL },
- { "KEY_FRAMEFORWARD", KEY_FRAMEFORWARD, false, NULL },
- { "KEY_CONTEXT_MENU", KEY_CONTEXT_MENU, false, NULL },
- { "KEY_MEDIA_REPEAT", KEY_MEDIA_REPEAT, false, NULL },
- { "KEY_10CHANNELSUP", KEY_10CHANNELSUP, false, NULL },
- { "KEY_10CHANNELSDOWN", KEY_10CHANNELSDOWN, false, NULL },
- { "KEY_IMAGES", KEY_IMAGES, false, NULL },
- { "KEY_DEL_EOL", KEY_DEL_EOL, false, NULL },
- { "KEY_DEL_EOS", KEY_DEL_EOS, false, NULL },
- { "KEY_INS_LINE", KEY_INS_LINE, false, NULL },
- { "KEY_DEL_LINE", KEY_DEL_LINE, false, NULL },
- { "KEY_FN", KEY_FN, false, NULL },
- { "KEY_FN_ESC", KEY_FN_ESC, false, NULL },
- { "KEY_FN_F1", KEY_FN_F1, false, NULL },
- { "KEY_FN_F2", KEY_FN_F2, false, NULL },
- { "KEY_FN_F3", KEY_FN_F3, false, NULL },
- { "KEY_FN_F4", KEY_FN_F4, false, NULL },
- { "KEY_FN_F5", KEY_FN_F5, false, NULL },
- { "KEY_FN_F6", KEY_FN_F6, false, NULL },
- { "KEY_FN_F7", KEY_FN_F7, false, NULL },
- { "KEY_FN_F8", KEY_FN_F8, false, NULL },
- { "KEY_FN_F9", KEY_FN_F9, false, NULL },
- { "KEY_FN_F10", KEY_FN_F10, false, NULL },
- { "KEY_FN_F11", KEY_FN_F11, false, NULL },
- { "KEY_FN_F12", KEY_FN_F12, false, NULL },
- { "KEY_FN_1", KEY_FN_1, false, NULL },
- { "KEY_FN_2", KEY_FN_2, false, NULL },
- { "KEY_FN_D", KEY_FN_D, false, NULL },
- { "KEY_FN_E", KEY_FN_E, false, NULL },
- { "KEY_FN_F", KEY_FN_F, false, NULL },
- { "KEY_FN_S", KEY_FN_S, false, NULL },
- { "KEY_FN_B", KEY_FN_B, false, NULL },
- { "KEY_BRL_DOT1", KEY_BRL_DOT1, false, NULL },
- { "KEY_BRL_DOT2", KEY_BRL_DOT2, false, NULL },
- { "KEY_BRL_DOT3", KEY_BRL_DOT3, false, NULL },
- { "KEY_BRL_DOT4", KEY_BRL_DOT4, false, NULL },
- { "KEY_BRL_DOT5", KEY_BRL_DOT5, false, NULL },
- { "KEY_BRL_DOT6", KEY_BRL_DOT6, false, NULL },
- { "KEY_BRL_DOT7", KEY_BRL_DOT7, false, NULL },
- { "KEY_BRL_DOT8", KEY_BRL_DOT8, false, NULL },
- { "KEY_BRL_DOT9", KEY_BRL_DOT9, false, NULL },
- { "KEY_BRL_DOT10", KEY_BRL_DOT10, false, NULL },
- { "KEY_NUMERIC_0", KEY_NUMERIC_0, false, NULL },
- { "KEY_NUMERIC_1", KEY_NUMERIC_1, false, NULL },
- { "KEY_NUMERIC_2", KEY_NUMERIC_2, false, NULL },
- { "KEY_NUMERIC_3", KEY_NUMERIC_3, false, NULL },
- { "KEY_NUMERIC_4", KEY_NUMERIC_4, false, NULL },
- { "KEY_NUMERIC_5", KEY_NUMERIC_5, false, NULL },
- { "KEY_NUMERIC_6", KEY_NUMERIC_6, false, NULL },
- { "KEY_NUMERIC_7", KEY_NUMERIC_7, false, NULL },
- { "KEY_NUMERIC_8", KEY_NUMERIC_8, false, NULL },
- { "KEY_NUMERIC_9", KEY_NUMERIC_9, false, NULL },
- { "KEY_NUMERIC_STAR", KEY_NUMERIC_STAR, false, NULL },
- { "KEY_NUMERIC_POUND", KEY_NUMERIC_POUND, false, NULL },
- { "KEY_CAMERA_FOCUS", KEY_CAMERA_FOCUS, false, NULL },
- { "KEY_WPS_BUTTON", KEY_WPS_BUTTON, false, NULL },
- { "KEY_TOUCHPAD_TOGGLE", KEY_TOUCHPAD_TOGGLE, false, NULL },
- { "KEY_TOUCHPAD_ON", KEY_TOUCHPAD_ON, false, NULL },
- { "KEY_TOUCHPAD_OFF", KEY_TOUCHPAD_OFF, false, NULL },
- { "KEY_CAMERA_ZOOMIN", KEY_CAMERA_ZOOMIN, false, NULL },
- { "KEY_CAMERA_ZOOMOUT", KEY_CAMERA_ZOOMOUT, false, NULL },
- { "KEY_CAMERA_UP", KEY_CAMERA_UP, false, NULL },
- { "KEY_CAMERA_DOWN", KEY_CAMERA_DOWN, false, NULL },
- { "KEY_CAMERA_LEFT", KEY_CAMERA_LEFT, false, NULL },
- { "KEY_CAMERA_RIGHT", KEY_CAMERA_RIGHT, false, NULL },
- { "KEY_ATTENDANT_ON", KEY_ATTENDANT_ON, false, NULL },
- { "KEY_ATTENDANT_OFF", KEY_ATTENDANT_OFF, false, NULL },
- { "KEY_ATTENDANT_TOGGLE", KEY_ATTENDANT_TOGGLE, false, NULL },
- { "KEY_LIGHTS_TOGGLE", KEY_LIGHTS_TOGGLE, false, NULL },
- { "KEY_ALS_TOGGLE", KEY_ALS_TOGGLE, false, NULL },
- { "KEY_BUTTONCONFIG", KEY_BUTTONCONFIG, false, NULL },
- { "KEY_TASKMANAGER", KEY_TASKMANAGER, false, NULL },
- { "KEY_JOURNAL", KEY_JOURNAL, false, NULL },
- { "KEY_CONTROLPANEL", KEY_CONTROLPANEL, false, NULL },
- { "KEY_APPSELECT", KEY_APPSELECT, false, NULL },
- { "KEY_SCREENSAVER", KEY_SCREENSAVER, false, NULL },
- { "KEY_VOICECOMMAND", KEY_VOICECOMMAND, false, NULL },
- { "KEY_BRIGHTNESS_MIN", KEY_BRIGHTNESS_MIN, false, NULL },
- { "KEY_BRIGHTNESS_MAX", KEY_BRIGHTNESS_MAX, false, NULL },
- { "KEY_KBDINPUTASSIST_PREV", KEY_KBDINPUTASSIST_PREV, false, NULL },
- { "KEY_KBDINPUTASSIST_NEXT", KEY_KBDINPUTASSIST_NEXT, false, NULL },
- { "KEY_KBDINPUTASSIST_PREVGROUP", KEY_KBDINPUTASSIST_PREVGROUP, false, NULL },
- { "KEY_KBDINPUTASSIST_NEXTGROUP", KEY_KBDINPUTASSIST_NEXTGROUP, false, NULL },
- { "KEY_KBDINPUTASSIST_ACCEPT", KEY_KBDINPUTASSIST_ACCEPT, false, NULL },
- { "KEY_KBDINPUTASSIST_CANCEL", KEY_KBDINPUTASSIST_CANCEL, false, NULL },
- { "KEY_MIN_INTERESTING", KEY_MIN_INTERESTING, true, NULL },
- { "KEY_MAX", KEY_MAX, false, NULL },
- { "KEY_CNT", KEY_CNT, false, NULL },
- { NULL, 0, false, NULL }
-};
+extern struct linux_input_keycode linux_input_keycodes[];
+
#endif
diff --git a/linux-input.h b/linux-input.h
new file mode 100644
index 0000000..722eee6
--- /dev/null
+++ b/linux-input.h
@@ -0,0 +1,1199 @@
+/*
+ * Copyright (c) 1999-2002 Vojtech Pavlik
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ */
+#ifndef _INPUT_H
+#define _INPUT_H
+
+
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <linux/types.h>
+
+
+/*
+ * The event structure itself
+ */
+
+struct input_event {
+ struct timeval time;
+ __u16 type;
+ __u16 code;
+ __s32 value;
+};
+
+/*
+ * Protocol version.
+ */
+
+#define EV_VERSION 0x010001
+
+/*
+ * IOCTLs (0x00 - 0x7f)
+ */
+
+struct input_id {
+ __u16 bustype;
+ __u16 vendor;
+ __u16 product;
+ __u16 version;
+};
+
+/**
+ * struct input_absinfo - used by EVIOCGABS/EVIOCSABS ioctls
+ * @value: latest reported value for the axis.
+ * @minimum: specifies minimum value for the axis.
+ * @maximum: specifies maximum value for the axis.
+ * @fuzz: specifies fuzz value that is used to filter noise from
+ * the event stream.
+ * @flat: values that are within this value will be discarded by
+ * joydev interface and reported as 0 instead.
+ * @resolution: specifies resolution for the values reported for
+ * the axis.
+ *
+ * Note that input core does not clamp reported values to the
+ * [minimum, maximum] limits, such task is left to userspace.
+ *
+ * Resolution for main axes (ABS_X, ABS_Y, ABS_Z) is reported in
+ * units per millimeter (units/mm), resolution for rotational axes
+ * (ABS_RX, ABS_RY, ABS_RZ) is reported in units per radian.
+ */
+struct input_absinfo {
+ __s32 value;
+ __s32 minimum;
+ __s32 maximum;
+ __s32 fuzz;
+ __s32 flat;
+ __s32 resolution;
+};
+
+/**
+ * struct input_keymap_entry - used by EVIOCGKEYCODE/EVIOCSKEYCODE ioctls
+ * @scancode: scancode represented in machine-endian form.
+ * @len: length of the scancode that resides in @scancode buffer.
+ * @index: index in the keymap, may be used instead of scancode
+ * @flags: allows to specify how kernel should handle the request. For
+ * example, setting INPUT_KEYMAP_BY_INDEX flag indicates that kernel
+ * should perform lookup in keymap by @index instead of @scancode
+ * @keycode: key code assigned to this scancode
+ *
+ * The structure is used to retrieve and modify keymap data. Users have
+ * option of performing lookup either by @scancode itself or by @index
+ * in keymap entry. EVIOCGKEYCODE will also return scancode or index
+ * (depending on which element was used to perform lookup).
+ */
+struct input_keymap_entry {
+#define INPUT_KEYMAP_BY_INDEX (1 << 0)
+ __u8 flags;
+ __u8 len;
+ __u16 index;
+ __u32 keycode;
+ __u8 scancode[32];
+};
+
+#define EVIOCGVERSION _IOR('E', 0x01, int) /* get driver version */
+#define EVIOCGID _IOR('E', 0x02, struct input_id) /* get device ID */
+#define EVIOCGREP _IOR('E', 0x03, unsigned int[2]) /* get repeat settings */
+#define EVIOCSREP _IOW('E', 0x03, unsigned int[2]) /* set repeat settings */
+
+#define EVIOCGKEYCODE _IOR('E', 0x04, unsigned int[2]) /* get keycode */
+#define EVIOCGKEYCODE_V2 _IOR('E', 0x04, struct input_keymap_entry)
+#define EVIOCSKEYCODE _IOW('E', 0x04, unsigned int[2]) /* set keycode */
+#define EVIOCSKEYCODE_V2 _IOW('E', 0x04, struct input_keymap_entry)
+
+#define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */
+#define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */
+#define EVIOCGUNIQ(len) _IOC(_IOC_READ, 'E', 0x08, len) /* get unique identifier */
+#define EVIOCGPROP(len) _IOC(_IOC_READ, 'E', 0x09, len) /* get device properties */
+
+/**
+ * EVIOCGMTSLOTS(len) - get MT slot values
+ * @len: size of the data buffer in bytes
+ *
+ * The ioctl buffer argument should be binary equivalent to
+ *
+ * struct input_mt_request_layout {
+ * __u32 code;
+ * __s32 values[num_slots];
+ * };
+ *
+ * where num_slots is the (arbitrary) number of MT slots to extract.
+ *
+ * The ioctl size argument (len) is the size of the buffer, which
+ * should satisfy len = (num_slots + 1) * sizeof(__s32). If len is
+ * too small to fit all available slots, the first num_slots are
+ * returned.
+ *
+ * Before the call, code is set to the wanted ABS_MT event type. On
+ * return, values[] is filled with the slot values for the specified
+ * ABS_MT code.
+ *
+ * If the request code is not an ABS_MT value, -EINVAL is returned.
+ */
+#define EVIOCGMTSLOTS(len) _IOC(_IOC_READ, 'E', 0x0a, len)
+
+#define EVIOCGKEY(len) _IOC(_IOC_READ, 'E', 0x18, len) /* get global key state */
+#define EVIOCGLED(len) _IOC(_IOC_READ, 'E', 0x19, len) /* get all LEDs */
+#define EVIOCGSND(len) _IOC(_IOC_READ, 'E', 0x1a, len) /* get all sounds status */
+#define EVIOCGSW(len) _IOC(_IOC_READ, 'E', 0x1b, len) /* get all switch states */
+
+#define EVIOCGBIT(ev,len) _IOC(_IOC_READ, 'E', 0x20 + (ev), len) /* get event bits */
+#define EVIOCGABS(abs) _IOR('E', 0x40 + (abs), struct input_absinfo) /* get abs value/limits */
+#define EVIOCSABS(abs) _IOW('E', 0xc0 + (abs), struct input_absinfo) /* set abs value/limits */
+
+#define EVIOCSFF _IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect)) /* send a force effect to a force feedback device */
+#define EVIOCRMFF _IOW('E', 0x81, int) /* Erase a force effect */
+#define EVIOCGEFFECTS _IOR('E', 0x84, int) /* Report number of effects playable at the same time */
+
+#define EVIOCGRAB _IOW('E', 0x90, int) /* Grab/Release device */
+#define EVIOCREVOKE _IOW('E', 0x91, int) /* Revoke device access */
+
+#define EVIOCSCLOCKID _IOW('E', 0xa0, int) /* Set clockid to be used for timestamps */
+
+/*
+ * Device properties and quirks
+ */
+
+#define INPUT_PROP_POINTER 0x00 /* needs a pointer */
+#define INPUT_PROP_DIRECT 0x01 /* direct input devices */
+#define INPUT_PROP_BUTTONPAD 0x02 /* has button(s) under pad */
+#define INPUT_PROP_SEMI_MT 0x03 /* touch rectangle only */
+#define INPUT_PROP_TOPBUTTONPAD 0x04 /* softbuttons at top of pad */
+#define INPUT_PROP_POINTING_STICK 0x05 /* is a pointing stick */
+#define INPUT_PROP_ACCELEROMETER 0x06 /* has accelerometer */
+
+#define INPUT_PROP_MAX 0x1f
+#define INPUT_PROP_CNT (INPUT_PROP_MAX + 1)
+
+/*
+ * Event types
+ */
+
+#define EV_SYN 0x00
+#define EV_KEY 0x01
+#define EV_REL 0x02
+#define EV_ABS 0x03
+#define EV_MSC 0x04
+#define EV_SW 0x05
+#define EV_LED 0x11
+#define EV_SND 0x12
+#define EV_REP 0x14
+#define EV_FF 0x15
+#define EV_PWR 0x16
+#define EV_FF_STATUS 0x17
+#define EV_MAX 0x1f
+#define EV_CNT (EV_MAX+1)
+
+/*
+ * Synchronization events.
+ */
+
+#define SYN_REPORT 0
+#define SYN_CONFIG 1
+#define SYN_MT_REPORT 2
+#define SYN_DROPPED 3
+#define SYN_MAX 0xf
+#define SYN_CNT (SYN_MAX+1)
+
+/*
+ * Keys and buttons
+ *
+ * Most of the keys/buttons are modeled after USB HUT 1.12
+ * (see http://www.usb.org/developers/hidpage).
+ * Abbreviations in the comments:
+ * AC - Application Control
+ * AL - Application Launch Button
+ * SC - System Control
+ */
+
+#define KEY_RESERVED 0
+#define KEY_ESC 1
+#define KEY_1 2
+#define KEY_2 3
+#define KEY_3 4
+#define KEY_4 5
+#define KEY_5 6
+#define KEY_6 7
+#define KEY_7 8
+#define KEY_8 9
+#define KEY_9 10
+#define KEY_0 11
+#define KEY_MINUS 12
+#define KEY_EQUAL 13
+#define KEY_BACKSPACE 14
+#define KEY_TAB 15
+#define KEY_Q 16
+#define KEY_W 17
+#define KEY_E 18
+#define KEY_R 19
+#define KEY_T 20
+#define KEY_Y 21
+#define KEY_U 22
+#define KEY_I 23
+#define KEY_O 24
+#define KEY_P 25
+#define KEY_LEFTBRACE 26
+#define KEY_RIGHTBRACE 27
+#define KEY_ENTER 28
+#define KEY_LEFTCTRL 29
+#define KEY_A 30
+#define KEY_S 31
+#define KEY_D 32
+#define KEY_F 33
+#define KEY_G 34
+#define KEY_H 35
+#define KEY_J 36
+#define KEY_K 37
+#define KEY_L 38
+#define KEY_SEMICOLON 39
+#define KEY_APOSTROPHE 40
+#define KEY_GRAVE 41
+#define KEY_LEFTSHIFT 42
+#define KEY_BACKSLASH 43
+#define KEY_Z 44
+#define KEY_X 45
+#define KEY_C 46
+#define KEY_V 47
+#define KEY_B 48
+#define KEY_N 49
+#define KEY_M 50
+#define KEY_COMMA 51
+#define KEY_DOT 52
+#define KEY_SLASH 53
+#define KEY_RIGHTSHIFT 54
+#define KEY_KPASTERISK 55
+#define KEY_LEFTALT 56
+#define KEY_SPACE 57
+#define KEY_CAPSLOCK 58
+#define KEY_F1 59
+#define KEY_F2 60
+#define KEY_F3 61
+#define KEY_F4 62
+#define KEY_F5 63
+#define KEY_F6 64
+#define KEY_F7 65
+#define KEY_F8 66
+#define KEY_F9 67
+#define KEY_F10 68
+#define KEY_NUMLOCK 69
+#define KEY_SCROLLLOCK 70
+#define KEY_KP7 71
+#define KEY_KP8 72
+#define KEY_KP9 73
+#define KEY_KPMINUS 74
+#define KEY_KP4 75
+#define KEY_KP5 76
+#define KEY_KP6 77
+#define KEY_KPPLUS 78
+#define KEY_KP1 79
+#define KEY_KP2 80
+#define KEY_KP3 81
+#define KEY_KP0 82
+#define KEY_KPDOT 83
+
+#define KEY_ZENKAKUHANKAKU 85
+#define KEY_102ND 86
+#define KEY_F11 87
+#define KEY_F12 88
+#define KEY_RO 89
+#define KEY_KATAKANA 90
+#define KEY_HIRAGANA 91
+#define KEY_HENKAN 92
+#define KEY_KATAKANAHIRAGANA 93
+#define KEY_MUHENKAN 94
+#define KEY_KPJPCOMMA 95
+#define KEY_KPENTER 96
+#define KEY_RIGHTCTRL 97
+#define KEY_KPSLASH 98
+#define KEY_SYSRQ 99
+#define KEY_RIGHTALT 100
+#define KEY_LINEFEED 101
+#define KEY_HOME 102
+#define KEY_UP 103
+#define KEY_PAGEUP 104
+#define KEY_LEFT 105
+#define KEY_RIGHT 106
+#define KEY_END 107
+#define KEY_DOWN 108
+#define KEY_PAGEDOWN 109
+#define KEY_INSERT 110
+#define KEY_DELETE 111
+#define KEY_MACRO 112
+#define KEY_MUTE 113
+#define KEY_VOLUMEDOWN 114
+#define KEY_VOLUMEUP 115
+#define KEY_POWER 116 /* SC System Power Down */
+#define KEY_KPEQUAL 117
+#define KEY_KPPLUSMINUS 118
+#define KEY_PAUSE 119
+#define KEY_SCALE 120 /* AL Compiz Scale (Expose) */
+
+#define KEY_KPCOMMA 121
+#define KEY_HANGEUL 122
+#define KEY_HANGUEL KEY_HANGEUL
+#define KEY_HANJA 123
+#define KEY_YEN 124
+#define KEY_LEFTMETA 125
+#define KEY_RIGHTMETA 126
+#define KEY_COMPOSE 127
+
+#define KEY_STOP 128 /* AC Stop */
+#define KEY_AGAIN 129
+#define KEY_PROPS 130 /* AC Properties */
+#define KEY_UNDO 131 /* AC Undo */
+#define KEY_FRONT 132
+#define KEY_COPY 133 /* AC Copy */
+#define KEY_OPEN 134 /* AC Open */
+#define KEY_PASTE 135 /* AC Paste */
+#define KEY_FIND 136 /* AC Search */
+#define KEY_CUT 137 /* AC Cut */
+#define KEY_HELP 138 /* AL Integrated Help Center */
+#define KEY_MENU 139 /* Menu (show menu) */
+#define KEY_CALC 140 /* AL Calculator */
+#define KEY_SETUP 141
+#define KEY_SLEEP 142 /* SC System Sleep */
+#define KEY_WAKEUP 143 /* System Wake Up */
+#define KEY_FILE 144 /* AL Local Machine Browser */
+#define KEY_SENDFILE 145
+#define KEY_DELETEFILE 146
+#define KEY_XFER 147
+#define KEY_PROG1 148
+#define KEY_PROG2 149
+#define KEY_WWW 150 /* AL Internet Browser */
+#define KEY_MSDOS 151
+#define KEY_COFFEE 152 /* AL Terminal Lock/Screensaver */
+#define KEY_SCREENLOCK KEY_COFFEE
+#define KEY_DIRECTION 153
+#define KEY_CYCLEWINDOWS 154
+#define KEY_MAIL 155
+#define KEY_BOOKMARKS 156 /* AC Bookmarks */
+#define KEY_COMPUTER 157
+#define KEY_BACK 158 /* AC Back */
+#define KEY_FORWARD 159 /* AC Forward */
+#define KEY_CLOSECD 160
+#define KEY_EJECTCD 161
+#define KEY_EJECTCLOSECD 162
+#define KEY_NEXTSONG 163
+#define KEY_PLAYPAUSE 164
+#define KEY_PREVIOUSSONG 165
+#define KEY_STOPCD 166
+#define KEY_RECORD 167
+#define KEY_REWIND 168
+#define KEY_PHONE 169 /* Media Select Telephone */
+#define KEY_ISO 170
+#define KEY_CONFIG 171 /* AL Consumer Control Configuration */
+#define KEY_HOMEPAGE 172 /* AC Home */
+#define KEY_REFRESH 173 /* AC Refresh */
+#define KEY_EXIT 174 /* AC Exit */
+#define KEY_MOVE 175
+#define KEY_EDIT 176
+#define KEY_SCROLLUP 177
+#define KEY_SCROLLDOWN 178
+#define KEY_KPLEFTPAREN 179
+#define KEY_KPRIGHTPAREN 180
+#define KEY_NEW 181 /* AC New */
+#define KEY_REDO 182 /* AC Redo/Repeat */
+
+#define KEY_F13 183
+#define KEY_F14 184
+#define KEY_F15 185
+#define KEY_F16 186
+#define KEY_F17 187
+#define KEY_F18 188
+#define KEY_F19 189
+#define KEY_F20 190
+#define KEY_F21 191
+#define KEY_F22 192
+#define KEY_F23 193
+#define KEY_F24 194
+
+#define KEY_PLAYCD 200
+#define KEY_PAUSECD 201
+#define KEY_PROG3 202
+#define KEY_PROG4 203
+#define KEY_DASHBOARD 204 /* AL Dashboard */
+#define KEY_SUSPEND 205
+#define KEY_CLOSE 206 /* AC Close */
+#define KEY_PLAY 207
+#define KEY_FASTFORWARD 208
+#define KEY_BASSBOOST 209
+#define KEY_PRINT 210 /* AC Print */
+#define KEY_HP 211
+#define KEY_CAMERA 212
+#define KEY_SOUND 213
+#define KEY_QUESTION 214
+#define KEY_EMAIL 215
+#define KEY_CHAT 216
+#define KEY_SEARCH 217
+#define KEY_CONNECT 218
+#define KEY_FINANCE 219 /* AL Checkbook/Finance */
+#define KEY_SPORT 220
+#define KEY_SHOP 221
+#define KEY_ALTERASE 222
+#define KEY_CANCEL 223 /* AC Cancel */
+#define KEY_BRIGHTNESSDOWN 224
+#define KEY_BRIGHTNESSUP 225
+#define KEY_MEDIA 226
+
+#define KEY_SWITCHVIDEOMODE 227 /* Cycle between available video
+ outputs (Monitor/LCD/TV-out/etc) */
+#define KEY_KBDILLUMTOGGLE 228
+#define KEY_KBDILLUMDOWN 229
+#define KEY_KBDILLUMUP 230
+
+#define KEY_SEND 231 /* AC Send */
+#define KEY_REPLY 232 /* AC Reply */
+#define KEY_FORWARDMAIL 233 /* AC Forward Msg */
+#define KEY_SAVE 234 /* AC Save */
+#define KEY_DOCUMENTS 235
+
+#define KEY_BATTERY 236
+
+#define KEY_BLUETOOTH 237
+#define KEY_WLAN 238
+#define KEY_UWB 239
+
+#define KEY_UNKNOWN 240
+
+#define KEY_VIDEO_NEXT 241 /* drive next video source */
+#define KEY_VIDEO_PREV 242 /* drive previous video source */
+#define KEY_BRIGHTNESS_CYCLE 243 /* brightness up, after max is min */
+#define KEY_BRIGHTNESS_AUTO 244 /* Set Auto Brightness: manual
+ brightness control is off,
+ rely on ambient */
+#define KEY_BRIGHTNESS_ZERO KEY_BRIGHTNESS_AUTO
+#define KEY_DISPLAY_OFF 245 /* display device to off state */
+
+#define KEY_WWAN 246 /* Wireless WAN (LTE, UMTS, GSM, etc.) */
+#define KEY_WIMAX KEY_WWAN
+#define KEY_RFKILL 247 /* Key that controls all radios */
+
+#define KEY_MICMUTE 248 /* Mute / unmute the microphone */
+
+/* Code 255 is reserved for special needs of AT keyboard driver */
+
+#define BTN_MISC 0x100
+#define BTN_0 0x100
+#define BTN_1 0x101
+#define BTN_2 0x102
+#define BTN_3 0x103
+#define BTN_4 0x104
+#define BTN_5 0x105
+#define BTN_6 0x106
+#define BTN_7 0x107
+#define BTN_8 0x108
+#define BTN_9 0x109
+
+#define BTN_MOUSE 0x110
+#define BTN_LEFT 0x110
+#define BTN_RIGHT 0x111
+#define BTN_MIDDLE 0x112
+#define BTN_SIDE 0x113
+#define BTN_EXTRA 0x114
+#define BTN_FORWARD 0x115
+#define BTN_BACK 0x116
+#define BTN_TASK 0x117
+
+#define BTN_JOYSTICK 0x120
+#define BTN_TRIGGER 0x120
+#define BTN_THUMB 0x121
+#define BTN_THUMB2 0x122
+#define BTN_TOP 0x123
+#define BTN_TOP2 0x124
+#define BTN_PINKIE 0x125
+#define BTN_BASE 0x126
+#define BTN_BASE2 0x127
+#define BTN_BASE3 0x128
+#define BTN_BASE4 0x129
+#define BTN_BASE5 0x12a
+#define BTN_BASE6 0x12b
+#define BTN_DEAD 0x12f
+
+#define BTN_GAMEPAD 0x130
+#define BTN_SOUTH 0x130
+#define BTN_A BTN_SOUTH
+#define BTN_EAST 0x131
+#define BTN_B BTN_EAST
+#define BTN_C 0x132
+#define BTN_NORTH 0x133
+#define BTN_X BTN_NORTH
+#define BTN_WEST 0x134
+#define BTN_Y BTN_WEST
+#define BTN_Z 0x135
+#define BTN_TL 0x136
+#define BTN_TR 0x137
+#define BTN_TL2 0x138
+#define BTN_TR2 0x139
+#define BTN_SELECT 0x13a
+#define BTN_START 0x13b
+#define BTN_MODE 0x13c
+#define BTN_THUMBL 0x13d
+#define BTN_THUMBR 0x13e
+
+#define BTN_DIGI 0x140
+#define BTN_TOOL_PEN 0x140
+#define BTN_TOOL_RUBBER 0x141
+#define BTN_TOOL_BRUSH 0x142
+#define BTN_TOOL_PENCIL 0x143
+#define BTN_TOOL_AIRBRUSH 0x144
+#define BTN_TOOL_FINGER 0x145
+#define BTN_TOOL_MOUSE 0x146
+#define BTN_TOOL_LENS 0x147
+#define BTN_TOOL_QUINTTAP 0x148 /* Five fingers on trackpad */
+#define BTN_TOUCH 0x14a
+#define BTN_STYLUS 0x14b
+#define BTN_STYLUS2 0x14c
+#define BTN_TOOL_DOUBLETAP 0x14d
+#define BTN_TOOL_TRIPLETAP 0x14e
+#define BTN_TOOL_QUADTAP 0x14f /* Four fingers on trackpad */
+
+#define BTN_WHEEL 0x150
+#define BTN_GEAR_DOWN 0x150
+#define BTN_GEAR_UP 0x151
+
+#define KEY_OK 0x160
+#define KEY_SELECT 0x161
+#define KEY_GOTO 0x162
+#define KEY_CLEAR 0x163
+#define KEY_POWER2 0x164
+#define KEY_OPTION 0x165
+#define KEY_INFO 0x166 /* AL OEM Features/Tips/Tutorial */
+#define KEY_TIME 0x167
+#define KEY_VENDOR 0x168
+#define KEY_ARCHIVE 0x169
+#define KEY_PROGRAM 0x16a /* Media Select Program Guide */
+#define KEY_CHANNEL 0x16b
+#define KEY_FAVORITES 0x16c
+#define KEY_EPG 0x16d
+#define KEY_PVR 0x16e /* Media Select Home */
+#define KEY_MHP 0x16f
+#define KEY_LANGUAGE 0x170
+#define KEY_TITLE 0x171
+#define KEY_SUBTITLE 0x172
+#define KEY_ANGLE 0x173
+#define KEY_ZOOM 0x174
+#define KEY_MODE 0x175
+#define KEY_KEYBOARD 0x176
+#define KEY_SCREEN 0x177
+#define KEY_PC 0x178 /* Media Select Computer */
+#define KEY_TV 0x179 /* Media Select TV */
+#define KEY_TV2 0x17a /* Media Select Cable */
+#define KEY_VCR 0x17b /* Media Select VCR */
+#define KEY_VCR2 0x17c /* VCR Plus */
+#define KEY_SAT 0x17d /* Media Select Satellite */
+#define KEY_SAT2 0x17e
+#define KEY_CD 0x17f /* Media Select CD */
+#define KEY_TAPE 0x180 /* Media Select Tape */
+#define KEY_RADIO 0x181
+#define KEY_TUNER 0x182 /* Media Select Tuner */
+#define KEY_PLAYER 0x183
+#define KEY_TEXT 0x184
+#define KEY_DVD 0x185 /* Media Select DVD */
+#define KEY_AUX 0x186
+#define KEY_MP3 0x187
+#define KEY_AUDIO 0x188 /* AL Audio Browser */
+#define KEY_VIDEO 0x189 /* AL Movie Browser */
+#define KEY_DIRECTORY 0x18a
+#define KEY_LIST 0x18b
+#define KEY_MEMO 0x18c /* Media Select Messages */
+#define KEY_CALENDAR 0x18d
+#define KEY_RED 0x18e
+#define KEY_GREEN 0x18f
+#define KEY_YELLOW 0x190
+#define KEY_BLUE 0x191
+#define KEY_CHANNELUP 0x192 /* Channel Increment */
+#define KEY_CHANNELDOWN 0x193 /* Channel Decrement */
+#define KEY_FIRST 0x194
+#define KEY_LAST 0x195 /* Recall Last */
+#define KEY_AB 0x196
+#define KEY_NEXT 0x197
+#define KEY_RESTART 0x198
+#define KEY_SLOW 0x199
+#define KEY_SHUFFLE 0x19a
+#define KEY_BREAK 0x19b
+#define KEY_PREVIOUS 0x19c
+#define KEY_DIGITS 0x19d
+#define KEY_TEEN 0x19e
+#define KEY_TWEN 0x19f
+#define KEY_VIDEOPHONE 0x1a0 /* Media Select Video Phone */
+#define KEY_GAMES 0x1a1 /* Media Select Games */
+#define KEY_ZOOMIN 0x1a2 /* AC Zoom In */
+#define KEY_ZOOMOUT 0x1a3 /* AC Zoom Out */
+#define KEY_ZOOMRESET 0x1a4 /* AC Zoom */
+#define KEY_WORDPROCESSOR 0x1a5 /* AL Word Processor */
+#define KEY_EDITOR 0x1a6 /* AL Text Editor */
+#define KEY_SPREADSHEET 0x1a7 /* AL Spreadsheet */
+#define KEY_GRAPHICSEDITOR 0x1a8 /* AL Graphics Editor */
+#define KEY_PRESENTATION 0x1a9 /* AL Presentation App */
+#define KEY_DATABASE 0x1aa /* AL Database App */
+#define KEY_NEWS 0x1ab /* AL Newsreader */
+#define KEY_VOICEMAIL 0x1ac /* AL Voicemail */
+#define KEY_ADDRESSBOOK 0x1ad /* AL Contacts/Address Book */
+#define KEY_MESSENGER 0x1ae /* AL Instant Messaging */
+#define KEY_DISPLAYTOGGLE 0x1af /* Turn display (LCD) on and off */
+#define KEY_BRIGHTNESS_TOGGLE KEY_DISPLAYTOGGLE
+#define KEY_SPELLCHECK 0x1b0 /* AL Spell Check */
+#define KEY_LOGOFF 0x1b1 /* AL Logoff */
+
+#define KEY_DOLLAR 0x1b2
+#define KEY_EURO 0x1b3
+
+#define KEY_FRAMEBACK 0x1b4 /* Consumer - transport controls */
+#define KEY_FRAMEFORWARD 0x1b5
+#define KEY_CONTEXT_MENU 0x1b6 /* GenDesc - system context menu */
+#define KEY_MEDIA_REPEAT 0x1b7 /* Consumer - transport control */
+#define KEY_10CHANNELSUP 0x1b8 /* 10 channels up (10+) */
+#define KEY_10CHANNELSDOWN 0x1b9 /* 10 channels down (10-) */
+#define KEY_IMAGES 0x1ba /* AL Image Browser */
+
+#define KEY_DEL_EOL 0x1c0
+#define KEY_DEL_EOS 0x1c1
+#define KEY_INS_LINE 0x1c2
+#define KEY_DEL_LINE 0x1c3
+
+#define KEY_FN 0x1d0
+#define KEY_FN_ESC 0x1d1
+#define KEY_FN_F1 0x1d2
+#define KEY_FN_F2 0x1d3
+#define KEY_FN_F3 0x1d4
+#define KEY_FN_F4 0x1d5
+#define KEY_FN_F5 0x1d6
+#define KEY_FN_F6 0x1d7
+#define KEY_FN_F7 0x1d8
+#define KEY_FN_F8 0x1d9
+#define KEY_FN_F9 0x1da
+#define KEY_FN_F10 0x1db
+#define KEY_FN_F11 0x1dc
+#define KEY_FN_F12 0x1dd
+#define KEY_FN_1 0x1de
+#define KEY_FN_2 0x1df
+#define KEY_FN_D 0x1e0
+#define KEY_FN_E 0x1e1
+#define KEY_FN_F 0x1e2
+#define KEY_FN_S 0x1e3
+#define KEY_FN_B 0x1e4
+
+#define KEY_BRL_DOT1 0x1f1
+#define KEY_BRL_DOT2 0x1f2
+#define KEY_BRL_DOT3 0x1f3
+#define KEY_BRL_DOT4 0x1f4
+#define KEY_BRL_DOT5 0x1f5
+#define KEY_BRL_DOT6 0x1f6
+#define KEY_BRL_DOT7 0x1f7
+#define KEY_BRL_DOT8 0x1f8
+#define KEY_BRL_DOT9 0x1f9
+#define KEY_BRL_DOT10 0x1fa
+
+#define KEY_NUMERIC_0 0x200 /* used by phones, remote controls, */
+#define KEY_NUMERIC_1 0x201 /* and other keypads */
+#define KEY_NUMERIC_2 0x202
+#define KEY_NUMERIC_3 0x203
+#define KEY_NUMERIC_4 0x204
+#define KEY_NUMERIC_5 0x205
+#define KEY_NUMERIC_6 0x206
+#define KEY_NUMERIC_7 0x207
+#define KEY_NUMERIC_8 0x208
+#define KEY_NUMERIC_9 0x209
+#define KEY_NUMERIC_STAR 0x20a
+#define KEY_NUMERIC_POUND 0x20b
+
+#define KEY_CAMERA_FOCUS 0x210
+#define KEY_WPS_BUTTON 0x211 /* WiFi Protected Setup key */
+
+#define KEY_TOUCHPAD_TOGGLE 0x212 /* Request switch touchpad on or off */
+#define KEY_TOUCHPAD_ON 0x213
+#define KEY_TOUCHPAD_OFF 0x214
+
+#define KEY_CAMERA_ZOOMIN 0x215
+#define KEY_CAMERA_ZOOMOUT 0x216
+#define KEY_CAMERA_UP 0x217
+#define KEY_CAMERA_DOWN 0x218
+#define KEY_CAMERA_LEFT 0x219
+#define KEY_CAMERA_RIGHT 0x21a
+
+#define KEY_ATTENDANT_ON 0x21b
+#define KEY_ATTENDANT_OFF 0x21c
+#define KEY_ATTENDANT_TOGGLE 0x21d /* Attendant call on or off */
+#define KEY_LIGHTS_TOGGLE 0x21e /* Reading light on or off */
+
+#define BTN_DPAD_UP 0x220
+#define BTN_DPAD_DOWN 0x221
+#define BTN_DPAD_LEFT 0x222
+#define BTN_DPAD_RIGHT 0x223
+
+#define KEY_ALS_TOGGLE 0x230 /* Ambient light sensor */
+
+#define KEY_BUTTONCONFIG 0x240 /* AL Button Configuration */
+#define KEY_TASKMANAGER 0x241 /* AL Task/Project Manager */
+#define KEY_JOURNAL 0x242 /* AL Log/Journal/Timecard */
+#define KEY_CONTROLPANEL 0x243 /* AL Control Panel */
+#define KEY_APPSELECT 0x244 /* AL Select Task/Application */
+#define KEY_SCREENSAVER 0x245 /* AL Screen Saver */
+#define KEY_VOICECOMMAND 0x246 /* Listening Voice Command */
+
+#define KEY_BRIGHTNESS_MIN 0x250 /* Set Brightness to Minimum */
+#define KEY_BRIGHTNESS_MAX 0x251 /* Set Brightness to Maximum */
+
+#define KEY_KBDINPUTASSIST_PREV 0x260
+#define KEY_KBDINPUTASSIST_NEXT 0x261
+#define KEY_KBDINPUTASSIST_PREVGROUP 0x262
+#define KEY_KBDINPUTASSIST_NEXTGROUP 0x263
+#define KEY_KBDINPUTASSIST_ACCEPT 0x264
+#define KEY_KBDINPUTASSIST_CANCEL 0x265
+
+#define BTN_TRIGGER_HAPPY 0x2c0
+#define BTN_TRIGGER_HAPPY1 0x2c0
+#define BTN_TRIGGER_HAPPY2 0x2c1
+#define BTN_TRIGGER_HAPPY3 0x2c2
+#define BTN_TRIGGER_HAPPY4 0x2c3
+#define BTN_TRIGGER_HAPPY5 0x2c4
+#define BTN_TRIGGER_HAPPY6 0x2c5
+#define BTN_TRIGGER_HAPPY7 0x2c6
+#define BTN_TRIGGER_HAPPY8 0x2c7
+#define BTN_TRIGGER_HAPPY9 0x2c8
+#define BTN_TRIGGER_HAPPY10 0x2c9
+#define BTN_TRIGGER_HAPPY11 0x2ca
+#define BTN_TRIGGER_HAPPY12 0x2cb
+#define BTN_TRIGGER_HAPPY13 0x2cc
+#define BTN_TRIGGER_HAPPY14 0x2cd
+#define BTN_TRIGGER_HAPPY15 0x2ce
+#define BTN_TRIGGER_HAPPY16 0x2cf
+#define BTN_TRIGGER_HAPPY17 0x2d0
+#define BTN_TRIGGER_HAPPY18 0x2d1
+#define BTN_TRIGGER_HAPPY19 0x2d2
+#define BTN_TRIGGER_HAPPY20 0x2d3
+#define BTN_TRIGGER_HAPPY21 0x2d4
+#define BTN_TRIGGER_HAPPY22 0x2d5
+#define BTN_TRIGGER_HAPPY23 0x2d6
+#define BTN_TRIGGER_HAPPY24 0x2d7
+#define BTN_TRIGGER_HAPPY25 0x2d8
+#define BTN_TRIGGER_HAPPY26 0x2d9
+#define BTN_TRIGGER_HAPPY27 0x2da
+#define BTN_TRIGGER_HAPPY28 0x2db
+#define BTN_TRIGGER_HAPPY29 0x2dc
+#define BTN_TRIGGER_HAPPY30 0x2dd
+#define BTN_TRIGGER_HAPPY31 0x2de
+#define BTN_TRIGGER_HAPPY32 0x2df
+#define BTN_TRIGGER_HAPPY33 0x2e0
+#define BTN_TRIGGER_HAPPY34 0x2e1
+#define BTN_TRIGGER_HAPPY35 0x2e2
+#define BTN_TRIGGER_HAPPY36 0x2e3
+#define BTN_TRIGGER_HAPPY37 0x2e4
+#define BTN_TRIGGER_HAPPY38 0x2e5
+#define BTN_TRIGGER_HAPPY39 0x2e6
+#define BTN_TRIGGER_HAPPY40 0x2e7
+
+/* We avoid low common keys in module aliases so they don't get huge. */
+#define KEY_MIN_INTERESTING KEY_MUTE
+#define KEY_MAX 0x2ff
+#define KEY_CNT (KEY_MAX+1)
+
+/*
+ * Relative axes
+ */
+
+#define REL_X 0x00
+#define REL_Y 0x01
+#define REL_Z 0x02
+#define REL_RX 0x03
+#define REL_RY 0x04
+#define REL_RZ 0x05
+#define REL_HWHEEL 0x06
+#define REL_DIAL 0x07
+#define REL_WHEEL 0x08
+#define REL_MISC 0x09
+#define REL_MAX 0x0f
+#define REL_CNT (REL_MAX+1)
+
+/*
+ * Absolute axes
+ */
+
+#define ABS_X 0x00
+#define ABS_Y 0x01
+#define ABS_Z 0x02
+#define ABS_RX 0x03
+#define ABS_RY 0x04
+#define ABS_RZ 0x05
+#define ABS_THROTTLE 0x06
+#define ABS_RUDDER 0x07
+#define ABS_WHEEL 0x08
+#define ABS_GAS 0x09
+#define ABS_BRAKE 0x0a
+#define ABS_HAT0X 0x10
+#define ABS_HAT0Y 0x11
+#define ABS_HAT1X 0x12
+#define ABS_HAT1Y 0x13
+#define ABS_HAT2X 0x14
+#define ABS_HAT2Y 0x15
+#define ABS_HAT3X 0x16
+#define ABS_HAT3Y 0x17
+#define ABS_PRESSURE 0x18
+#define ABS_DISTANCE 0x19
+#define ABS_TILT_X 0x1a
+#define ABS_TILT_Y 0x1b
+#define ABS_TOOL_WIDTH 0x1c
+
+#define ABS_VOLUME 0x20
+
+#define ABS_MISC 0x28
+
+#define ABS_MT_SLOT 0x2f /* MT slot being modified */
+#define ABS_MT_TOUCH_MAJOR 0x30 /* Major axis of touching ellipse */
+#define ABS_MT_TOUCH_MINOR 0x31 /* Minor axis (omit if circular) */
+#define ABS_MT_WIDTH_MAJOR 0x32 /* Major axis of approaching ellipse */
+#define ABS_MT_WIDTH_MINOR 0x33 /* Minor axis (omit if circular) */
+#define ABS_MT_ORIENTATION 0x34 /* Ellipse orientation */
+#define ABS_MT_POSITION_X 0x35 /* Center X touch position */
+#define ABS_MT_POSITION_Y 0x36 /* Center Y touch position */
+#define ABS_MT_TOOL_TYPE 0x37 /* Type of touching device */
+#define ABS_MT_BLOB_ID 0x38 /* Group a set of packets as a blob */
+#define ABS_MT_TRACKING_ID 0x39 /* Unique ID of initiated contact */
+#define ABS_MT_PRESSURE 0x3a /* Pressure on contact area */
+#define ABS_MT_DISTANCE 0x3b /* Contact hover distance */
+#define ABS_MT_TOOL_X 0x3c /* Center X tool position */
+#define ABS_MT_TOOL_Y 0x3d /* Center Y tool position */
+
+
+#define ABS_MAX 0x3f
+#define ABS_CNT (ABS_MAX+1)
+
+/*
+ * Switch events
+ */
+
+#define SW_LID 0x00 /* set = lid shut */
+#define SW_TABLET_MODE 0x01 /* set = tablet mode */
+#define SW_HEADPHONE_INSERT 0x02 /* set = inserted */
+#define SW_RFKILL_ALL 0x03 /* rfkill master switch, type "any"
+ set = radio enabled */
+#define SW_RADIO SW_RFKILL_ALL /* deprecated */
+#define SW_MICROPHONE_INSERT 0x04 /* set = inserted */
+#define SW_DOCK 0x05 /* set = plugged into dock */
+#define SW_LINEOUT_INSERT 0x06 /* set = inserted */
+#define SW_JACK_PHYSICAL_INSERT 0x07 /* set = mechanical switch set */
+#define SW_VIDEOOUT_INSERT 0x08 /* set = inserted */
+#define SW_CAMERA_LENS_COVER 0x09 /* set = lens covered */
+#define SW_KEYPAD_SLIDE 0x0a /* set = keypad slide out */
+#define SW_FRONT_PROXIMITY 0x0b /* set = front proximity sensor active */
+#define SW_ROTATE_LOCK 0x0c /* set = rotate locked/disabled */
+#define SW_LINEIN_INSERT 0x0d /* set = inserted */
+#define SW_MUTE_DEVICE 0x0e /* set = device disabled */
+#define SW_MAX 0x0f
+#define SW_CNT (SW_MAX+1)
+
+/*
+ * Misc events
+ */
+
+#define MSC_SERIAL 0x00
+#define MSC_PULSELED 0x01
+#define MSC_GESTURE 0x02
+#define MSC_RAW 0x03
+#define MSC_SCAN 0x04
+#define MSC_TIMESTAMP 0x05
+#define MSC_MAX 0x07
+#define MSC_CNT (MSC_MAX+1)
+
+/*
+ * LEDs
+ */
+
+#define LED_NUML 0x00
+#define LED_CAPSL 0x01
+#define LED_SCROLLL 0x02
+#define LED_COMPOSE 0x03
+#define LED_KANA 0x04
+#define LED_SLEEP 0x05
+#define LED_SUSPEND 0x06
+#define LED_MUTE 0x07
+#define LED_MISC 0x08
+#define LED_MAIL 0x09
+#define LED_CHARGING 0x0a
+#define LED_MAX 0x0f
+#define LED_CNT (LED_MAX+1)
+
+/*
+ * Autorepeat values
+ */
+
+#define REP_DELAY 0x00
+#define REP_PERIOD 0x01
+#define REP_MAX 0x01
+#define REP_CNT (REP_MAX+1)
+
+/*
+ * Sounds
+ */
+
+#define SND_CLICK 0x00
+#define SND_BELL 0x01
+#define SND_TONE 0x02
+#define SND_MAX 0x07
+#define SND_CNT (SND_MAX+1)
+
+/*
+ * IDs.
+ */
+
+#define ID_BUS 0
+#define ID_VENDOR 1
+#define ID_PRODUCT 2
+#define ID_VERSION 3
+
+#define BUS_PCI 0x01
+#define BUS_ISAPNP 0x02
+#define BUS_USB 0x03
+#define BUS_HIL 0x04
+#define BUS_BLUETOOTH 0x05
+#define BUS_VIRTUAL 0x06
+
+#define BUS_ISA 0x10
+#define BUS_I8042 0x11
+#define BUS_XTKBD 0x12
+#define BUS_RS232 0x13
+#define BUS_GAMEPORT 0x14
+#define BUS_PARPORT 0x15
+#define BUS_AMIGA 0x16
+#define BUS_ADB 0x17
+#define BUS_I2C 0x18
+#define BUS_HOST 0x19
+#define BUS_GSC 0x1A
+#define BUS_ATARI 0x1B
+#define BUS_SPI 0x1C
+
+/*
+ * MT_TOOL types
+ */
+#define MT_TOOL_FINGER 0
+#define MT_TOOL_PEN 1
+#define MT_TOOL_PALM 2
+#define MT_TOOL_MAX 2
+
+/*
+ * Values describing the status of a force-feedback effect
+ */
+#define FF_STATUS_STOPPED 0x00
+#define FF_STATUS_PLAYING 0x01
+#define FF_STATUS_MAX 0x01
+
+/*
+ * Structures used in ioctls to upload effects to a device
+ * They are pieces of a bigger structure (called ff_effect)
+ */
+
+/*
+ * All duration values are expressed in ms. Values above 32767 ms (0x7fff)
+ * should not be used and have unspecified results.
+ */
+
+/**
+ * struct ff_replay - defines scheduling of the force-feedback effect
+ * @length: duration of the effect
+ * @delay: delay before effect should start playing
+ */
+struct ff_replay {
+ __u16 length;
+ __u16 delay;
+};
+
+/**
+ * struct ff_trigger - defines what triggers the force-feedback effect
+ * @button: number of the button triggering the effect
+ * @interval: controls how soon the effect can be re-triggered
+ */
+struct ff_trigger {
+ __u16 button;
+ __u16 interval;
+};
+
+/**
+ * struct ff_envelope - generic force-feedback effect envelope
+ * @attack_length: duration of the attack (ms)
+ * @attack_level: level at the beginning of the attack
+ * @fade_length: duration of fade (ms)
+ * @fade_level: level at the end of fade
+ *
+ * The @attack_level and @fade_level are absolute values; when applying
+ * envelope force-feedback core will convert to positive/negative
+ * value based on polarity of the default level of the effect.
+ * Valid range for the attack and fade levels is 0x0000 - 0x7fff
+ */
+struct ff_envelope {
+ __u16 attack_length;
+ __u16 attack_level;
+ __u16 fade_length;
+ __u16 fade_level;
+};
+
+/**
+ * struct ff_constant_effect - defines parameters of a constant force-feedback effect
+ * @level: strength of the effect; may be negative
+ * @envelope: envelope data
+ */
+struct ff_constant_effect {
+ __s16 level;
+ struct ff_envelope envelope;
+};
+
+/**
+ * struct ff_ramp_effect - defines parameters of a ramp force-feedback effect
+ * @start_level: beginning strength of the effect; may be negative
+ * @end_level: final strength of the effect; may be negative
+ * @envelope: envelope data
+ */
+struct ff_ramp_effect {
+ __s16 start_level;
+ __s16 end_level;
+ struct ff_envelope envelope;
+};
+
+/**
+ * struct ff_condition_effect - defines a spring or friction force-feedback effect
+ * @right_saturation: maximum level when joystick moved all way to the right
+ * @left_saturation: same for the left side
+ * @right_coeff: controls how fast the force grows when the joystick moves
+ * to the right
+ * @left_coeff: same for the left side
+ * @deadband: size of the dead zone, where no force is produced
+ * @center: position of the dead zone
+ */
+struct ff_condition_effect {
+ __u16 right_saturation;
+ __u16 left_saturation;
+
+ __s16 right_coeff;
+ __s16 left_coeff;
+
+ __u16 deadband;
+ __s16 center;
+};
+
+/**
+ * struct ff_periodic_effect - defines parameters of a periodic force-feedback effect
+ * @waveform: kind of the effect (wave)
+ * @period: period of the wave (ms)
+ * @magnitude: peak value
+ * @offset: mean value of the wave (roughly)
+ * @phase: 'horizontal' shift
+ * @envelope: envelope data
+ * @custom_len: number of samples (FF_CUSTOM only)
+ * @custom_data: buffer of samples (FF_CUSTOM only)
+ *
+ * Known waveforms - FF_SQUARE, FF_TRIANGLE, FF_SINE, FF_SAW_UP,
+ * FF_SAW_DOWN, FF_CUSTOM. The exact syntax FF_CUSTOM is undefined
+ * for the time being as no driver supports it yet.
+ *
+ * Note: the data pointed by custom_data is copied by the driver.
+ * You can therefore dispose of the memory after the upload/update.
+ */
+struct ff_periodic_effect {
+ __u16 waveform;
+ __u16 period;
+ __s16 magnitude;
+ __s16 offset;
+ __u16 phase;
+
+ struct ff_envelope envelope;
+
+ __u32 custom_len;
+ __s16 *custom_data;
+};
+
+/**
+ * struct ff_rumble_effect - defines parameters of a periodic force-feedback effect
+ * @strong_magnitude: magnitude of the heavy motor
+ * @weak_magnitude: magnitude of the light one
+ *
+ * Some rumble pads have two motors of different weight. Strong_magnitude
+ * represents the magnitude of the vibration generated by the heavy one.
+ */
+struct ff_rumble_effect {
+ __u16 strong_magnitude;
+ __u16 weak_magnitude;
+};
+
+/**
+ * struct ff_effect - defines force feedback effect
+ * @type: type of the effect (FF_CONSTANT, FF_PERIODIC, FF_RAMP, FF_SPRING,
+ * FF_FRICTION, FF_DAMPER, FF_RUMBLE, FF_INERTIA, or FF_CUSTOM)
+ * @id: an unique id assigned to an effect
+ * @direction: direction of the effect
+ * @trigger: trigger conditions (struct ff_trigger)
+ * @replay: scheduling of the effect (struct ff_replay)
+ * @u: effect-specific structure (one of ff_constant_effect, ff_ramp_effect,
+ * ff_periodic_effect, ff_condition_effect, ff_rumble_effect) further
+ * defining effect parameters
+ *
+ * This structure is sent through ioctl from the application to the driver.
+ * To create a new effect application should set its @id to -1; the kernel
+ * will return assigned @id which can later be used to update or delete
+ * this effect.
+ *
+ * Direction of the effect is encoded as follows:
+ * 0 deg -> 0x0000 (down)
+ * 90 deg -> 0x4000 (left)
+ * 180 deg -> 0x8000 (up)
+ * 270 deg -> 0xC000 (right)
+ */
+struct ff_effect {
+ __u16 type;
+ __s16 id;
+ __u16 direction;
+ struct ff_trigger trigger;
+ struct ff_replay replay;
+
+ union {
+ struct ff_constant_effect constant;
+ struct ff_ramp_effect ramp;
+ struct ff_periodic_effect periodic;
+ struct ff_condition_effect condition[2]; /* One for each axis */
+ struct ff_rumble_effect rumble;
+ } u;
+};
+
+/*
+ * Force feedback effect types
+ */
+
+#define FF_RUMBLE 0x50
+#define FF_PERIODIC 0x51
+#define FF_CONSTANT 0x52
+#define FF_SPRING 0x53
+#define FF_FRICTION 0x54
+#define FF_DAMPER 0x55
+#define FF_INERTIA 0x56
+#define FF_RAMP 0x57
+
+#define FF_EFFECT_MIN FF_RUMBLE
+#define FF_EFFECT_MAX FF_RAMP
+
+/*
+ * Force feedback periodic effect types
+ */
+
+#define FF_SQUARE 0x58
+#define FF_TRIANGLE 0x59
+#define FF_SINE 0x5a
+#define FF_SAW_UP 0x5b
+#define FF_SAW_DOWN 0x5c
+#define FF_CUSTOM 0x5d
+
+#define FF_WAVEFORM_MIN FF_SQUARE
+#define FF_WAVEFORM_MAX FF_CUSTOM
+
+/*
+ * Set ff device properties
+ */
+
+#define FF_GAIN 0x60
+#define FF_AUTOCENTER 0x61
+
+#define FF_MAX 0x7f
+#define FF_CNT (FF_MAX+1)
+
+#endif /* _INPUT_H */
diff --git a/rcm-server-main.c b/rcm-server-main.c
index 5d9cb20..294510c 100644
--- a/rcm-server-main.c
+++ b/rcm-server-main.c
@@ -7,9 +7,14 @@
#include <string.h>
#include <systemd/sd-bus.h>
#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <linux/input.h>
#include "utils.h"
#include "shared.h"
+#include "linux-input-keycodes.h"
#include "rcm-server-main.h"
#include "rcm-server-keymap.h"
@@ -692,6 +697,96 @@ remove_device(struct manager *mgr, struct udev_device *udev)
}
}
+static int
+evdev_read(sd_event_source *s, int fd, uint32_t revents, void *userdata)
+{
+ struct device *device = userdata;
+ struct input_event ev;
+ static const char *keycode_str = NULL;
+ static uint32_t keycode = KEY_RESERVED;
+ static uint32_t scancode;
+ static bool scancode_recv = false;
+ static bool pressed = false;
+ unsigned i;
+
+ if (fd != device->evdev_fd)
+ fprintf(stderr, "evdev fd mismatch: %i != %i\n", device->evdev_fd, fd);
+
+ if (revents & EPOLLHUP) {
+ fprintf(stderr, "evdev connection closed!\n");
+ close(fd);
+ device->evdev_fd = -1;
+ return 0;
+ }
+
+ if (!(revents & EPOLLIN)) {
+ fprintf(stderr, "unexpected evdev event: %" PRIu32 "\n", revents);
+ return 0;
+ }
+
+ while (read(fd, &ev, sizeof(ev)) == sizeof(ev)) {
+ switch (ev.type) {
+ case EV_KEY:
+ if (keycode != KEY_RESERVED)
+ printf("Reading from evdev - multiple keycodes?\n");
+
+ for (i = 0; linux_input_keycodes[i].name; i++) {
+ if (linux_input_keycodes[i].value == ev.code)
+ break;
+ }
+
+ if (!linux_input_keycodes[i].name) {
+ printf("evdev - unknown keycode (%u)\n", ev.code);
+ break;
+ }
+
+ keycode_str = linux_input_keycodes[i].name;
+ keycode = ev.code;
+ pressed = ev.value ? true : false;
+ break;
+
+ case EV_MSC:
+ if (ev.code == MSC_SCAN) {
+ if (scancode_recv)
+ printf("Reading from evdev - multiple scancodes?\n");
+ scancode_recv = true;
+ scancode = ev.value;
+ }
+ break;
+
+ case EV_SYN:
+ if (keycode != KEY_RESERVED || scancode_recv) {
+ printf("evdev event -");
+ if (keycode != KEY_RESERVED)
+ printf(" keycode %s (%u) %s",
+ keycode_str, keycode,
+ pressed ? "pressed" : "released");
+ if (scancode_recv)
+ printf(" scancode 0x%08x", scancode);
+ printf("\n");
+
+ if (keycode != KEY_RESERVED)
+ sd_bus_emit_signal(device->mgr->bus,
+ device->path,
+ "org.gnome.RemoteControlManager.Device",
+ pressed ? "KeyPressed" : "KeyReleased",
+ "s", keycode_str);
+ }
+
+ keycode = KEY_RESERVED;
+ keycode_str = NULL;
+ scancode_recv = false;
+ pressed = false;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ return 0;
+}
+
static void
add_device(struct manager *mgr, struct udev_device *udev)
{
@@ -717,9 +812,10 @@ add_device(struct manager *mgr, struct udev_device *udev)
}
list_init(&device->keymaps);
+ device->mgr = mgr;
device->path = path;
device->name = device->path + strlen("/org/gnome/RemoteControlManager/");
- device->devnode = NULL;
+ device->evdev_fd = -1;
if (keymaps_load(device) < 0) {
fprintf(stderr, "failed to load keymaps: %m\n");
@@ -751,12 +847,34 @@ add_device(struct manager *mgr, struct udev_device *udev)
}
devnode = udev_device_get_devnode(evdev);
- if (devnode && !device->devnode) {
- device->devnode = strdup(devnode);
- if (!device->devnode)
- printf("Failed to strdup devnode\n");
- else
- printf("Devnode is %s\n", device->devnode);
+ if (!devnode) {
+ printf("Failed to determine evdev devnode\n");
+ udev_device_unref(evdev);
+ continue;
+ }
+
+ if (device->evdev_fd >= 0) {
+ printf("Multiple evdev devices!?\n");
+ udev_device_unref(evdev);
+ continue;
+ }
+
+ device->evdev_fd = open(devnode, O_RDONLY | O_NONBLOCK);
+ if (device->evdev_fd < 0) {
+ printf("Failed to open evdev device %s: %s\n",
+ devnode, strerror(errno));
+ udev_device_unref(evdev);
+ continue;
+ }
+
+ if (sd_event_add_io(mgr->event, &device->evdev_ev,
+ device->evdev_fd, EPOLLIN, evdev_read, device) < 0) {
+ printf("Failed to add event source for evdev device %s: %s\n",
+ devnode, strerror(errno));
+ close(device->evdev_fd);
+ device->evdev_fd = -1;
+ udev_device_unref(evdev);
+ continue;
}
udev_device_unref(evdev);
@@ -788,7 +906,8 @@ add_device(struct manager *mgr, struct udev_device *udev)
printf("\tAction : %s\n", udev_device_get_action(udev));
printf("\tDriver : %s\n", device->driver_name);
printf("\tKernel map: %s\n", device->keymap_name);
- printf("\tDevnode : %s\n", device->devnode);
+ printf("\tDevnode fd: %i\n", device->evdev_fd);
+ printf("\tDBUS path : %s\n", device->path);
printf("\tProtocols : %s\n",
udev_device_get_sysattr_value(udev, "protocols"));
diff --git a/rcm-server-main.h b/rcm-server-main.h
index 60b2968..4455ad8 100644
--- a/rcm-server-main.h
+++ b/rcm-server-main.h
@@ -6,7 +6,9 @@ struct device {
char *path;
char *driver_name;
char *keymap_name;
- char *devnode;
+ int evdev_fd;
+ sd_event_source *evdev_ev;
+ struct manager *mgr;
struct list_head list;
struct list_head keymaps;
};
diff --git a/tools/generate-input-keycodes.sh b/tools/generate-input-keycodes.sh
index 51d09e8..988940d 100755
--- a/tools/generate-input-keycodes.sh
+++ b/tools/generate-input-keycodes.sh
@@ -1,43 +1,55 @@
#!/bin/bash
+set -e
+
INPUT_HEADER="/usr/include/linux/input.h"
-OUTPUT_ENUM="linux-input-enum.h"
-OUTPUT_MAP="linux-input-keycodes.h"
+LOCAL_INPUT_HEADER="linux-input.h"
+OUTPUT_MAPH="linux-input-keycodes.h"
+OUTPUT_MAPC="linux-input-keycodes.c"
SKIP="KEY_MIN_INTERESTING KEY_MAX KEY_CNT"
-if [ ! -e "$INPUT_HEADER" ]; then
- echo "Can't find input header: $INPUT_HEADER" >&2
- exit 1
-fi
-
-cat > "$OUTPUT_ENUM" <<EOF
-#ifndef foolinuxinputenumhfoo
-#define foolinuximputenumhfoo
-
-/* AUTOGENERATED: DO NOT EDIT */
+if [ ! -e "$LOCAL_INPUT_HEADER" ]; then
+ if [ ! -e "$INPUT_HEADER" ]; then
+ echo "Can't find input header: $INPUT_HEADER" >&2
+ exit 1
+ fi
-enum linux_input_keyval {
-EOF
+ cp "$INPUT_HEADER" "$LOCAL_INPUT_HEADER"
+fi
-cat > "$OUTPUT_MAP" <<EOF
+cat > "$OUTPUT_MAPH" <<EOF
#ifndef foolinuxinputkeycodesfoo
#define foolinuxinputkeycodesfoo
/* AUTOGENERATED: DO NOT EDIT */
-#include "$OUTPUT_ENUM"
+#include <unistd.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include "$LOCAL_INPUT_HEADER"
struct linux_input_keycode {
const char *name;
- enum linux_input_keyval value;
+ uint32_t value;
bool alias;
void *cairo_surface;
};
+extern struct linux_input_keycode linux_input_keycodes[];
+
+#endif
+EOF
+
+cat > "$OUTPUT_MAPC" << EOF
+/* AUTOGENERATED: DO NOT EDIT */
+
+#include "$LOCAL_INPUT_HEADER"
+#include "$OUTPUT_MAPH"
+
struct linux_input_keycode linux_input_keycodes[] = {
EOF
-cat "$INPUT_HEADER" | grep "^#define[[:space:]]*KEY_" | while read DEF NAME VALUE COMMENTS; do
+cat "$LOCAL_INPUT_HEADER" | grep "^#define[[:space:]]*KEY_" | while read DEF NAME VALUE COMMENTS; do
for WORD in $SKIP; do
if [ "$NAME" = "$WORD" ]; then
continue
@@ -50,22 +62,14 @@ cat "$INPUT_HEADER" | grep "^#define[[:space:]]*KEY_" | while read DEF NAME VALU
ALIAS="false"
fi
- echo " $NAME = $VALUE," >> "$OUTPUT_ENUM"
- echo " { \"$NAME\", $NAME, $ALIAS, NULL }," >> "$OUTPUT_MAP"
+ echo " { \"$NAME\", $NAME, $ALIAS, NULL }," >> "$OUTPUT_MAPC"
done
-cat >> "$OUTPUT_ENUM" << EOF
-};
-#endif
-EOF
-
-cat >> "$OUTPUT_MAP" << EOF
+cat >> "$OUTPUT_MAPC" << EOF
{ NULL, 0, false, NULL }
};
-#endif
EOF
-
exit 0