[Bug 244339] x11-servers/xorg-server: Some keys not working (1.20.7 regression)
bugzilla-noreply at freebsd.org
bugzilla-noreply at freebsd.org
Sun Feb 23 22:00:24 UTC 2020
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=244339
--- Comment #6 from Michael Gmelin <grembo at FreeBSD.org> ---
(In reply to Jan Beich from comment #5)
Here is a good howto describing how to use usbhidaction(1),
which is part of base.
https://forums.freebsd.org/threads/howto-using-multimedia-keys-from-uhid-4-devices.24069/
I followed it to construct a little test case on a little Cherry keyboard
(vendor 0x046a product 0x0023) that provides media keys over uhid,
unfortunately this didn't just work out of the box with this keyboard:
# usbhidctl -f /dev/uhid1 -r
Report descriptor:
Collection type=Application page=Consumer usage=Consumer_Control
Input rid=1 pos=0 size=16 count=1 page=Consumer usage=Unassigned Array,
logical range 0..1023
End collection
Collection type=Application page=Generic_Desktop usage=System_Control
Input rid=2 pos=0 size=1 count=1 page=Generic_Desktop
usage=System_Power_Down, logical range 0..1
Input rid=2 pos=1 size=1 count=1 page=Generic_Desktop usage=System_Sleep,
logical range 0..1
Input rid=2 pos=2 size=1 count=1 page=Generic_Desktop usage=System_Wake_Up,
logical range 0..1
End collection
Total input size 3 bytes
Total output size 0 bytes
Total feature size 0 bytes
Reading keys is possible, but it's all part of that Unassigned Array above:
# usbhidctl -f /dev/uhid1 -r -a -l
Report descriptor:
Collection type=Application page=Consumer usage=Consumer_Control
Input rid=1 pos=0 size=16 count=1 page=Consumer usage=Unassigned Array,
logical range 0..1023
End collection
Collection type=Application page=Generic_Desktop usage=System_Control
Input rid=2 pos=0 size=1 count=1 page=Generic_Desktop
usage=System_Power_Down, logical range 0..1
Input rid=2 pos=1 size=1 count=1 page=Generic_Desktop usage=System_Sleep,
logical range 0..1
Input rid=2 pos=2 size=1 count=1 page=Generic_Desktop usage=System_Wake_Up,
logical range 0..1
End collection
Total input size 3 bytes
Total output size 0 bytes
Total feature size 0 bytes
usbhidctl: hid_get_report(rid 1): Device not configured
Consumer:Consumer_Control.Consumer:Unassigned=
Generic_Desktop:System_Control.Generic_Desktop:System_Power_Down=
Generic_Desktop:System_Control.Generic_Desktop:System_Sleep=
Generic_Desktop:System_Control.Generic_Desktop:System_Wake_Up=
Consumer:Consumer_Control.Consumer:Unassigned=0
Consumer:Consumer_Control.Consumer:Unassigned=234
Consumer:Consumer_Control.Consumer:Unassigned=0
Consumer:Consumer_Control.Consumer:Unassigned=233
Consumer:Consumer_Control.Consumer:Unassigned=0
As you can see, there's a problem getting the hid_report for rid 1.
Good news is, that it still reports key events (234 and 233 are
"vol down/vol up").
In theory, writing rules should be possible, e.g.
# cat myconfig
Consumer:Consumer_Control.Consumer:Unassigned 234 0 mixer vol -10
Consumer:Consumer_Control.Consumer:Unassigned 233 0 mixer vol +10
In practice this doesn't work, as the range is limited by usbhidaction:
# usbhidaction -f /dev/uhid1 -c myconfig -v
PARSE:1 Consumer:Consumer_Control.Consumer:Unassigned, -1, 'mixer vol -10'
PARSE:2 Consumer:Consumer_Control.Consumer:Unassigned, -1, 'mixer vol +10'
report size 3
system 'mixer vol +10'
Setting the mixer vol from 75:75 to 85:85.
system 'mixer vol -10'
Setting the mixer vol from 85:85 to 75:75.
The values are cut to -1. So pressing media keys always executes
both actions, not useful (in the example pressing any of the
media keys will issues both commands).
Looking at the code, I hacked in a workaround:
# cat /usr/src/usr.bin/usbhidaction/usbhidaction.c | \
sed "s/range = 1/range = 0/g" >myhidaction.c
# cc -o myhidaction myhidaction.c -lusbhid
With this patch we can now configure actions. In this example, very basic
volume control and controlling audio/cmus (this all runs as root,
not ideal, but left out for simplicity):
# cat myconfig
# voldown
Consumer:Consumer_Control.Consumer:Unassigned 234 0 mixer vol -10
# poor man's mute
Consumer:Consumer_Control.Consumer:Unassigned 226 0 mixer vol 0
# volup
Consumer:Consumer_Control.Consumer:Unassigned 233 0 mixer vol +10
# prev
Consumer:Consumer_Control.Consumer:Unassigned 182 0 cmus-remote --prev
# play/pause
Consumer:Consumer_Control.Consumer:Unassigned 205 0 cmus-remote --pause
# next
Consumer:Consumer_Control.Consumer:Unassigned 181 0 cmus-remote --next
# ./myhidaction -c myconfig -f /dev/uhid1 -v
PARSE:2 Consumer:Consumer_Control.Consumer:Unassigned, 234, 'mixer vol -10'
PARSE:4 Consumer:Consumer_Control.Consumer:Unassigned, 226, 'mixer vol 0'
PARSE:6 Consumer:Consumer_Control.Consumer:Unassigned, 233, 'mixer vol +10'
PARSE:8 Consumer:Consumer_Control.Consumer:Unassigned, 182, 'cmus-remote
--prev'
PARSE:10 Consumer:Consumer_Control.Consumer:Unassigned, 205, 'cmus-remote
--pause'
PARSE:12 Consumer:Consumer_Control.Consumer:Unassigned, 181, 'cmus-remote
--next'
report size 3
system 'cmus-remote --pause'
PARSE:2 Consumer:Consumer_Control.Consumer:Unassigned, 234, 'mixer vol -10'
PARSE:4 Consumer:Consumer_Control.Consumer:Unassigned, 226, 'mixer vol 0'
PARSE:6 Consumer:Consumer_Control.Consumer:Unassigned, 233, 'mixer vol +10'
PARSE:8 Consumer:Consumer_Control.Consumer:Unassigned, 182, 'cmus-remote
--prev'
PARSE:10 Consumer:Consumer_Control.Consumer:Unassigned, 205, 'cmus-remote
--pause'
PARSE:12 Consumer:Consumer_Control.Consumer:Unassigned, 181, 'cmus-remote
--next'
system 'mixer vol +10'
Setting the mixer vol from 20:20 to 30:30.
system 'mixer vol +10'
Setting the mixer vol from 30:30 to 40:40.
system 'mixer vol +10'
Setting the mixer vol from 40:40 to 50:50.
system 'mixer vol +10'
Setting the mixer vol from 50:50 to 60:60.
system 'mixer vol +10'
Setting the mixer vol from 60:60 to 70:70.
system 'mixer vol +10'
Setting the mixer vol from 70:70 to 80:80.
system 'mixer vol +10'
Setting the mixer vol from 80:80 to 90:90.
system 'cmus-remote --pause'
system 'cmus-remote --pause'
So that's good enough for me for demonstration purposes. I hardly
ever use that keyboard, but I thought leaving this here still might
be useful.
--
You are receiving this mail because:
You are the assignee for the bug.
More information about the freebsd-x11
mailing list