xorg .conf 文件重新映射所有设备的按钮,而不仅仅是指定的设备

xorg .conf 文件重新映射所有设备的按钮,而不仅仅是指定的设备

我有一支侧面有按钮的手写笔。该按钮发送一个中键单击事​​件,我希望它发送一个右键单击事件。

这是我的输入设备:

$ 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

相关内容