From 02d85b5021dc3e9c042e1e3426fae2f0a903595b Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Mon, 6 Dec 2010 17:13:33 -0800 Subject: Add support for fallback keycodes. This change enables the framework to synthesize key events to implement default behavior when an application does not handle a key. For example, this change enables numeric keypad keys to perform their associated special function when numlock is off. The application is informed that it is processing a fallback keypress so it can choose to ignore it. Added a new keycode for switching applications. Added ALT key deadkeys. New default key mappings: - ESC -> BACK - Meta+ESC -> HOME - Alt+ESC -> MENU - Meta+Space -> SEARCH - Meta+Tab -> APP_SWITCH Fixed some comments. Fixed some tests. Change-Id: Id7f3b6645f3a350275e624547822f72652f3defe --- include/ui/InputDispatcher.h | 12 +++++++++--- include/ui/InputReader.h | 3 ++- include/ui/InputTransport.h | 2 +- include/ui/KeyCharacterMap.h | 17 +++++++++++++++++ include/ui/KeycodeLabels.h | 1 + 5 files changed, 30 insertions(+), 5 deletions(-) (limited to 'include') diff --git a/include/ui/InputDispatcher.h b/include/ui/InputDispatcher.h index b621680..7305601 100644 --- a/include/ui/InputDispatcher.h +++ b/include/ui/InputDispatcher.h @@ -306,9 +306,10 @@ public: virtual bool interceptKeyBeforeDispatching(const sp& inputChannel, const KeyEvent* keyEvent, uint32_t policyFlags) = 0; - /* Allows the policy a chance to perform default processing for an unhandled key. */ + /* Allows the policy a chance to perform default processing for an unhandled key. + * Returns an alternate keycode to redispatch as a fallback, or 0 to give up. */ virtual bool dispatchUnhandledKey(const sp& inputChannel, - const KeyEvent* keyEvent, uint32_t policyFlags) = 0; + const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) = 0; /* Notifies the policy about switch events. */ @@ -735,6 +736,7 @@ private: CANCEL_ALL_EVENTS = 0, CANCEL_POINTER_EVENTS = 1, CANCEL_NON_POINTER_EVENTS = 2, + CANCEL_FALLBACK_EVENTS = 3, }; InputState(); @@ -771,6 +773,7 @@ private: int32_t source; int32_t keyCode; int32_t scanCode; + int32_t flags; nsecs_t downTime; }; @@ -790,7 +793,10 @@ private: Vector mKeyMementos; Vector mMotionMementos; - static bool shouldCancelEvent(int32_t eventSource, CancelationOptions options); + static bool shouldCancelKey(const KeyMemento& memento, + CancelationOptions options); + static bool shouldCancelMotion(const MotionMemento& memento, + CancelationOptions options); }; /* Manages the dispatch state associated with a single input channel. */ diff --git a/include/ui/InputReader.h b/include/ui/InputReader.h index 8ec5421..b466ff1 100644 --- a/include/ui/InputReader.h +++ b/include/ui/InputReader.h @@ -402,7 +402,6 @@ private: } mLocked; void initializeLocked(); - void initializeLedStateLocked(LockedState::LedState& ledState, int32_t led); void configureParameters(); void dumpParameters(String8& dump); @@ -414,6 +413,8 @@ private: ssize_t findKeyDownLocked(int32_t scanCode); + void resetLedStateLocked(); + void initializeLedStateLocked(LockedState::LedState& ledState, int32_t led); void updateLedStateLocked(bool reset); void updateLedStateForModifierLocked(LockedState::LedState& ledState, int32_t led, int32_t modifier, bool reset); diff --git a/include/ui/InputTransport.h b/include/ui/InputTransport.h index 7efb6cc..119db81 100644 --- a/include/ui/InputTransport.h +++ b/include/ui/InputTransport.h @@ -256,7 +256,7 @@ public: * Returns WOULD_BLOCK if there is no signal present. * Other errors probably indicate that the channel is broken. */ - status_t receiveFinishedSignal(bool& outHandled); + status_t receiveFinishedSignal(bool* outHandled); private: sp mChannel; diff --git a/include/ui/KeyCharacterMap.h b/include/ui/KeyCharacterMap.h index a1ccb37..10a3810 100644 --- a/include/ui/KeyCharacterMap.h +++ b/include/ui/KeyCharacterMap.h @@ -44,6 +44,12 @@ public: KEYBOARD_TYPE_SPECIAL_FUNCTION = 5, }; + // Substitute key code and meta state for fallback action. + struct FallbackAction { + int32_t keyCode; + int32_t metaState; + }; + ~KeyCharacterMap(); static status_t load(const String8& filename, KeyCharacterMap** outMap); @@ -67,6 +73,13 @@ public: */ char16_t getCharacter(int32_t keyCode, int32_t metaState) const; + /* Gets the fallback action to use by default if the application does not + * handle the specified key. + * Returns true if an action was available, false if none. + */ + bool getFallbackAction(int32_t keyCode, int32_t metaState, + FallbackAction* outFallbackAction) const; + /* Gets the first matching Unicode character that can be generated by the key, * preferring the one with the specified meta key modifiers. * Returns 0 if no matching character is generated. @@ -155,6 +168,10 @@ private: KeyCharacterMap(); + bool getKey(int32_t keyCode, const Key** outKey) const; + bool getKeyBehavior(int32_t keyCode, int32_t metaState, + const Key** outKey, const Behavior** outBehavior) const; + bool findKey(char16_t ch, int32_t* outKeyCode, int32_t* outMetaState) const; static void addKey(Vector& outEvents, diff --git a/include/ui/KeycodeLabels.h b/include/ui/KeycodeLabels.h index be7db1f..9b1a897 100755 --- a/include/ui/KeycodeLabels.h +++ b/include/ui/KeycodeLabels.h @@ -211,6 +211,7 @@ static const KeycodeLabel KEYCODES[] = { { "PROG_GREEN", 184 }, { "PROG_YELLOW", 185 }, { "PROG_BLUE", 186 }, + { "APP_SWITCH", 187 }, // NOTE: If you add a new keycode here you must also add it to several other files. // Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list. -- cgit v1.1