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

Commit c99e15b5 authored by Prabir Pradhan's avatar Prabir Pradhan Committed by Android (Google) Code Review
Browse files

Merge changes from topic "uinput-cmd-label" into main

* changes:
  InputEventLabels: Support lookup of evdev event codes by label
  Move absolute axis validation from EventHub to InputDevice
parents 906cd4ae 2f13e022
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -69,6 +69,12 @@ public:

    static EvdevEventLabel getLinuxEvdevLabel(int32_t type, int32_t code, int32_t value);

    static std::optional<int> getLinuxEvdevEventTypeByLabel(const char* label);

    static std::optional<int> getLinuxEvdevEventCodeByLabel(int32_t type, const char* label);

    static std::optional<int> getLinuxEvdevInputPropByLabel(const char* label);

private:
    InputEventLookup();

+22 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#include <linux/input-event-codes.h>
#include <linux/input.h>
#include <strings.h>

#define DEFINE_KEYCODE(key) { #key, AKEYCODE_##key }
#define DEFINE_AXIS(axis) { #axis, AMOTION_EVENT_AXIS_##axis }
@@ -523,6 +524,14 @@ std::string getLabel(const label* labels, int value) {
    return labels->name != nullptr ? labels->name : std::to_string(value);
}

std::optional<int> getValue(const label* labels, const char* searchLabel) {
    if (labels == nullptr) return {};
    while (labels->name != nullptr && ::strcasecmp(labels->name, searchLabel) != 0) {
        labels++;
    }
    return labels->name != nullptr ? std::make_optional(labels->value) : std::nullopt;
}

const label* getCodeLabelsForType(int32_t type) {
    switch (type) {
        case EV_SYN:
@@ -572,4 +581,17 @@ EvdevEventLabel InputEventLookup::getLinuxEvdevLabel(int32_t type, int32_t code,
    };
}

std::optional<int> InputEventLookup::getLinuxEvdevEventTypeByLabel(const char* label) {
    return getValue(ev_labels, label);
}

std::optional<int> InputEventLookup::getLinuxEvdevEventCodeByLabel(int32_t type,
                                                                   const char* label) {
    return getValue(getCodeLabelsForType(type), label);
}

std::optional<int> InputEventLookup::getLinuxEvdevInputPropByLabel(const char* label) {
    return getValue(input_prop_labels, label);
}

} // namespace android
+16 −10
Original line number Diff line number Diff line
@@ -643,9 +643,6 @@ void EventHub::Device::populateAbsoluteAxisStates() {
                  identifier.name.c_str(), fd, strerror(errno));
            continue;
        }
        if (info.minimum == info.maximum) {
            continue;
        }
        auto& [axisInfo, value] = absState[axis];
        axisInfo.valid = true;
        axisInfo.minValue = info.minimum;
@@ -778,26 +775,35 @@ void EventHub::Device::trackInputEvent(const struct input_event& event) {
            LOG_ALWAYS_FATAL_IF(!currentFrameDropped &&
                                        !keyState.set(static_cast<size_t>(event.code),
                                                      event.value != 0),
                                "%s: received invalid EV_KEY event code: %s", __func__,
                                "%s: device '%s' received invalid EV_KEY event code: %s value: %d",
                                __func__, identifier.name.c_str(),
                                InputEventLookup::getLinuxEvdevLabel(EV_KEY, event.code, 1)
                                        .code.c_str());
                                        .code.c_str(),
                                event.value);
            break;
        }
        case EV_SW: {
            LOG_ALWAYS_FATAL_IF(!currentFrameDropped &&
                                        !swState.set(static_cast<size_t>(event.code),
                                                     event.value != 0),
                                "%s: received invalid EV_SW event code: %s", __func__,
                                "%s: device '%s' received invalid EV_SW event code: %s value: %d",
                                __func__, identifier.name.c_str(),
                                InputEventLookup::getLinuxEvdevLabel(EV_SW, event.code, 1)
                                        .code.c_str());
                                        .code.c_str(),
                                event.value);
            break;
        }
        case EV_ABS: {
            if (currentFrameDropped) {
                break;
            }
            auto it = absState.find(event.code);
            LOG_ALWAYS_FATAL_IF(!currentFrameDropped && it == absState.end(),
                                "%s: received invalid EV_ABS event code: %s", __func__,
            LOG_ALWAYS_FATAL_IF(it == absState.end(),
                                "%s: device '%s' received invalid EV_ABS event code: %s value: %d",
                                __func__, identifier.name.c_str(),
                                InputEventLookup::getLinuxEvdevLabel(EV_ABS, event.code, 0)
                                        .code.c_str());
                                        .code.c_str(),
                                event.value);
            it->second.value = event.value;
            break;
        }
+12 −1
Original line number Diff line number Diff line
@@ -289,7 +289,18 @@ public:
        return mEventHub->getDeviceControllerNumber(mId);
    }
    inline status_t getAbsoluteAxisInfo(int32_t code, RawAbsoluteAxisInfo* axisInfo) const {
        return mEventHub->getAbsoluteAxisInfo(mId, code, axisInfo);
        if (const auto status = mEventHub->getAbsoluteAxisInfo(mId, code, axisInfo); status != OK) {
            return status;
        }

        // Validate axis info for InputDevice.
        if (axisInfo->valid && axisInfo->minValue == axisInfo->maxValue) {
            // Historically, we deem axes with the same min and max values as invalid to avoid
            // dividing by zero when scaling by max - min.
            // TODO(b/291772515): Perform axis info validation on a per-axis basis when it is used.
            axisInfo->valid = false;
        }
        return OK;
    }
    inline bool hasRelativeAxis(int32_t code) const {
        return mEventHub->hasRelativeAxis(mId, code);