diff --git a/backends/hwcomposer/hwcomposer_backend.cpp b/backends/hwcomposer/hwcomposer_backend.cpp
index 5ec3656804..45a20cc746 100644
--- a/backends/hwcomposer/hwcomposer_backend.cpp
+++ b/backends/hwcomposer/hwcomposer_backend.cpp
@@ -30,8 +30,11 @@ along with this program. If not, see .
#include
#include
#include
+#include
#include
#include
+// linux
+#include
// based on test_hwcomposer.c from libhybris project (Apache 2 licensed)
@@ -62,18 +65,250 @@ static QPointF eventPosition(Event *event)
event->details.motion.pointer_coordinates[0].y);
}
+static qint32 translateKey(qint32 key)
+{
+ static const QHash s_translation = {
+ {ISCL_KEYCODE_UNKNOWN, KEY_RESERVED},
+ {ISCL_KEYCODE_SOFT_LEFT, KEY_RESERVED},
+ {ISCL_KEYCODE_SOFT_RIGHT, KEY_RESERVED},
+ {ISCL_KEYCODE_HOME, KEY_HOME},
+ {ISCL_KEYCODE_BACK, KEY_BACK},
+ {ISCL_KEYCODE_CALL, KEY_RESERVED},
+ {ISCL_KEYCODE_ENDCALL, KEY_RESERVED},
+ {ISCL_KEYCODE_0, KEY_0},
+ {ISCL_KEYCODE_1, KEY_1},
+ {ISCL_KEYCODE_2, KEY_2},
+ {ISCL_KEYCODE_3, KEY_3},
+ {ISCL_KEYCODE_4, KEY_4},
+ {ISCL_KEYCODE_5, KEY_5},
+ {ISCL_KEYCODE_6, KEY_6},
+ {ISCL_KEYCODE_7, KEY_7},
+ {ISCL_KEYCODE_8, KEY_8},
+ {ISCL_KEYCODE_9, KEY_9},
+ {ISCL_KEYCODE_STAR, KEY_NUMERIC_STAR},
+ {ISCL_KEYCODE_POUND, KEY_NUMERIC_POUND},
+ {ISCL_KEYCODE_DPAD_UP, BTN_DPAD_UP},
+ {ISCL_KEYCODE_DPAD_DOWN, BTN_DPAD_DOWN},
+ {ISCL_KEYCODE_DPAD_LEFT, BTN_DPAD_LEFT},
+ {ISCL_KEYCODE_DPAD_RIGHT, BTN_DPAD_RIGHT},
+ {ISCL_KEYCODE_DPAD_CENTER, KEY_RESERVED},
+ {ISCL_KEYCODE_VOLUME_UP, KEY_VOLUMEUP},
+ {ISCL_KEYCODE_VOLUME_DOWN, KEY_VOLUMEDOWN},
+ {ISCL_KEYCODE_POWER, KEY_POWER},
+ {ISCL_KEYCODE_CAMERA, KEY_CAMERA},
+ {ISCL_KEYCODE_CLEAR, KEY_CLEAR},
+ {ISCL_KEYCODE_A, KEY_A},
+ {ISCL_KEYCODE_B, KEY_B},
+ {ISCL_KEYCODE_C, KEY_C},
+ {ISCL_KEYCODE_D, KEY_D},
+ {ISCL_KEYCODE_E, KEY_E},
+ {ISCL_KEYCODE_F, KEY_F},
+ {ISCL_KEYCODE_G, KEY_G},
+ {ISCL_KEYCODE_H, KEY_H},
+ {ISCL_KEYCODE_I, KEY_I},
+ {ISCL_KEYCODE_J, KEY_J},
+ {ISCL_KEYCODE_K, KEY_K},
+ {ISCL_KEYCODE_L, KEY_L},
+ {ISCL_KEYCODE_M, KEY_M},
+ {ISCL_KEYCODE_N, KEY_N},
+ {ISCL_KEYCODE_O, KEY_O},
+ {ISCL_KEYCODE_P, KEY_P},
+ {ISCL_KEYCODE_Q, KEY_Q},
+ {ISCL_KEYCODE_R, KEY_R},
+ {ISCL_KEYCODE_S, KEY_S},
+ {ISCL_KEYCODE_T, KEY_T},
+ {ISCL_KEYCODE_U, KEY_U},
+ {ISCL_KEYCODE_V, KEY_V},
+ {ISCL_KEYCODE_W, KEY_W},
+ {ISCL_KEYCODE_X, KEY_X},
+ {ISCL_KEYCODE_Y, KEY_Y},
+ {ISCL_KEYCODE_Z, KEY_Z},
+ {ISCL_KEYCODE_COMMA, KEY_COMMA},
+ {ISCL_KEYCODE_PERIOD, KEY_DOT},
+ {ISCL_KEYCODE_ALT_LEFT, KEY_LEFTALT},
+ {ISCL_KEYCODE_ALT_RIGHT, KEY_RIGHTALT},
+ {ISCL_KEYCODE_SHIFT_LEFT, KEY_LEFTSHIFT},
+ {ISCL_KEYCODE_SHIFT_RIGHT, KEY_RIGHTSHIFT},
+ {ISCL_KEYCODE_TAB, KEY_TAB},
+ {ISCL_KEYCODE_SPACE, KEY_SPACE},
+ {ISCL_KEYCODE_SYM, KEY_RESERVED},
+ {ISCL_KEYCODE_EXPLORER, KEY_RESERVED},
+ {ISCL_KEYCODE_ENVELOPE, KEY_EMAIL},
+ {ISCL_KEYCODE_ENTER, KEY_ENTER},
+ {ISCL_KEYCODE_DEL, KEY_DELETE},
+ {ISCL_KEYCODE_GRAVE, KEY_GRAVE},
+ {ISCL_KEYCODE_MINUS, KEY_MINUS},
+ {ISCL_KEYCODE_EQUALS, KEY_EQUAL},
+ {ISCL_KEYCODE_LEFT_BRACKET, KEY_LEFTBRACE},
+ {ISCL_KEYCODE_RIGHT_BRACKET, KEY_RIGHTBRACE},
+ {ISCL_KEYCODE_BACKSLASH, KEY_BACKSLASH},
+ {ISCL_KEYCODE_SEMICOLON, KEY_SEMICOLON},
+ {ISCL_KEYCODE_APOSTROPHE, KEY_APOSTROPHE},
+ {ISCL_KEYCODE_SLASH, KEY_SLASH},
+ {ISCL_KEYCODE_AT, KEY_RESERVED},
+ {ISCL_KEYCODE_NUM, KEY_RESERVED},
+ {ISCL_KEYCODE_HEADSETHOOK, KEY_RESERVED},
+ {ISCL_KEYCODE_FOCUS, KEY_CAMERA_FOCUS},
+ {ISCL_KEYCODE_PLUS, KEY_RESERVED},
+ {ISCL_KEYCODE_MENU, KEY_MENU},
+ {ISCL_KEYCODE_NOTIFICATION, KEY_RESERVED},
+ {ISCL_KEYCODE_SEARCH, KEY_SEARCH},
+ {ISCL_KEYCODE_MEDIA_PLAY_PAUSE, KEY_PLAYPAUSE},
+ {ISCL_KEYCODE_MEDIA_STOP, KEY_STOPCD},
+ {ISCL_KEYCODE_MEDIA_NEXT, KEY_NEXTSONG},
+ {ISCL_KEYCODE_MEDIA_PREVIOUS, KEY_PREVIOUSSONG},
+ {ISCL_KEYCODE_MEDIA_REWIND, KEY_REWIND},
+ {ISCL_KEYCODE_MEDIA_FAST_FORWARD, KEY_FASTFORWARD},
+ {ISCL_KEYCODE_MUTE, KEY_MUTE},
+ {ISCL_KEYCODE_PAGE_UP, KEY_PAGEUP},
+ {ISCL_KEYCODE_PAGE_DOWN, KEY_PAGEDOWN},
+ {ISCL_KEYCODE_PICTSYMBOLS, KEY_RESERVED},
+ {ISCL_KEYCODE_SWITCH_CHARSET, KEY_RESERVED},
+ {ISCL_KEYCODE_BUTTON_A, BTN_A},
+ {ISCL_KEYCODE_BUTTON_B, BTN_B},
+ {ISCL_KEYCODE_BUTTON_C, BTN_C},
+ {ISCL_KEYCODE_BUTTON_X, BTN_X},
+ {ISCL_KEYCODE_BUTTON_Y, BTN_Y},
+ {ISCL_KEYCODE_BUTTON_Z, BTN_Z},
+ {ISCL_KEYCODE_BUTTON_L1, BTN_TL},
+ {ISCL_KEYCODE_BUTTON_R1, BTN_TR},
+ {ISCL_KEYCODE_BUTTON_L2, BTN_TL2},
+ {ISCL_KEYCODE_BUTTON_R2, BTN_TR2},
+ {ISCL_KEYCODE_BUTTON_THUMBL, BTN_THUMBL},
+ {ISCL_KEYCODE_BUTTON_THUMBR, BTN_THUMBR},
+ {ISCL_KEYCODE_BUTTON_START, BTN_START},
+ {ISCL_KEYCODE_BUTTON_SELECT, BTN_SELECT},
+ {ISCL_KEYCODE_BUTTON_MODE, BTN_MODE},
+ {ISCL_KEYCODE_ESCAPE, KEY_ESC},
+ {ISCL_KEYCODE_FORWARD_DEL, KEY_RESERVED},
+ {ISCL_KEYCODE_CTRL_LEFT, KEY_LEFTCTRL},
+ {ISCL_KEYCODE_CTRL_RIGHT, KEY_RIGHTCTRL},
+ {ISCL_KEYCODE_CAPS_LOCK, KEY_CAPSLOCK},
+ {ISCL_KEYCODE_SCROLL_LOCK, KEY_SCROLLLOCK},
+ {ISCL_KEYCODE_META_LEFT, KEY_LEFTMETA},
+ {ISCL_KEYCODE_META_RIGHT, KEY_RIGHTMETA},
+ {ISCL_KEYCODE_FUNCTION, KEY_RESERVED},
+ {ISCL_KEYCODE_SYSRQ, KEY_SYSRQ},
+ {ISCL_KEYCODE_BREAK, KEY_RESERVED},
+ {ISCL_KEYCODE_MOVE_HOME, KEY_HOME},
+ {ISCL_KEYCODE_MOVE_END, KEY_END},
+ {ISCL_KEYCODE_INSERT, KEY_INSERT},
+ {ISCL_KEYCODE_FORWARD, KEY_RESERVED},
+ {ISCL_KEYCODE_MEDIA_PLAY, KEY_PLAYCD},
+ {ISCL_KEYCODE_MEDIA_PAUSE, KEY_PAUSECD},
+ {ISCL_KEYCODE_MEDIA_CLOSE, KEY_CLOSECD},
+ {ISCL_KEYCODE_MEDIA_EJECT, KEY_EJECTCD},
+ {ISCL_KEYCODE_MEDIA_RECORD, KEY_RECORD},
+ {ISCL_KEYCODE_F1, KEY_F1},
+ {ISCL_KEYCODE_F2, KEY_F2},
+ {ISCL_KEYCODE_F3, KEY_F3},
+ {ISCL_KEYCODE_F4, KEY_F4},
+ {ISCL_KEYCODE_F5, KEY_F5},
+ {ISCL_KEYCODE_F6, KEY_F6},
+ {ISCL_KEYCODE_F7, KEY_F7},
+ {ISCL_KEYCODE_F8, KEY_F8},
+ {ISCL_KEYCODE_F9, KEY_F9},
+ {ISCL_KEYCODE_F10, KEY_F10},
+ {ISCL_KEYCODE_F11, KEY_F11},
+ {ISCL_KEYCODE_F12, KEY_F12},
+ {ISCL_KEYCODE_NUM_LOCK, KEY_NUMLOCK},
+ {ISCL_KEYCODE_NUMPAD_0, KEY_KP0},
+ {ISCL_KEYCODE_NUMPAD_1, KEY_KP1},
+ {ISCL_KEYCODE_NUMPAD_2, KEY_KP2},
+ {ISCL_KEYCODE_NUMPAD_3, KEY_KP3},
+ {ISCL_KEYCODE_NUMPAD_4, KEY_KP4},
+ {ISCL_KEYCODE_NUMPAD_5, KEY_KP5},
+ {ISCL_KEYCODE_NUMPAD_6, KEY_KP6},
+ {ISCL_KEYCODE_NUMPAD_7, KEY_KP7},
+ {ISCL_KEYCODE_NUMPAD_8, KEY_KP8},
+ {ISCL_KEYCODE_NUMPAD_9, KEY_KP9},
+ {ISCL_KEYCODE_NUMPAD_DIVIDE, KEY_KPSLASH},
+ {ISCL_KEYCODE_NUMPAD_MULTIPLY, KEY_KPASTERISK},
+ {ISCL_KEYCODE_NUMPAD_SUBTRACT, KEY_KPMINUS},
+ {ISCL_KEYCODE_NUMPAD_ADD, KEY_KPPLUS},
+ {ISCL_KEYCODE_NUMPAD_DOT, KEY_KPDOT},
+ {ISCL_KEYCODE_NUMPAD_COMMA, KEY_KPCOMMA},
+ {ISCL_KEYCODE_NUMPAD_ENTER, KEY_KPENTER},
+ {ISCL_KEYCODE_NUMPAD_EQUALS, KEY_KPEQUAL},
+ {ISCL_KEYCODE_NUMPAD_LEFT_PAREN, KEY_KPLEFTPAREN},
+ {ISCL_KEYCODE_NUMPAD_RIGHT_PAREN, KEY_KPRIGHTPAREN},
+ {ISCL_KEYCODE_VOLUME_MUTE, KEY_MUTE},
+ {ISCL_KEYCODE_INFO, KEY_RESERVED},
+ {ISCL_KEYCODE_CHANNEL_UP, KEY_CHANNELUP},
+ {ISCL_KEYCODE_CHANNEL_DOWN, KEY_CHANNELDOWN},
+ {ISCL_KEYCODE_ZOOM_IN, KEY_ZOOMIN},
+ {ISCL_KEYCODE_ZOOM_OUT, KEY_ZOOMOUT},
+ {ISCL_KEYCODE_TV, KEY_RESERVED},
+ {ISCL_KEYCODE_WINDOW, KEY_RESERVED},
+ {ISCL_KEYCODE_GUIDE, KEY_RESERVED},
+ {ISCL_KEYCODE_DVR, KEY_RESERVED},
+ {ISCL_KEYCODE_BOOKMARK, KEY_RESERVED},
+ {ISCL_KEYCODE_CAPTIONS, KEY_RESERVED},
+ {ISCL_KEYCODE_SETTINGS, KEY_RESERVED},
+ {ISCL_KEYCODE_TV_POWER, KEY_RESERVED},
+ {ISCL_KEYCODE_TV_INPUT, KEY_RESERVED},
+ {ISCL_KEYCODE_STB_POWER, KEY_RESERVED},
+ {ISCL_KEYCODE_STB_INPUT, KEY_RESERVED},
+ {ISCL_KEYCODE_AVR_POWER, KEY_RESERVED},
+ {ISCL_KEYCODE_AVR_INPUT, KEY_RESERVED},
+ {ISCL_KEYCODE_PROG_RED, KEY_RED},
+ {ISCL_KEYCODE_PROG_GREEN, KEY_GREEN},
+ {ISCL_KEYCODE_PROG_YELLOW, KEY_YELLOW},
+ {ISCL_KEYCODE_PROG_BLUE, KEY_BLUE},
+ {ISCL_KEYCODE_APP_SWITCH, KEY_RESERVED},
+ {ISCL_KEYCODE_BUTTON_1, KEY_RESERVED},
+ {ISCL_KEYCODE_BUTTON_2, KEY_RESERVED},
+ {ISCL_KEYCODE_BUTTON_3, KEY_RESERVED},
+ {ISCL_KEYCODE_BUTTON_4, KEY_RESERVED},
+ {ISCL_KEYCODE_BUTTON_5, KEY_RESERVED},
+ {ISCL_KEYCODE_BUTTON_6, KEY_RESERVED},
+ {ISCL_KEYCODE_BUTTON_7, KEY_RESERVED},
+ {ISCL_KEYCODE_BUTTON_8, KEY_RESERVED},
+ {ISCL_KEYCODE_BUTTON_9, KEY_RESERVED},
+ {ISCL_KEYCODE_BUTTON_10, KEY_RESERVED},
+ {ISCL_KEYCODE_BUTTON_11, KEY_RESERVED},
+ {ISCL_KEYCODE_BUTTON_12, KEY_RESERVED},
+ {ISCL_KEYCODE_BUTTON_13, KEY_RESERVED},
+ {ISCL_KEYCODE_BUTTON_14, KEY_RESERVED},
+ {ISCL_KEYCODE_BUTTON_15, KEY_RESERVED},
+ {ISCL_KEYCODE_BUTTON_16, KEY_RESERVED},
+ {ISCL_KEYCODE_LANGUAGE_SWITCH, KEY_RESERVED},
+ {ISCL_KEYCODE_MANNER_MODE, KEY_RESERVED},
+ {ISCL_KEYCODE_3D_MODE, KEY_RESERVED},
+ {ISCL_KEYCODE_CONTACTS, KEY_ADDRESSBOOK},
+ {ISCL_KEYCODE_CALENDAR, KEY_CALENDAR},
+ {ISCL_KEYCODE_MUSIC, KEY_MEDIA},
+ {ISCL_KEYCODE_CALCULATOR, KEY_CALC}
+ };
+ auto it = s_translation.find(key);
+ if (it == s_translation.end()) {
+ return KEY_RESERVED;
+ }
+ return it.value();
+}
+
void HwcomposerBackend::inputEvent(Event *event, void *context)
{
HwcomposerBackend *backend = reinterpret_cast(context);
switch (event->type) {
case KEY_EVENT_TYPE:
switch (event->action) {
- case ISCL_KEY_EVENT_ACTION_DOWN:
- // TODO: implement
+ case ISCL_KEY_EVENT_ACTION_DOWN: {
+ const qint32 key = translateKey(event->details.key.key_code);
+ if (key == KEY_RESERVED) {
+ break;
+ }
+ backend->keyboardKeyPressed(key, event->details.key.event_time);
break;
- case ISCL_KEY_EVENT_ACTION_UP:
- // TODO: implement
+ }
+ case ISCL_KEY_EVENT_ACTION_UP: {
+ const qint32 key = translateKey(event->details.key.key_code);
+ if (key == KEY_RESERVED) {
+ break;
+ }
+ backend->keyboardKeyReleased(key, event->details.key.event_time);
break;
+ }
case ISCL_KEY_EVENT_ACTION_MULTIPLE: // TODO: implement
default:
break;