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: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1230>
This commit is contained in:
Peter Hutterer 2025-06-16 15:56:47 +10:00
parent 9b28e7fd35
commit 6f403a0cc9
4 changed files with 74 additions and 83 deletions

View file

@ -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))

View file

@ -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);

View file

@ -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)
{

View file

@ -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;