Thread (17 messages) flat view 17 messages, 4 authors, 2024-08-16

Re: [PATCH] [v2] Input: increase max button number to 0x340

From: Peter Hutterer <hidden>
Date: 2024-08-16 00:58:34

This one apparently slipped through,

On Thu, Aug 08, 2024 at 06:42:37PM +0200, Tomasz Pakuła wrote:
[...]
I dug around the kernel some more, and have few ideas and questions I would like
to pose, before I send out another patch and make a fool of myself.

1. For the compatible solution, and I know this might sound
sacreligious, but would it be at all considered ok, if joysticks could
use the KEY_MACRO range?  Current behavior in hid-input.c is to just
add (BTN_TRIGGER_HAPPY - 0x10) after 16 buttons.  KEY_MACRO range lies
directly beneath TRIGGER_HAPPY so we would only replace
BTN_TRIGGER_HAPPY with KEY_MACRO1. I know this is not their intended
use, but their description says "Some keyboards have keys which do not
have a defined meaning, these keys are intended to be programmed /
bound to macros by the user"
iirc the hid-input.c behaviour is fallthrough behaviour rather than "we
explicitly map it to this", right?

Either way, the KEY_MACRO range has an explicit meaning and if you start
re-using this for something else it's the same problem as mentioned
elsewhere - you now expect all of userspace to encode those special
exceptions forever just to make the kernel patches a bit easier. That's
... not ideal ;)
Binding buttons to do some actions sounds just like a dame controller,
in a way :P I already tested this change and it enabled over 40
additional buttons without the need to intervene in software. This was
picked up by SDL, proton, firefox and basically
everything, as these usages are obviously not crossing KEY_MAX.

To squeeze just a little bit more, we could utilize the BTN_0 to BTN_9
range. I couldn't find their meaning, but I suppose the definition of
a joystick/gamepad could be stretched to include these.
They're used by e.g. wacom tablets for the physical tablet buttons (not
those on the stylus but on the actual tablet). And their meaning is
basically "numbered buttons without an explicit meaning". Using those
will likely get your device tagged as tablet though, you'd need to
double-check what udev's builtin-input_id does to make sure otherwise
we'll have to quirk every device one-by-one.

Cheers,
  Peter
 
2. For the better, more scalable solution, your proposition from the
start is the best one.
I thought that overflowing buttons could be just hardcoded to one
selected usage in
hid-input.c. Be it BTN_MISC, BTN_JOYSTICK. Deduplication would make sure, they
don't actually send any bogus EV_KEY events.

Let's take a look at usage setup in hid-input.c
We can see that if a usage is from EV_KEY range, EV_MSC usage is always appended
and it will send not only EV_KEY events, but EV_MSC MSC_SCAN events as well.

if (usage->type == EV_KEY) {
    set_bit(EV_MSC, input->evbit);
    set_bit(MSC_SCAN, input->mscbit);
}

This sadly comes AFTER deduplication. It would probably be better to
set it explicitly in the
joystick/gamepad switch entry. MSC_SCAN already has a value that seems
to depend on the
button number, but a dedicated MSC_PROG_KEY would indeed be better
suited for this, along
with MSC_PROG_VAL, as you said, as MSC_SCAN and MSC_PROG_KEY would not contain
it. Or maybe we could do some bit magic and send the state with the
value. MSG could indicate
state. This is a bit less self explanatory but we only need to handle one event.

Now, software such as SDL could be changed so it doesn't care about
usages at all, and
gets the button number from these two. A legacy path could be retained
as detection could be
based on the existence of these MSC_PROG_* events.

Cheers
Tomasz
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help