Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 02d85b50 authored by Jeff Brown's avatar Jeff Brown
Browse files

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
parent b5a00fcb
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -306,9 +306,10 @@ public:
    virtual bool interceptKeyBeforeDispatching(const sp<InputChannel>& 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>& 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<KeyMemento> mKeyMementos;
        Vector<MotionMemento> 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. */
+2 −1
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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<InputChannel> mChannel;
+17 −0
Original line number Diff line number Diff line
@@ -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<KeyEvent>& outEvents,
+1 −0
Original line number Diff line number Diff line
@@ -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.
Loading