我有两个罗技轨迹球、一个 Wireless TrackMan FX 和一个 Marble Mouse。两者都在evtest
: BTN_LEFT
、BTN_RIGHT
、BTN_MIDDLE
、中报告相同的按钮集BTN_SIDE
,尽管BTN_EXTRA
它们各自只有四个物理按钮。 TrackMan FX 发送我想要的确切事件:左、右、中和侧。但是,Marble Mouse 发送BTN_EXTRA
而不是BTN_MIDDLE
,所以我想重新映射它。
这个答案似乎完全涵盖了我想要的内容,而 hwdb 看起来是执行此操作的正确位置。唉,它只起作用了一半,我不知道为什么;我怀疑这与单击生成的两个不同的输入事件有关。evtest
报告来自 FX 的工作中点击,如下所示(为了清楚起见,省略了不相关的时间戳):
type 4 (EV_MSC), code 4 (MSC_SCAN), value 90003
type 1 (EV_KEY), code 274 (BTN_MIDDLE), value 1
来自 MarbleMouse 的未经修改的点击:
type 4 (EV_MSC), code 4 (MSC_SCAN), value 90005
type 1 (EV_KEY), code 276 (BTN_EXTRA), value 1
所以我的99-marblebutton.hwdb
文件是这样做的:
evdev:input:b0003v046DpC408*
ID_INPUT_KEY=1
KEYBOARD_KEY_90005=btn_middle
由此产生的输入事件被修改:
type 4 (EV_MSC), code 4 (MSC_SCAN), value 90005
type 1 (EV_KEY), code 274 (BTN_MIDDLE), value 1
因此,我确实收到了一个BTN_MIDDLE
事件,但关联的MSC_SCAN
值仍然错误,这似乎会产生影响,因为中间点击在任何地方都无法识别。事实上,它甚至似乎根本不被视为有效的输入事件:使用libinput debug-events
我可以看到未修改的事件:
event7 POINTER_BUTTON +97.374s BTN_EXTRA (276) pressed, seat count: 1
完成 hwdb 配置后,当我按下同一按钮时不会报告任何内容,因此wev
也看不到事件。
我尝试过的其他事情包括在 swaywm 中重新映射,这种方法有效,但仅在某些应用程序中:
set $MOUSE "1133:50184:Logitech_USB_Trackball"
bindsym --input-device=$MOUSE --whole-window BTN_EXTRA seat - cursor press BTN_MIDDLE
bindsym --input-device=$MOUSE --whole-window --release BTN_EXTRA seat - cursor release BTN_MIDDLE
拦截工具让我编写一个可以“修复”EV_KEY
和EV_MSC
事件的过滤器,但效果类似于 hwdb:事件显示正常,evtest
但 libinput 甚至看不到它们。
Solaar 似乎不支持我的任何设备,而且我太胖了,无法让输入重新映射器做任何有用的事情。