From f14b68202c933a91f49315a8adaaa7992259aa1f Mon Sep 17 00:00:00 2001 From: Christian Helmuth Date: Fri, 24 Jun 2022 08:37:50 +0200 Subject: [PATCH] dde_linux: shadow evdev.c and use event C API Fixes #4543 --- repos/dde_linux/src/include/lx_emul/event.h | 30 ++ repos/dde_linux/src/lib/lx_emul/event.cc | 468 ++++++++++++++++++ .../lib/lx_emul/shadow/drivers/input/evdev.c | 209 ++++++++ 3 files changed, 707 insertions(+) create mode 100644 repos/dde_linux/src/include/lx_emul/event.h create mode 100644 repos/dde_linux/src/lib/lx_emul/event.cc create mode 100644 repos/dde_linux/src/lib/lx_emul/shadow/drivers/input/evdev.c diff --git a/repos/dde_linux/src/include/lx_emul/event.h b/repos/dde_linux/src/include/lx_emul/event.h new file mode 100644 index 0000000000..2487a748ac --- /dev/null +++ b/repos/dde_linux/src/include/lx_emul/event.h @@ -0,0 +1,30 @@ +/* + * \brief Lx_emul support for input events + * \author Christian Helmuth + * \date 2022-06-24 + */ + +/* + * Copyright (C) 2022 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +#ifndef _LX_EMUL__EVENT_H_ +#define _LX_EMUL__EVENT_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Translate keycodes from Linux to Genode to prevent future incompatibilities + */ +extern unsigned lx_emul_event_keycode(unsigned linux_keycode); + +#ifdef __cplusplus +} +#endif + +#endif /* _LX_EMUL__USB_H_ */ diff --git a/repos/dde_linux/src/lib/lx_emul/event.cc b/repos/dde_linux/src/lib/lx_emul/event.cc new file mode 100644 index 0000000000..48652774a9 --- /dev/null +++ b/repos/dde_linux/src/lib/lx_emul/event.cc @@ -0,0 +1,468 @@ +/* + * \brief Lx_emul support for input events + * \author Christian Helmuth + * \date 2022-06-24 + */ + +/* + * Copyright (C) 2022 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +#include +#include + +#include + +/* + * Input keycodes duplicated from input/keycodes.h as Genode enums and Linux + * macro definitions collide on direct inclusion. + */ +#define GENODE_INPUT_KEYCODES \ + GENODE_TAG_VALUE(KEY_RESERVED, 0) \ + GENODE_TAG_VALUE(KEY_ESC, 1) \ + GENODE_TAG_VALUE(KEY_1, 2) \ + GENODE_TAG_VALUE(KEY_2, 3) \ + GENODE_TAG_VALUE(KEY_3, 4) \ + GENODE_TAG_VALUE(KEY_4, 5) \ + GENODE_TAG_VALUE(KEY_5, 6) \ + GENODE_TAG_VALUE(KEY_6, 7) \ + GENODE_TAG_VALUE(KEY_7, 8) \ + GENODE_TAG_VALUE(KEY_8, 9) \ + GENODE_TAG_VALUE(KEY_9, 10) \ + GENODE_TAG_VALUE(KEY_0, 11) \ + GENODE_TAG_VALUE(KEY_MINUS, 12) \ + GENODE_TAG_VALUE(KEY_EQUAL, 13) \ + GENODE_TAG_VALUE(KEY_BACKSPACE, 14) \ + GENODE_TAG_VALUE(KEY_TAB, 15) \ + GENODE_TAG_VALUE(KEY_Q, 16) \ + GENODE_TAG_VALUE(KEY_W, 17) \ + GENODE_TAG_VALUE(KEY_E, 18) \ + GENODE_TAG_VALUE(KEY_R, 19) \ + GENODE_TAG_VALUE(KEY_T, 20) \ + GENODE_TAG_VALUE(KEY_Y, 21) \ + GENODE_TAG_VALUE(KEY_U, 22) \ + GENODE_TAG_VALUE(KEY_I, 23) \ + GENODE_TAG_VALUE(KEY_O, 24) \ + GENODE_TAG_VALUE(KEY_P, 25) \ + GENODE_TAG_VALUE(KEY_LEFTBRACE, 26) \ + GENODE_TAG_VALUE(KEY_RIGHTBRACE, 27) \ + GENODE_TAG_VALUE(KEY_ENTER, 28) \ + GENODE_TAG_VALUE(KEY_LEFTCTRL, 29) \ + GENODE_TAG_VALUE(KEY_A, 30) \ + GENODE_TAG_VALUE(KEY_S, 31) \ + GENODE_TAG_VALUE(KEY_D, 32) \ + GENODE_TAG_VALUE(KEY_F, 33) \ + GENODE_TAG_VALUE(KEY_G, 34) \ + GENODE_TAG_VALUE(KEY_H, 35) \ + GENODE_TAG_VALUE(KEY_J, 36) \ + GENODE_TAG_VALUE(KEY_K, 37) \ + GENODE_TAG_VALUE(KEY_L, 38) \ + GENODE_TAG_VALUE(KEY_SEMICOLON, 39) \ + GENODE_TAG_VALUE(KEY_APOSTROPHE, 40) \ + GENODE_TAG_VALUE(KEY_GRAVE, 41) \ + GENODE_TAG_VALUE(KEY_LEFTSHIFT, 42) \ + GENODE_TAG_VALUE(KEY_BACKSLASH, 43) \ + GENODE_TAG_VALUE(KEY_Z, 44) \ + GENODE_TAG_VALUE(KEY_X, 45) \ + GENODE_TAG_VALUE(KEY_C, 46) \ + GENODE_TAG_VALUE(KEY_V, 47) \ + GENODE_TAG_VALUE(KEY_B, 48) \ + GENODE_TAG_VALUE(KEY_N, 49) \ + GENODE_TAG_VALUE(KEY_M, 50) \ + GENODE_TAG_VALUE(KEY_COMMA, 51) \ + GENODE_TAG_VALUE(KEY_DOT, 52) \ + GENODE_TAG_VALUE(KEY_SLASH, 53) \ + GENODE_TAG_VALUE(KEY_RIGHTSHIFT, 54) \ + GENODE_TAG_VALUE(KEY_KPASTERISK, 55) \ + GENODE_TAG_VALUE(KEY_LEFTALT, 56) \ + GENODE_TAG_VALUE(KEY_SPACE, 57) \ + GENODE_TAG_VALUE(KEY_CAPSLOCK, 58) \ + GENODE_TAG_VALUE(KEY_F1, 59) \ + GENODE_TAG_VALUE(KEY_F2, 60) \ + GENODE_TAG_VALUE(KEY_F3, 61) \ + GENODE_TAG_VALUE(KEY_F4, 62) \ + GENODE_TAG_VALUE(KEY_F5, 63) \ + GENODE_TAG_VALUE(KEY_F6, 64) \ + GENODE_TAG_VALUE(KEY_F7, 65) \ + GENODE_TAG_VALUE(KEY_F8, 66) \ + GENODE_TAG_VALUE(KEY_F9, 67) \ + GENODE_TAG_VALUE(KEY_F10, 68) \ + GENODE_TAG_VALUE(KEY_NUMLOCK, 69) \ + GENODE_TAG_VALUE(KEY_SCROLLLOCK, 70) \ + GENODE_TAG_VALUE(KEY_KP7, 71) \ + GENODE_TAG_VALUE(KEY_KP8, 72) \ + GENODE_TAG_VALUE(KEY_KP9, 73) \ + GENODE_TAG_VALUE(KEY_KPMINUS, 74) \ + GENODE_TAG_VALUE(KEY_KP4, 75) \ + GENODE_TAG_VALUE(KEY_KP5, 76) \ + GENODE_TAG_VALUE(KEY_KP6, 77) \ + GENODE_TAG_VALUE(KEY_KPPLUS, 78) \ + GENODE_TAG_VALUE(KEY_KP1, 79) \ + GENODE_TAG_VALUE(KEY_KP2, 80) \ + GENODE_TAG_VALUE(KEY_KP3, 81) \ + GENODE_TAG_VALUE(KEY_KP0, 82) \ + GENODE_TAG_VALUE(KEY_KPDOT, 83) \ + \ + GENODE_TAG_VALUE(KEY_ZENKAKUHANKAKU, 85) \ + GENODE_TAG_VALUE(KEY_102ND, 86) \ + GENODE_TAG_VALUE(KEY_F11, 87) \ + GENODE_TAG_VALUE(KEY_F12, 88) \ + GENODE_TAG_VALUE(KEY_RO, 89) \ + GENODE_TAG_VALUE(KEY_KATAKANA, 90) \ + GENODE_TAG_VALUE(KEY_HIRAGANA, 91) \ + GENODE_TAG_VALUE(KEY_HENKAN, 92) \ + GENODE_TAG_VALUE(KEY_KATAKANAHIRAGANA, 93) \ + GENODE_TAG_VALUE(KEY_MUHENKAN, 94) \ + GENODE_TAG_VALUE(KEY_KPJPCOMMA, 95) \ + GENODE_TAG_VALUE(KEY_KPENTER, 96) \ + GENODE_TAG_VALUE(KEY_RIGHTCTRL, 97) \ + GENODE_TAG_VALUE(KEY_KPSLASH, 98) \ + GENODE_TAG_VALUE(KEY_SYSRQ, 99) \ + GENODE_TAG_VALUE(KEY_RIGHTALT, 100) \ + GENODE_TAG_VALUE(KEY_LINEFEED, 101) \ + GENODE_TAG_VALUE(KEY_HOME, 102) \ + GENODE_TAG_VALUE(KEY_UP, 103) \ + GENODE_TAG_VALUE(KEY_PAGEUP, 104) \ + GENODE_TAG_VALUE(KEY_LEFT, 105) \ + GENODE_TAG_VALUE(KEY_RIGHT, 106) \ + GENODE_TAG_VALUE(KEY_END, 107) \ + GENODE_TAG_VALUE(KEY_DOWN, 108) \ + GENODE_TAG_VALUE(KEY_PAGEDOWN, 109) \ + GENODE_TAG_VALUE(KEY_INSERT, 110) \ + GENODE_TAG_VALUE(KEY_DELETE, 111) \ + GENODE_TAG_VALUE(KEY_MACRO, 112) \ + GENODE_TAG_VALUE(KEY_MUTE, 113) \ + GENODE_TAG_VALUE(KEY_VOLUMEDOWN, 114) \ + GENODE_TAG_VALUE(KEY_VOLUMEUP, 115) \ + GENODE_TAG_VALUE(KEY_POWER, 116) \ + GENODE_TAG_VALUE(KEY_KPEQUAL, 117) \ + GENODE_TAG_VALUE(KEY_KPPLUSMINUS, 118) \ + GENODE_TAG_VALUE(KEY_PAUSE, 119) \ + \ + GENODE_TAG_VALUE(KEY_KPCOMMA, 121) \ + GENODE_TAG_VALUE(KEY_HANGUEL, 122) \ + GENODE_TAG_VALUE(KEY_HANJA, 123) \ + GENODE_TAG_VALUE(KEY_YEN, 124) \ + GENODE_TAG_VALUE(KEY_LEFTMETA, 125) \ + GENODE_TAG_VALUE(KEY_RIGHTMETA, 126) \ + GENODE_TAG_VALUE(KEY_COMPOSE, 127) \ + \ + GENODE_TAG_VALUE(KEY_STOP, 128) \ + GENODE_TAG_VALUE(KEY_AGAIN, 129) \ + GENODE_TAG_VALUE(KEY_PROPS, 130) \ + GENODE_TAG_VALUE(KEY_UNDO, 131) \ + GENODE_TAG_VALUE(KEY_FRONT, 132) \ + GENODE_TAG_VALUE(KEY_COPY, 133) \ + GENODE_TAG_VALUE(KEY_OPEN, 134) \ + GENODE_TAG_VALUE(KEY_PASTE, 135) \ + GENODE_TAG_VALUE(KEY_FIND, 136) \ + GENODE_TAG_VALUE(KEY_CUT, 137) \ + GENODE_TAG_VALUE(KEY_HELP, 138) \ + GENODE_TAG_VALUE(KEY_MENU, 139) \ + GENODE_TAG_VALUE(KEY_CALC, 140) \ + GENODE_TAG_VALUE(KEY_SETUP, 141) \ + GENODE_TAG_VALUE(KEY_SLEEP, 142) \ + GENODE_TAG_VALUE(KEY_WAKEUP, 143) \ + GENODE_TAG_VALUE(KEY_FILE, 144) \ + GENODE_TAG_VALUE(KEY_SENDFILE, 145) \ + GENODE_TAG_VALUE(KEY_DELETEFILE, 146) \ + GENODE_TAG_VALUE(KEY_XFER, 147) \ + GENODE_TAG_VALUE(KEY_PROG1, 148) \ + GENODE_TAG_VALUE(KEY_PROG2, 149) \ + GENODE_TAG_VALUE(KEY_WWW, 150) \ + GENODE_TAG_VALUE(KEY_MSDOS, 151) \ + GENODE_TAG_VALUE(KEY_SCREENLOCK, 152) \ + GENODE_TAG_VALUE(KEY_DIRECTION, 153) \ + GENODE_TAG_VALUE(KEY_CYCLEWINDOWS, 154) \ + GENODE_TAG_VALUE(KEY_MAIL, 155) \ + GENODE_TAG_VALUE(KEY_BOOKMARKS, 156) \ + GENODE_TAG_VALUE(KEY_COMPUTER, 157) \ + GENODE_TAG_VALUE(KEY_BACK, 158) \ + GENODE_TAG_VALUE(KEY_FORWARD, 159) \ + GENODE_TAG_VALUE(KEY_CLOSECD, 160) \ + GENODE_TAG_VALUE(KEY_EJECTCD, 161) \ + GENODE_TAG_VALUE(KEY_EJECTCLOSECD, 162) \ + GENODE_TAG_VALUE(KEY_NEXTSONG, 163) \ + GENODE_TAG_VALUE(KEY_PLAYPAUSE, 164) \ + GENODE_TAG_VALUE(KEY_PREVIOUSSONG, 165) \ + GENODE_TAG_VALUE(KEY_STOPCD, 166) \ + GENODE_TAG_VALUE(KEY_RECORD, 167) \ + GENODE_TAG_VALUE(KEY_REWIND, 168) \ + GENODE_TAG_VALUE(KEY_PHONE, 169) \ + GENODE_TAG_VALUE(KEY_ISO, 170) \ + GENODE_TAG_VALUE(KEY_CONFIG, 171) \ + GENODE_TAG_VALUE(KEY_HOMEPAGE, 172) \ + GENODE_TAG_VALUE(KEY_REFRESH, 173) \ + GENODE_TAG_VALUE(KEY_EXIT, 174) \ + GENODE_TAG_VALUE(KEY_MOVE, 175) \ + GENODE_TAG_VALUE(KEY_EDIT, 176) \ + GENODE_TAG_VALUE(KEY_SCROLLUP, 177) \ + GENODE_TAG_VALUE(KEY_SCROLLDOWN, 178) \ + GENODE_TAG_VALUE(KEY_KPLEFTPAREN, 179) \ + GENODE_TAG_VALUE(KEY_KPRIGHTPAREN, 180) \ + GENODE_TAG_VALUE(KEY_NEW, 181) \ + GENODE_TAG_VALUE(KEY_REDO, 182) \ + \ + GENODE_TAG_VALUE(KEY_F13, 183) \ + GENODE_TAG_VALUE(KEY_F14, 184) \ + GENODE_TAG_VALUE(KEY_F15, 185) \ + GENODE_TAG_VALUE(KEY_F16, 186) \ + GENODE_TAG_VALUE(KEY_F17, 187) \ + GENODE_TAG_VALUE(KEY_F18, 188) \ + GENODE_TAG_VALUE(KEY_F19, 189) \ + GENODE_TAG_VALUE(KEY_F20, 190) \ + GENODE_TAG_VALUE(KEY_F21, 191) \ + GENODE_TAG_VALUE(KEY_F22, 192) \ + GENODE_TAG_VALUE(KEY_F23, 193) \ + GENODE_TAG_VALUE(KEY_F24, 194) \ + \ + GENODE_TAG_VALUE(KEY_PLAYCD, 200) \ + GENODE_TAG_VALUE(KEY_PAUSECD, 201) \ + GENODE_TAG_VALUE(KEY_PROG3, 202) \ + GENODE_TAG_VALUE(KEY_PROG4, 203) \ + GENODE_TAG_VALUE(KEY_DASHBOARD, 204) \ + GENODE_TAG_VALUE(KEY_SUSPEND, 205) \ + GENODE_TAG_VALUE(KEY_CLOSE, 206) \ + GENODE_TAG_VALUE(KEY_PLAY, 207) \ + GENODE_TAG_VALUE(KEY_FASTFORWARD, 208) \ + GENODE_TAG_VALUE(KEY_BASSBOOST, 209) \ + GENODE_TAG_VALUE(KEY_PRINT, 210) \ + GENODE_TAG_VALUE(KEY_HP, 211) \ + GENODE_TAG_VALUE(KEY_CAMERA, 212) \ + GENODE_TAG_VALUE(KEY_SOUND, 213) \ + GENODE_TAG_VALUE(KEY_QUESTION, 214) \ + GENODE_TAG_VALUE(KEY_EMAIL, 215) \ + GENODE_TAG_VALUE(KEY_CHAT, 216) \ + GENODE_TAG_VALUE(KEY_SEARCH, 217) \ + GENODE_TAG_VALUE(KEY_CONNECT, 218) \ + GENODE_TAG_VALUE(KEY_FINANCE, 219) \ + GENODE_TAG_VALUE(KEY_SPORT, 220) \ + GENODE_TAG_VALUE(KEY_SHOP, 221) \ + GENODE_TAG_VALUE(KEY_ALTERASE, 222) \ + GENODE_TAG_VALUE(KEY_CANCEL, 223) \ + GENODE_TAG_VALUE(KEY_BRIGHTNESSDOWN, 224) \ + GENODE_TAG_VALUE(KEY_BRIGHTNESSUP, 225) \ + GENODE_TAG_VALUE(KEY_MEDIA, 226) \ + GENODE_TAG_VALUE(KEY_SWITCHVIDEOMODE, 227) \ + GENODE_TAG_VALUE(KEY_KBDILLUMTOGGLE, 228) \ + GENODE_TAG_VALUE(KEY_KBDILLUMDOWN, 229) \ + GENODE_TAG_VALUE(KEY_KBDILLUMUP, 230) \ + GENODE_TAG_VALUE(KEY_SEND, 231) \ + GENODE_TAG_VALUE(KEY_REPLY, 232) \ + GENODE_TAG_VALUE(KEY_FORWARDMAIL, 233) \ + GENODE_TAG_VALUE(KEY_SAVE, 234) \ + GENODE_TAG_VALUE(KEY_DOCUMENTS, 235) \ + GENODE_TAG_VALUE(KEY_BATTERY, 236) \ + GENODE_TAG_VALUE(KEY_BLUETOOTH, 237) \ + GENODE_TAG_VALUE(KEY_WLAN, 238) \ + \ + GENODE_TAG_VALUE(BTN_0, 0x100) \ + GENODE_TAG_VALUE(BTN_1, 0x101) \ + GENODE_TAG_VALUE(BTN_2, 0x102) \ + GENODE_TAG_VALUE(BTN_3, 0x103) \ + GENODE_TAG_VALUE(BTN_4, 0x104) \ + GENODE_TAG_VALUE(BTN_5, 0x105) \ + GENODE_TAG_VALUE(BTN_6, 0x106) \ + GENODE_TAG_VALUE(BTN_7, 0x107) \ + GENODE_TAG_VALUE(BTN_8, 0x108) \ + GENODE_TAG_VALUE(BTN_9, 0x109) \ + \ + GENODE_TAG_VALUE(BTN_LEFT, 0x110) \ + GENODE_TAG_VALUE(BTN_RIGHT, 0x111) \ + GENODE_TAG_VALUE(BTN_MIDDLE, 0x112) \ + GENODE_TAG_VALUE(BTN_SIDE, 0x113) \ + GENODE_TAG_VALUE(BTN_EXTRA, 0x114) \ + GENODE_TAG_VALUE(BTN_FORWARD, 0x115) \ + GENODE_TAG_VALUE(BTN_BACK, 0x116) \ + GENODE_TAG_VALUE(BTN_TASK, 0x117) \ + \ + GENODE_TAG_VALUE(BTN_TRIGGER, 0x120) \ + GENODE_TAG_VALUE(BTN_THUMB, 0x121) \ + GENODE_TAG_VALUE(BTN_THUMB2, 0x122) \ + GENODE_TAG_VALUE(BTN_TOP, 0x123) \ + GENODE_TAG_VALUE(BTN_TOP2, 0x124) \ + GENODE_TAG_VALUE(BTN_PINKIE, 0x125) \ + GENODE_TAG_VALUE(BTN_BASE, 0x126) \ + GENODE_TAG_VALUE(BTN_BASE2, 0x127) \ + GENODE_TAG_VALUE(BTN_BASE3, 0x128) \ + GENODE_TAG_VALUE(BTN_BASE4, 0x129) \ + GENODE_TAG_VALUE(BTN_BASE5, 0x12a) \ + GENODE_TAG_VALUE(BTN_BASE6, 0x12b) \ + GENODE_TAG_VALUE(BTN_DEAD, 0x12f) \ + \ + GENODE_TAG_VALUE(BTN_A, 0x130) \ + GENODE_TAG_VALUE(BTN_B, 0x131) \ + GENODE_TAG_VALUE(BTN_C, 0x132) \ + GENODE_TAG_VALUE(BTN_X, 0x133) \ + GENODE_TAG_VALUE(BTN_Y, 0x134) \ + GENODE_TAG_VALUE(BTN_Z, 0x135) \ + GENODE_TAG_VALUE(BTN_TL, 0x136) \ + GENODE_TAG_VALUE(BTN_TR, 0x137) \ + GENODE_TAG_VALUE(BTN_TL2, 0x138) \ + GENODE_TAG_VALUE(BTN_TR2, 0x139) \ + GENODE_TAG_VALUE(BTN_SELECT, 0x13a) \ + GENODE_TAG_VALUE(BTN_START, 0x13b) \ + GENODE_TAG_VALUE(BTN_MODE, 0x13c) \ + GENODE_TAG_VALUE(BTN_THUMBL, 0x13d) \ + GENODE_TAG_VALUE(BTN_THUMBR, 0x13e) \ + \ + GENODE_TAG_VALUE(BTN_TOOL_PEN, 0x140) \ + GENODE_TAG_VALUE(BTN_TOOL_RUBBER, 0x141) \ + GENODE_TAG_VALUE(BTN_TOOL_BRUSH, 0x142) \ + GENODE_TAG_VALUE(BTN_TOOL_PENCIL, 0x143) \ + GENODE_TAG_VALUE(BTN_TOOL_AIRBRUSH, 0x144) \ + GENODE_TAG_VALUE(BTN_TOOL_FINGER, 0x145) \ + GENODE_TAG_VALUE(BTN_TOOL_MOUSE, 0x146) \ + GENODE_TAG_VALUE(BTN_TOOL_LENS, 0x147) \ + GENODE_TAG_VALUE(BTN_TOUCH, 0x14a) \ + GENODE_TAG_VALUE(BTN_STYLUS, 0x14b) \ + GENODE_TAG_VALUE(BTN_STYLUS2, 0x14c) \ + GENODE_TAG_VALUE(BTN_TOOL_DOUBLETAP, 0x14d) \ + GENODE_TAG_VALUE(BTN_TOOL_TRIPLETAP, 0x14e) \ + \ + GENODE_TAG_VALUE(BTN_GEAR_DOWN, 0x150) \ + GENODE_TAG_VALUE(BTN_GEAR_UP, 0x151) \ + \ + GENODE_TAG_VALUE(KEY_OK, 0x160) \ + GENODE_TAG_VALUE(KEY_SELECT, 0x161) \ + GENODE_TAG_VALUE(KEY_GOTO, 0x162) \ + GENODE_TAG_VALUE(KEY_CLEAR, 0x163) \ + GENODE_TAG_VALUE(KEY_POWER2, 0x164) \ + GENODE_TAG_VALUE(KEY_OPTION, 0x165) \ + GENODE_TAG_VALUE(KEY_INFO, 0x166) \ + GENODE_TAG_VALUE(KEY_TIME, 0x167) \ + GENODE_TAG_VALUE(KEY_VENDOR, 0x168) \ + GENODE_TAG_VALUE(KEY_ARCHIVE, 0x169) \ + GENODE_TAG_VALUE(KEY_PROGRAM, 0x16a) \ + GENODE_TAG_VALUE(KEY_CHANNEL, 0x16b) \ + GENODE_TAG_VALUE(KEY_FAVORITES, 0x16c) \ + GENODE_TAG_VALUE(KEY_EPG, 0x16d) \ + GENODE_TAG_VALUE(KEY_PVR, 0x16e) \ + GENODE_TAG_VALUE(KEY_MHP, 0x16f) \ + GENODE_TAG_VALUE(KEY_LANGUAGE, 0x170) \ + GENODE_TAG_VALUE(KEY_TITLE, 0x171) \ + GENODE_TAG_VALUE(KEY_SUBTITLE, 0x172) \ + GENODE_TAG_VALUE(KEY_ANGLE, 0x173) \ + GENODE_TAG_VALUE(KEY_ZOOM, 0x174) \ + GENODE_TAG_VALUE(KEY_MODE, 0x175) \ + GENODE_TAG_VALUE(KEY_KEYBOARD, 0x176) \ + GENODE_TAG_VALUE(KEY_SCREEN, 0x177) \ + GENODE_TAG_VALUE(KEY_PC, 0x178) \ + GENODE_TAG_VALUE(KEY_TV, 0x179) \ + GENODE_TAG_VALUE(KEY_TV2, 0x17a) \ + GENODE_TAG_VALUE(KEY_VCR, 0x17b) \ + GENODE_TAG_VALUE(KEY_VCR2, 0x17c) \ + GENODE_TAG_VALUE(KEY_SAT, 0x17d) \ + GENODE_TAG_VALUE(KEY_SAT2, 0x17e) \ + GENODE_TAG_VALUE(KEY_CD, 0x17f) \ + GENODE_TAG_VALUE(KEY_TAPE, 0x180) \ + GENODE_TAG_VALUE(KEY_RADIO, 0x181) \ + GENODE_TAG_VALUE(KEY_TUNER, 0x182) \ + GENODE_TAG_VALUE(KEY_PLAYER, 0x183) \ + GENODE_TAG_VALUE(KEY_TEXT, 0x184) \ + GENODE_TAG_VALUE(KEY_DVD, 0x185) \ + GENODE_TAG_VALUE(KEY_AUX, 0x186) \ + GENODE_TAG_VALUE(KEY_MP3, 0x187) \ + GENODE_TAG_VALUE(KEY_AUDIO, 0x188) \ + GENODE_TAG_VALUE(KEY_VIDEO, 0x189) \ + GENODE_TAG_VALUE(KEY_DIRECTORY, 0x18a) \ + GENODE_TAG_VALUE(KEY_LIST, 0x18b) \ + GENODE_TAG_VALUE(KEY_MEMO, 0x18c) \ + GENODE_TAG_VALUE(KEY_CALENDAR, 0x18d) \ + GENODE_TAG_VALUE(KEY_RED, 0x18e) \ + GENODE_TAG_VALUE(KEY_GREEN, 0x18f) \ + GENODE_TAG_VALUE(KEY_YELLOW, 0x190) \ + GENODE_TAG_VALUE(KEY_BLUE, 0x191) \ + GENODE_TAG_VALUE(KEY_CHANNELUP, 0x192) \ + GENODE_TAG_VALUE(KEY_CHANNELDOWN, 0x193) \ + GENODE_TAG_VALUE(KEY_FIRST, 0x194) \ + GENODE_TAG_VALUE(KEY_LAST, 0x195) \ + GENODE_TAG_VALUE(KEY_AB, 0x196) \ + GENODE_TAG_VALUE(KEY_NEXT, 0x197) \ + GENODE_TAG_VALUE(KEY_RESTART, 0x198) \ + GENODE_TAG_VALUE(KEY_SLOW, 0x199) \ + GENODE_TAG_VALUE(KEY_SHUFFLE, 0x19a) \ + GENODE_TAG_VALUE(KEY_BREAK, 0x19b) \ + GENODE_TAG_VALUE(KEY_PREVIOUS, 0x19c) \ + GENODE_TAG_VALUE(KEY_DIGITS, 0x19d) \ + GENODE_TAG_VALUE(KEY_TEEN, 0x19e) \ + GENODE_TAG_VALUE(KEY_TWEN, 0x19f) \ + GENODE_TAG_VALUE(KEY_VIDEOPHONE, 0x1a0) \ + GENODE_TAG_VALUE(KEY_GAMES, 0x1a1) \ + GENODE_TAG_VALUE(KEY_ZOOMIN, 0x1a2) \ + GENODE_TAG_VALUE(KEY_ZOOMOUT, 0x1a3) \ + GENODE_TAG_VALUE(KEY_ZOOMRESET, 0x1a4) \ + GENODE_TAG_VALUE(KEY_WORDPROCESSOR, 0x1a5) \ + GENODE_TAG_VALUE(KEY_EDITOR, 0x1a6) \ + GENODE_TAG_VALUE(KEY_SPREADSHEET, 0x1a7) \ + GENODE_TAG_VALUE(KEY_GRAPHICSEDITOR, 0x1a8) \ + GENODE_TAG_VALUE(KEY_PRESENTATION, 0x1a9) \ + GENODE_TAG_VALUE(KEY_DATABASE, 0x1aa) \ + GENODE_TAG_VALUE(KEY_NEWS, 0x1ab) \ + GENODE_TAG_VALUE(KEY_VOICEMAIL, 0x1ac) \ + GENODE_TAG_VALUE(KEY_ADDRESSBOOK, 0x1ad) \ + GENODE_TAG_VALUE(KEY_MESSENGER, 0x1ae) \ + \ + GENODE_TAG_VALUE(KEY_DEL_EOL, 0x1c0) \ + GENODE_TAG_VALUE(KEY_DEL_EOS, 0x1c1) \ + GENODE_TAG_VALUE(KEY_INS_LINE, 0x1c2) \ + GENODE_TAG_VALUE(KEY_DEL_LINE, 0x1c3) \ + \ + GENODE_TAG_VALUE(KEY_FN, 0x1d0) \ + GENODE_TAG_VALUE(KEY_FN_ESC, 0x1d1) \ + GENODE_TAG_VALUE(KEY_FN_F1, 0x1d2) \ + GENODE_TAG_VALUE(KEY_FN_F2, 0x1d3) \ + GENODE_TAG_VALUE(KEY_FN_F3, 0x1d4) \ + GENODE_TAG_VALUE(KEY_FN_F4, 0x1d5) \ + GENODE_TAG_VALUE(KEY_FN_F5, 0x1d6) \ + GENODE_TAG_VALUE(KEY_FN_F6, 0x1d7) \ + GENODE_TAG_VALUE(KEY_FN_F7, 0x1d8) \ + GENODE_TAG_VALUE(KEY_FN_F8, 0x1d9) \ + GENODE_TAG_VALUE(KEY_FN_F9, 0x1da) \ + GENODE_TAG_VALUE(KEY_FN_F10, 0x1db) \ + GENODE_TAG_VALUE(KEY_FN_F11, 0x1dc) \ + GENODE_TAG_VALUE(KEY_FN_F12, 0x1dd) \ + GENODE_TAG_VALUE(KEY_FN_1, 0x1de) \ + GENODE_TAG_VALUE(KEY_FN_2, 0x1df) \ + GENODE_TAG_VALUE(KEY_FN_D, 0x1e0) \ + GENODE_TAG_VALUE(KEY_FN_E, 0x1e1) \ + GENODE_TAG_VALUE(KEY_FN_F, 0x1e2) \ + GENODE_TAG_VALUE(KEY_FN_S, 0x1e3) \ + GENODE_TAG_VALUE(KEY_FN_B, 0x1e4) \ + \ + GENODE_TAG_VALUE(KEY_BRL_DOT1, 0x1f1) \ + GENODE_TAG_VALUE(KEY_BRL_DOT2, 0x1f2) \ + GENODE_TAG_VALUE(KEY_BRL_DOT3, 0x1f3) \ + GENODE_TAG_VALUE(KEY_BRL_DOT4, 0x1f4) \ + GENODE_TAG_VALUE(KEY_BRL_DOT5, 0x1f5) \ + GENODE_TAG_VALUE(KEY_BRL_DOT6, 0x1f6) \ + GENODE_TAG_VALUE(KEY_BRL_DOT7, 0x1f7) \ + GENODE_TAG_VALUE(KEY_BRL_DOT8, 0x1f8) \ + \ + GENODE_TAG_VALUE(KEY_UNKNOWN, 0x1fe) \ + GENODE_TAG_VALUE(KEY_MAX, 0x1ff) + +enum Keycode { +#define GENODE_TAG_VALUE(tag, value) G_ ## tag = value, + GENODE_INPUT_KEYCODES +#undef GENODE_TAG_VALUE +}; + + + +unsigned lx_emul_event_keycode(unsigned linux_keycode) +{ + switch (linux_keycode) { +#define GENODE_TAG_VALUE(tag, value) case tag: return G_ ## tag; + GENODE_INPUT_KEYCODES +#undef GENODE_TAG_VALUE + + default: + Genode::warning("unknown keycode ", linux_keycode); + } + + return G_KEY_UNKNOWN; +} diff --git a/repos/dde_linux/src/lib/lx_emul/shadow/drivers/input/evdev.c b/repos/dde_linux/src/lib/lx_emul/shadow/drivers/input/evdev.c new file mode 100644 index 0000000000..0c479234da --- /dev/null +++ b/repos/dde_linux/src/lib/lx_emul/shadow/drivers/input/evdev.c @@ -0,0 +1,209 @@ +/* + * \brief Linux emulation environment: input event sink + * \author Christian Helmuth + * \date 2022-06-23 + * + * This implementation is derived from drivers/input/evbug.c and + * drivers/input/evdev.c. + */ + +/* + * Copyright (C) 2022 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +#include +#include +#include + +#include +#include +#include +#include +#include + + +struct evdev +{ + struct genode_event *event; + struct input_handle handle; +}; + + +static void submit_rel_motion(struct genode_event_submit *submit, + unsigned code, int value) +{ + switch (code) { + case REL_X: submit->rel_motion(submit, value, 0); break; + case REL_Y: submit->rel_motion(submit, 0, value); break; + + default: + printk("Unsupported relative motion event code=%d dropped\n", code); + } +} + + +static void submit_key(struct genode_event_submit *submit, + unsigned code, bool press) +{ + /* map BTN_TOUCH to BTN_LEFT */ + if (code == BTN_TOUCH) code = BTN_LEFT; + + if (press) + submit->press(submit, lx_emul_event_keycode(code)); + else + submit->release(submit, lx_emul_event_keycode(code)); +} + + +struct genode_event_generator_ctx +{ + struct evdev *evdev; + struct input_value const *values; + unsigned count; +}; + + +static void evdev_event_generator(struct genode_event_generator_ctx *ctx, + struct genode_event_submit *submit) +{ + int i; + for (i = 0; i < ctx->count; i++) { + unsigned const type = ctx->values[i].type; + unsigned const code = ctx->values[i].code; + unsigned const value = ctx->values[i].value; + + /* filter input_repeat_key() */ + if ((type == EV_KEY) && (value > 1)) continue; + + /* filter EV_SYN and EV_MSC */ + if (type == EV_SYN || type == EV_MSC) continue; + + switch (type) { + case EV_KEY: submit_key(submit, code, value); break; + case EV_REL: submit_rel_motion(submit, code, value); break; + + default: + printk("Unsupported Event[%u/%u] device=%s, type=%d, code=%d, value=%d dropped\n", + i + 1, ctx->count, dev_name(&ctx->evdev->handle.dev->dev), type, code, value); + continue; + } + } +} + + +static void evdev_events(struct input_handle *handle, + struct input_value const *values, unsigned int count) +{ + struct evdev *evdev = handle->private; + + struct genode_event_generator_ctx ctx = { + .evdev = evdev, .values = values, .count = count }; + + genode_event_generate(evdev->event, &evdev_event_generator, &ctx); +} + + +static void evdev_event(struct input_handle *handle, + unsigned int type, unsigned int code, int value) +{ + struct input_value vals[] = { { type, code, value } }; + + evdev_events(handle, vals, 1); +} + + +static int evdev_connect(struct input_handler *handler, struct input_dev *dev, + const struct input_device_id *id) +{ + struct evdev *evdev; + int error; + struct genode_event_args args = { .label = dev->name }; + + evdev = kzalloc(sizeof(*evdev), GFP_KERNEL); + if (!evdev) + return -ENOMEM; + + evdev->event = genode_event_create(&args); + + evdev->handle.private = evdev; + evdev->handle.dev = dev; + evdev->handle.handler = handler; + evdev->handle.name = dev->name; + + error = input_register_handle(&evdev->handle); + if (error) + goto err_free_handle; + + error = input_open_device(&evdev->handle); + if (error) + goto err_unregister_handle; + + printk("Connected device: %s (%s at %s)\n", + dev_name(&dev->dev), + dev->name ?: "unknown", + dev->phys ?: "unknown"); + + return 0; + +err_unregister_handle: + input_unregister_handle(&evdev->handle); + +err_free_handle: + genode_event_destroy(evdev->event); + kfree(evdev); + return error; +} + + +static void evdev_disconnect(struct input_handle *handle) +{ + struct evdev *evdev = handle->private; + + printk("Disconnected device: %s\n", dev_name(&handle->dev->dev)); + + input_close_device(handle); + input_unregister_handle(handle); + genode_event_destroy(evdev->event); + kfree(evdev); +} + + +static const struct input_device_id evdev_ids[] = { + { .driver_info = 1 }, /* Matches all devices */ + { }, /* Terminating zero entry */ +}; + + +MODULE_DEVICE_TABLE(input, evdev_ids); + +static struct input_handler evdev_handler = { + .event = evdev_event, + .events = evdev_events, + .connect = evdev_connect, + .disconnect = evdev_disconnect, + .name = "evdev", + .id_table = evdev_ids, +}; + + +static int __init evdev_init(void) +{ + return input_register_handler(&evdev_handler); +} + + +static void __exit evdev_exit(void) +{ + input_unregister_handler(&evdev_handler); +} + + +/** + * Let's hook into the evdev initcall, so we do not need to register + * an additional one + */ +module_init(evdev_init); +module_exit(evdev_exit);