我有一支侧面有按钮的手写笔。该按钮发送一个中键单击事件,我希望它发送一个右键单击事件。
这是我的输入设备:
$ xinput
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Microsoft Surface Keyboard Mouse id=9 [slave pointer (2)]
⎜ ↳ Microsoft Surface Keyboard Consumer Control id=10 [slave pointer (2)]
⎜ ↳ Microsoft Surface Keyboard Touchpad id=11 [slave pointer (2)]
⎜ ↳ ipts 1B96:005E UNKNOWN id=12 [slave pointer (2)]
⎜ ↳ ipts 1B96:005E Touchscreen id=14 [slave pointer (2)]
⎜ ↳ ipts 1B96:005E Mouse id=15 [slave pointer (2)]
⎜ ↳ ipts 1B96:005E Pen Pen (0) id=17 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Video Bus id=6 [slave keyboard (3)]
↳ Surface Pro 3/4 Buttons id=7 [slave keyboard (3)]
↳ Microsoft Surface Keyboard Keyboard id=8 [slave keyboard (3)]
↳ ipts 1B96:005E Pen id=13 [slave keyboard (3)]
↳ Microsoft Surface Keyboard Consumer Control id=16 [slave keyboard (3)]
我在 /etc/X11/xorg.conf.d 中创建了一个 .conf 文件(或在 /usr/share/X11/xorg.conf.d 中创建了一个 .conf 文件并遇到相同的问题),如下所示:
Section "InputClass"
Identifier "ipts 1B96:005E Pen Pen (0)"
Option "ButtonMapping" "1 3 2 4 5 6 7"
EndSection
问题是,我的 .conf 文件重新映射了我的触摸板以及手写笔。使用“ipts 1B96:005E Pen”作为标识也有同样的问题。
直接使用 xinput 和 "xinput set-button-map "ipts 1B96:005E Pen Pen (0)" 1 3 2 4 5 6 7" 可以,但我无法让它在挂起等事件中幸存。
修复此配置的最佳方法是什么?
答案1
如中所述xorg.conf 手册页,您需要在您的 InputClass 节中使用一个或多个 Match 参数来将您在此处设置的选项(在本例中为 ButtonMapping)限制为目标设备。这些参数是:
- 匹配产品
- 匹配供应商
- 匹配设备路径
- 匹配PnPID
- 匹配USBID
- 比赛是...(这需要一个完整的设备类型,并且仅接受布尔值;请参阅下面的示例)
注意:MatchUSBID 参数遇到的常见障碍与其中找到的任何十六进制字母的大小写有关。如果您从命令中获取 id,lsusb
那么您就可以了,因为它只生成包含小写字母的输出,但正如您的示例完美说明的那样,其他命令(例如xinput
使用大写字母输出十六进制字符串)。引用上面链接的手册页:
ID 被构造为由“:”分隔的小写十六进制数字。
从您在问题中提供的命令输出中,我可以使用这些匹配条件构造一个 InputClass 节来解决您的问题,尽管我建议尝试它们的不同子集,并最终使用使用最少数量产生您想要的行为的子集匹配条目(为了简单起见,但更重要的是为了可移植性)。
Section "InputClass"
Identifier "Surface Pen"
MatchProduct "Pen Pen (0)"
MatchVendor "ipts"
MatchUSBID "1b96:005e"
MatchIsPointer "true"
Option "ButtonMapping" "1 3 2 4 5 6 7"
EndSection