From bbd0dc8607fd1b3a07bd223cc1670fc37beefa45 Mon Sep 17 00:00:00 2001 From: Johan Redestig Date: Fri, 25 Feb 2011 16:45:17 +0100 Subject: [PATCH] Implement support for ALT and SHIFT modifiers The spec for keymaps and keboard input at http://source.android.com/porting/keymaps_keyboard_input.html mentions the stand alone ALT and SHIFT modifiers: SHIFT: While pressed, the shift key modifier is set ALT: While pressed, the alt key modifier is set This commit implements support for these. Change-Id: I5854ef3df541740cc3443b474a9c41183eb7561c Ex: key 305 BACK ALT --- libs/ui/InputDispatcher.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/libs/ui/InputDispatcher.cpp b/libs/ui/InputDispatcher.cpp index 421ad663f..92ed0b11b 100644 --- a/libs/ui/InputDispatcher.cpp +++ b/libs/ui/InputDispatcher.cpp @@ -37,7 +37,9 @@ // Log debug messages about the app switch latency optimization. #define DEBUG_APP_SWITCH 0 +#include #include +#include #include #include @@ -2092,6 +2094,26 @@ void InputDispatcher::notifyKey(nsecs_t eventTime, int32_t deviceId, int32_t sou return; } + /* According to http://source.android.com/porting/keymaps_keyboard_input.html + * Key definitions: Key definitions follow the syntax key SCANCODE KEYCODE [FLAGS...], + * where SCANCODE is a number, KEYCODE is defined in your specific keylayout file + * (android.keylayout.xxx), and potential FLAGS are defined as follows: + * SHIFT: While pressed, the shift key modifier is set + * ALT: While pressed, the alt key modifier is set + * CAPS: While pressed, the caps lock key modifier is set + * Since KeyEvent.java doesn't check if Cap lock is ON and we don't have a + * modifer state for cap lock, we will not support it. + */ + if (policyFlags & POLICY_FLAG_ALT) { + metaState |= AMETA_ALT_ON | AMETA_ALT_LEFT_ON; + } + if (policyFlags & POLICY_FLAG_ALT_GR) { + metaState |= AMETA_ALT_ON | AMETA_ALT_RIGHT_ON; + } + if (policyFlags & POLICY_FLAG_SHIFT) { + metaState |= AMETA_SHIFT_ON | AMETA_SHIFT_LEFT_ON; + } + policyFlags |= POLICY_FLAG_TRUSTED; mPolicy->interceptKeyBeforeQueueing(eventTime, deviceId, action, /*byref*/ flags, keyCode, scanCode, /*byref*/ policyFlags);