From 6f403a0cc90fb36c6df52aff22ce800adf0d6b23 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 16 Jun 2025 15:56:47 +1000 Subject: [PATCH] evdev: replace get_key_type with evdev_usage_is_button/key Makes this easier to use from other areas and we never cared about the key type NONE anyway. Part-of: --- src/evdev-debounce.c | 2 +- src/evdev-fallback.c | 55 +++++++++++++++----------------------------- src/evdev-fallback.h | 45 ------------------------------------ src/evdev-frame.h | 55 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 83 deletions(-) diff --git a/src/evdev-debounce.c b/src/evdev-debounce.c index f6b8f9f1..3f82250d 100644 --- a/src/evdev-debounce.c +++ b/src/evdev-debounce.c @@ -491,7 +491,7 @@ fallback_debounce_handle_state(struct fallback_dispatch *dispatch, for (evdev_usage_t usage = evdev_usage_from(EVDEV_KEY_RESERVED); evdev_usage_le(usage, EVDEV_KEY_MAX); usage = evdev_usage_next(usage)) { - if (get_key_type(usage) != KEY_TYPE_BUTTON) + if (!evdev_usage_is_button(usage)) continue; if (hw_key_has_changed(dispatch, usage)) diff --git a/src/evdev-fallback.c b/src/evdev-fallback.c index 078ae0a0..f472632c 100644 --- a/src/evdev-fallback.c +++ b/src/evdev-fallback.c @@ -472,8 +472,6 @@ fallback_process_key(struct fallback_dispatch *dispatch, struct evdev_device *device, struct evdev_event *e, uint64_t time) { - enum key_type type; - /* ignore kernel key repeat */ if (e->value == 2) return; @@ -487,40 +485,29 @@ fallback_process_key(struct fallback_dispatch *dispatch, return; } - type = get_key_type(e->usage); + bool is_button = evdev_usage_is_button(e->usage); + bool is_key = evdev_usage_is_key(e->usage); /* Ignore key release events from the kernel for keys that libinput * never got a pressed event for or key presses for keys that we * think are still down */ - switch (type) { - case KEY_TYPE_NONE: - break; - case KEY_TYPE_KEY: - case KEY_TYPE_BUTTON: + if (is_button || is_key) { if ((e->value && hw_is_key_down(dispatch, e->usage)) || (e->value == 0 && !hw_is_key_down(dispatch, e->usage))) return; dispatch->pending_event |= EVDEV_KEY; - break; } hw_set_key_down(dispatch, e->usage, e->value); - switch (type) { - case KEY_TYPE_NONE: - break; - case KEY_TYPE_KEY: - fallback_keyboard_notify_key( - dispatch, - device, - time, - e->usage, - e->value ? LIBINPUT_KEY_STATE_PRESSED : - LIBINPUT_KEY_STATE_RELEASED); - break; - case KEY_TYPE_BUTTON: - break; + if (is_key) { + fallback_keyboard_notify_key(dispatch, + device, + time, + e->usage, + e->value ? LIBINPUT_KEY_STATE_PRESSED : + LIBINPUT_KEY_STATE_RELEASED); } } @@ -965,7 +952,7 @@ fallback_handle_state(struct fallback_dispatch *dispatch, if (!hw_key_has_changed(dispatch, usage)) continue; - if (get_key_type(usage) == KEY_TYPE_BUTTON) { + if (evdev_usage_is_button(usage)) { want_debounce = true; break; } @@ -1073,18 +1060,13 @@ release_pressed_keys(struct fallback_dispatch *dispatch, count); } - switch (get_key_type(usage)) { - case KEY_TYPE_NONE: - break; - case KEY_TYPE_KEY: - fallback_keyboard_notify_key( - dispatch, - device, - time, - usage, - LIBINPUT_KEY_STATE_RELEASED); - break; - case KEY_TYPE_BUTTON: + if (evdev_usage_is_key(usage)) { + fallback_keyboard_notify_key(dispatch, + device, + time, + usage, + LIBINPUT_KEY_STATE_RELEASED); + } else if (evdev_usage_is_button(usage)) { /* Note: the left-handed configuration is nonzero for * the mapped button (not the physical button), in * get_key_down_count(). We must not map this to left-handed @@ -1095,7 +1077,6 @@ release_pressed_keys(struct fallback_dispatch *dispatch, time, usage, LIBINPUT_BUTTON_STATE_RELEASED); - break; } count = get_key_down_count(device, usage); diff --git a/src/evdev-fallback.h b/src/evdev-fallback.h index 07e8803d..0fa43862 100644 --- a/src/evdev-fallback.h +++ b/src/evdev-fallback.h @@ -184,51 +184,6 @@ fallback_dispatch(struct evdev_dispatch *dispatch) return container_of(dispatch, struct fallback_dispatch, base); } -enum key_type { - KEY_TYPE_NONE, - KEY_TYPE_KEY, - KEY_TYPE_BUTTON, -}; - -static inline enum key_type -get_key_type(evdev_usage_t evdev_usage) -{ - switch (evdev_usage_enum(evdev_usage)) { - case EVDEV_BTN_TOOL_PEN: - case EVDEV_BTN_TOOL_RUBBER: - case EVDEV_BTN_TOOL_BRUSH: - case EVDEV_BTN_TOOL_PENCIL: - case EVDEV_BTN_TOOL_AIRBRUSH: - case EVDEV_BTN_TOOL_MOUSE: - case EVDEV_BTN_TOOL_LENS: - case EVDEV_BTN_TOOL_QUINTTAP: - case EVDEV_BTN_TOOL_DOUBLETAP: - case EVDEV_BTN_TOOL_TRIPLETAP: - case EVDEV_BTN_TOOL_QUADTAP: - case EVDEV_BTN_TOOL_FINGER: - case EVDEV_BTN_TOUCH: - return KEY_TYPE_NONE; - default: - break; - } - - enum evdev_usage usage = evdev_usage_enum(evdev_usage); - if (usage >= EVDEV_KEY_ESC && usage <= EVDEV_KEY_MICMUTE) - return KEY_TYPE_KEY; - if (usage >= EVDEV_BTN_MISC && usage <= EVDEV_BTN_GEAR_UP) - return KEY_TYPE_BUTTON; - if (usage >= EVDEV_KEY_OK && usage <= EVDEV_KEY_LIGHTS_TOGGLE) - return KEY_TYPE_KEY; - if (usage >= EVDEV_BTN_DPAD_UP && usage <= EVDEV_BTN_DPAD_RIGHT) - return KEY_TYPE_BUTTON; - if (usage >= EVDEV_KEY_ALS_TOGGLE && usage < EVDEV_BTN_TRIGGER_HAPPY) - return KEY_TYPE_KEY; - if (usage >= EVDEV_BTN_TRIGGER_HAPPY && usage <= EVDEV_BTN_TRIGGER_HAPPY40) - return KEY_TYPE_BUTTON; - - return KEY_TYPE_NONE; -} - static inline void hw_set_key_down(struct fallback_dispatch *dispatch, evdev_usage_t usage, int pressed) { diff --git a/src/evdev-frame.h b/src/evdev-frame.h index 8b5fac0b..5fb07a22 100644 --- a/src/evdev-frame.h +++ b/src/evdev-frame.h @@ -88,6 +88,8 @@ enum evdev_usage { EVDEV_BTN_TOOL_QUADTAP = _evbit(EV_KEY, BTN_TOOL_QUADTAP), EVDEV_BTN_TOOL_FINGER = _evbit(EV_KEY, BTN_TOOL_FINGER), EVDEV_BTN_MISC = _evbit(EV_KEY, BTN_MISC), + EVDEV_BTN_DIGI = _evbit(EV_KEY, BTN_DIGI), + EVDEV_BTN_WHEEL = _evbit(EV_KEY, BTN_WHEEL), EVDEV_BTN_GEAR_UP = _evbit(EV_KEY, BTN_GEAR_UP), EVDEV_BTN_DPAD_UP = _evbit(EV_KEY, BTN_DPAD_UP), EVDEV_BTN_DPAD_RIGHT = _evbit(EV_KEY, BTN_DPAD_RIGHT), @@ -197,6 +199,59 @@ evdev_usage_next(evdev_usage_t usage) return evdev_usage_from_code(evdev_usage_type(usage), evdev_usage_code(usage) + 1); } +/** + * Returns true if the usage is a real button, i.e. BTN_FOO + * excluding the various BTN_TOOL and BTN_TOUCH usages. + */ +static inline bool +evdev_usage_is_button(evdev_usage_t usage) +{ + switch (evdev_usage_as_uint32_t(usage)) { + case EVDEV_BTN_TOOL_PEN: + case EVDEV_BTN_TOOL_RUBBER: + case EVDEV_BTN_TOOL_BRUSH: + case EVDEV_BTN_TOOL_PENCIL: + case EVDEV_BTN_TOOL_AIRBRUSH: + case EVDEV_BTN_TOOL_MOUSE: + case EVDEV_BTN_TOOL_LENS: + case EVDEV_BTN_TOOL_QUINTTAP: + case EVDEV_BTN_TOOL_DOUBLETAP: + case EVDEV_BTN_TOOL_TRIPLETAP: + case EVDEV_BTN_TOOL_QUADTAP: + case EVDEV_BTN_TOOL_FINGER: + case EVDEV_BTN_TOUCH: + return false; + case BTN_STYLUS: + case BTN_STYLUS2: + case BTN_STYLUS3: + return true; + case EVDEV_BTN_MISC ... EVDEV_BTN_DIGI - 1: + case EVDEV_BTN_WHEEL ... EVDEV_BTN_GEAR_UP: + case EVDEV_BTN_DPAD_UP ... EVDEV_BTN_DPAD_RIGHT: + case EVDEV_BTN_TRIGGER_HAPPY ... EVDEV_BTN_TRIGGER_HAPPY40: + return true; + } + + return false; +} + +/** + * Returns true if the usage is a real key, i.e. KEY_FOO + * excluding the various BTN_ ranges + */ +static inline bool +evdev_usage_is_key(evdev_usage_t usage) +{ + switch (evdev_usage_as_uint32_t(usage)) { + case EVDEV_KEY_ESC ... EVDEV_KEY_MICMUTE: + case EVDEV_KEY_OK ... EVDEV_KEY_LIGHTS_TOGGLE: + case EVDEV_KEY_ALS_TOGGLE ... EVDEV_BTN_TRIGGER_HAPPY - 1: + return true; + } + + return false; +} + struct evdev_event { /* this may be a value outside the known usages above but it's just an int */ evdev_usage_t usage;