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

Commit aadf8d5c authored by Charles Lin's avatar Charles Lin
Browse files

hasKeycodeLocked() also checks usage codes

Key map can use both scan code and usage code.
Adding usage code check to avoid misjudgment.

Bug: 275526611
Test:
In Android TV, pairing a BT RCU with keylayout which
has usage page/id for DPAD. In PlayStore app search
box, make sure user can move focus to search result
by pressing dpad DOWN key.

Change-Id: I70687d308899537e457192458176b1553c350f14
parent c4a353c0
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ public:
            int32_t* outKeyCode, uint32_t* outFlags) const;
    std::vector<int32_t> findScanCodesForKey(int32_t keyCode) const;
    std::optional<int32_t> findScanCodeForLed(int32_t ledCode) const;
    std::vector<int32_t> findUsageCodesForKey(int32_t keyCode) const;
    std::optional<int32_t> findUsageCodeForLed(int32_t ledCode) const;

    std::optional<AxisInfo> mapAxis(int32_t scanCode) const;
+10 −0
Original line number Diff line number Diff line
@@ -230,6 +230,16 @@ std::vector<int32_t> KeyLayoutMap::findScanCodesForKey(int32_t keyCode) const {
    return scanCodes;
}

std::vector<int32_t> KeyLayoutMap::findUsageCodesForKey(int32_t keyCode) const {
    std::vector<int32_t> usageCodes;
    for (const auto& [usageCode, key] : mKeysByUsageCode) {
        if (keyCode == key.keyCode) {
            usageCodes.push_back(usageCode);
        }
    }
    return usageCodes;
}

std::optional<AxisInfo> KeyLayoutMap::mapAxis(int32_t scanCode) const {
    auto it = mAxes.find(scanCode);
    if (it == mAxes.end()) {
+5 −0
Original line number Diff line number Diff line
@@ -461,6 +461,11 @@ bool EventHub::Device::hasKeycodeLocked(int keycode) const {
        }
    }

    std::vector<int32_t> usageCodes = keyMap.keyLayoutMap->findUsageCodesForKey(keycode);
    if (usageCodes.size() > 0 && mscBitmask.test(MSC_SCAN)) {
        return true;
    }

    return false;
}