InputEventLabels: Support lookup of evdev event codes by label Bug: 293327283 Test: atest CtsInputTestCases Change-Id: I846e1dc1eb450ea92d35ac7e403b06e2a029f25b
diff --git a/include/input/InputEventLabels.h b/include/input/InputEventLabels.h index 909bf08..44247c1 100644 --- a/include/input/InputEventLabels.h +++ b/include/input/InputEventLabels.h
@@ -69,6 +69,12 @@ 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();
diff --git a/libs/input/InputEventLabels.cpp b/libs/input/InputEventLabels.cpp index 50efac1..c218e1e 100644 --- a/libs/input/InputEventLabels.cpp +++ b/libs/input/InputEventLabels.cpp
@@ -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 @@ 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 @@ }; } +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