我在带有 ELAN 触摸屏和 DELL 750-AAHC 有源手写笔的笔记本电脑上使用 Kubuntu 16.04 (xenial)。手写笔上的一个按钮充当鼠标中键,我希望它改为右键。
我可以通过这样做来实现这一点
$ xinput set-button-map "ELAN Touchscreen Pen" 1 3 2
(即,将必须与右键对应的按钮3的功能映射到物理按钮2)。
这可以满足我的要求,但更改不是永久性的。
我添加了命令~/.xsessionrc
(根据this post的答案),所以当我重新启动时它会自动运行,但是按钮映射“随机”恢复为默认值:它按预期工作了一段时间,突然我发现它没有,所以我明白了
$ xinput get-button-map "ELAN Touchscreen Pen"
1 2 3 4 5
我必须手动重新映射它。
我尝试了一些“可疑”的事情来查看可能导致恢复的原因,但我无法弄清楚。这不是由
- 暂停笔记本电脑或关闭屏幕
- 旋转屏幕(这是可疑的,因为 xinput 用于旋转以转换输入矩阵。)
- 切换触摸屏、触摸板或触控笔输入的开/关(也可以使用 xinput)。
重要更新:
我发现这个问题并非特定于手写笔:我之前出于某种原因禁用了屏幕的手指触摸功能(“ELAN Touchscreen”),方法是:
$ xinput disable "ELAN Touchscreen"
我刚刚发现它自己回来了(并且手写笔右键单击再次恢复了)。因此,由于这个未知原因,所有 xinput 更改似乎都恢复为默认值。
更新 2
/var/log/syslog
当这种情况再次发生时,我发现了一些可疑条目。时间戳是在我实际上有一段时间没有使用笔记本电脑的时候,所以节能功能可能被激活(我在 9 分钟时有“暗屏”,在 10 分钟时“关闭”;我将尝试能源保存并相应更新)。
下面的模式实际上重复了很多次,每个块之间只有几秒钟的差异。
usb 1-8: USB disconnect, device number 18
usb 1-8: new full-speed USB device number 19 using xhci_hcd
usb 1-8: New USB device found, idVendor=04f3, idProduct=2073
usb 1-8: New USB device strings: Mfr=4, Product=14, SerialNumber=0
usb 1-8: Product: Touchscreen
usb 1-8: Manufacturer: ELAN
input: ELAN Touchscreen Pen as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:04F3:2073.04EE/input/input7548
input: ELAN Touchscreen as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:04F3:2073.04EE/input/input7549
input: ELAN Touchscreen Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:04F3:2073.04EE/input/input7552
hid-multitouch 0003:04F3:2073.04EE: input,hiddev0,hidraw0: USB HID v1.10 Keyboard [ELAN Touchscreen] on usb-0000:00:14.0-8/input0
在每个区块中,除了少数增加的数字外,几乎所有内容都相同。这是用于比较的下一个块:
usb 1-8: USB disconnect, device number 19
usb 1-8: new full-speed USB device number 20 using xhci_hcd
usb 1-8: New USB device found, idVendor=04f3, idProduct=2073
usb 1-8: New USB device strings: Mfr=4, Product=14, SerialNumber=0
usb 1-8: Product: Touchscreen
usb 1-8: Manufacturer: ELAN
input: ELAN Touchscreen Pen as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:04F3:2073.04EF/input/input7554
input: ELAN Touchscreen as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:04F3:2073.04EF/input/input7555
input: ELAN Touchscreen Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:04F3:2073.04EF/input/input7558
hid-mul itouch 0003:04F3:2073.04EF: input,hiddev0,hidraw0: USB HID v1.10 Keyboard [ELAN Touchscreen] on usb-0000:00:14.0-8/input0
设备编号为 128。
系统:
- KDE 等离子 5.5.5
- Qt 5.5.1
- 内核 4.13.0-32-generic #35~16.04.1-Ubuntu 64-bit
xinput 版本 1.6.2
服务器上的 XI 版本:2.3
X.Org X 服务器 1.19.5
发布日期:2017-10-12
X 协议版本 11,修订版 0
这似乎是一个错误(触摸屏设备随机断开连接并重新连接为新设备,这具有将所有设置重置为默认值的副作用)。
作为一种解决方法,您可以创建自己的udev规则(文件名基于Daniel Drake 的这些建议),该规则将运行一个脚本,在触摸屏重新连接时重新应用 xinput 更改:
并添加包含“idVendor”和“idProduct”信息的这一行(来自您的syslog)。必须使用“ elan.sh”的绝对路径。
(大致翻译为“当找到与指定属性匹配的设备时,运行指定脚本”)。
然后创建实际的脚本来运行xinput:
使用以下几行:
当然,让它可执行:
如果没有导出行,脚本在您(活动用户)直接调用时有效,但在 udev(root 用户)调用时无效。详细信息可以在这个和这个答案中找到,但这里有一个简短的总结:
要在用户桌面上启动图形程序,您需要两件事:地址(用户桌面上的显示)和授权。当用户登录时,登录管理器通过生成 cookie 来授权与 X 服务器的连接,将其添加到服务器并通过将其写入 $HOME/.Xauthority 将其传递给用户。然后,root 用户应该能够通过了解用户使用的显示器和访问 Xauthority cookie 来进行连接。这就是出口线实现的目标。
注意:显示号码是硬编码的事实在某些情况下可能会导致问题,但在这种使用场景(个人笔记本电脑的单个用户)中可能会没问题。