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

Commit 78f2444a authored by Michael Wright's avatar Michael Wright
Browse files

Revert "Revert "Add system accelerators for BACK and HOME.""

This reverts commit d671f98a.

Change-Id: Ibec48f81653bd2f755fc59a241fa7836baf53233
parent d671f98a
Loading
Loading
Loading
Loading
+44 −2
Original line number Original line Diff line number Diff line
@@ -2366,9 +2366,38 @@ void InputDispatcher::notifyKey(const NotifyKeyArgs* args) {


    policyFlags |= POLICY_FLAG_TRUSTED;
    policyFlags |= POLICY_FLAG_TRUSTED;


    int32_t keyCode = args->keyCode;
    if (metaState & AMETA_META_ON && args->action == AKEY_EVENT_ACTION_DOWN) {
        int32_t newKeyCode = AKEYCODE_UNKNOWN;
        if (keyCode == AKEYCODE_DEL) {
            newKeyCode = AKEYCODE_BACK;
        } else if (keyCode == AKEYCODE_ENTER) {
            newKeyCode = AKEYCODE_HOME;
        }
        if (newKeyCode != AKEYCODE_UNKNOWN) {
            AutoMutex _l(mLock);
            struct KeyReplacement replacement = {keyCode, args->deviceId};
            mReplacedKeys.add(replacement, newKeyCode);
            keyCode = newKeyCode;
            metaState &= ~AMETA_META_ON;
        }
    } else if (args->action == AKEY_EVENT_ACTION_UP) {
        // In order to maintain a consistent stream of up and down events, check to see if the key
        // going up is one we've replaced in a down event and haven't yet replaced in an up event,
        // even if the modifier was released between the down and the up events.
        AutoMutex _l(mLock);
        struct KeyReplacement replacement = {keyCode, args->deviceId};
        ssize_t index = mReplacedKeys.indexOfKey(replacement);
        if (index >= 0) {
            keyCode = mReplacedKeys.valueAt(index);
            mReplacedKeys.removeItemsAt(index);
            metaState &= ~AMETA_META_ON;
        }
    }

    KeyEvent event;
    KeyEvent event;
    event.initialize(args->deviceId, args->source, args->action,
    event.initialize(args->deviceId, args->source, args->action,
            flags, args->keyCode, args->scanCode, metaState, 0,
            flags, keyCode, args->scanCode, metaState, 0,
            args->downTime, args->eventTime);
            args->downTime, args->eventTime);


    mPolicy->interceptKeyBeforeQueueing(&event, /*byref*/ policyFlags);
    mPolicy->interceptKeyBeforeQueueing(&event, /*byref*/ policyFlags);
@@ -2391,7 +2420,7 @@ void InputDispatcher::notifyKey(const NotifyKeyArgs* args) {
        int32_t repeatCount = 0;
        int32_t repeatCount = 0;
        KeyEntry* newEntry = new KeyEntry(args->eventTime,
        KeyEntry* newEntry = new KeyEntry(args->eventTime,
                args->deviceId, args->source, policyFlags,
                args->deviceId, args->source, policyFlags,
                args->action, flags, args->keyCode, args->scanCode,
                args->action, flags, keyCode, args->scanCode,
                metaState, repeatCount, args->downTime);
                metaState, repeatCount, args->downTime);


        needWake = enqueueInboundEventLocked(newEntry);
        needWake = enqueueInboundEventLocked(newEntry);
@@ -3050,6 +3079,7 @@ void InputDispatcher::resetAndDropEverythingLocked(const char* reason) {


    mTouchStatesByDisplay.clear();
    mTouchStatesByDisplay.clear();
    mLastHoverWindowHandle.clear();
    mLastHoverWindowHandle.clear();
    mReplacedKeys.clear();
}
}


void InputDispatcher::logDispatchStateLocked() {
void InputDispatcher::logDispatchStateLocked() {
@@ -3188,6 +3218,18 @@ void InputDispatcher::dumpDispatchStateLocked(String8& dump) {
        dump.append(INDENT "InboundQueue: <empty>\n");
        dump.append(INDENT "InboundQueue: <empty>\n");
    }
    }


    if (!mReplacedKeys.isEmpty()) {
        dump.append(INDENT "ReplacedKeys:\n");
        for (size_t i = 0; i < mReplacedKeys.size(); i++) {
            const KeyReplacement& replacement = mReplacedKeys.keyAt(i);
            int32_t newKeyCode = mReplacedKeys.valueAt(i);
            dump.appendFormat(INDENT2 "%zu: originalKeyCode=%d, deviceId=%d, newKeyCode=%d\n",
                    i, replacement.keyCode, replacement.deviceId, newKeyCode);
        }
    } else {
        dump.append(INDENT "ReplacedKeys: <empty>\n");
    }

    if (!mConnectionsByFd.isEmpty()) {
    if (!mConnectionsByFd.isEmpty()) {
        dump.append(INDENT "Connections:\n");
        dump.append(INDENT "Connections:\n");
        for (size_t i = 0; i < mConnectionsByFd.size(); i++) {
        for (size_t i = 0; i < mConnectionsByFd.size(); i++) {
+14 −0
Original line number Original line Diff line number Diff line
@@ -904,6 +904,20 @@ private:
    void resetKeyRepeatLocked();
    void resetKeyRepeatLocked();
    KeyEntry* synthesizeKeyRepeatLocked(nsecs_t currentTime);
    KeyEntry* synthesizeKeyRepeatLocked(nsecs_t currentTime);


    // Key replacement tracking
    struct KeyReplacement {
        int32_t keyCode;
        int32_t deviceId;
        bool operator==(const KeyReplacement& rhs) const {
            return keyCode == rhs.keyCode && deviceId == rhs.deviceId;
        }
        bool operator<(const KeyReplacement& rhs) const {
            return keyCode != rhs.keyCode ? keyCode < rhs.keyCode : deviceId < rhs.deviceId;
        }
    };
    // Maps the key code replaced, device id tuple to the key code it was replaced with
    KeyedVector<KeyReplacement, int32_t> mReplacedKeys;

    // Deferred command processing.
    // Deferred command processing.
    bool haveCommandsLocked() const;
    bool haveCommandsLocked() const;
    bool runCommandsLockedInterruptible();
    bool runCommandsLockedInterruptible();