我在一台配有 ELAN 触摸屏和 DELL 750-AAHC 有源触控笔的笔记本电脑上使用 Kubuntu 16.04 (xenial)。触控笔上的一个按钮用作鼠标中键,而我希望将其改为鼠标右键。
我可以这样做
$ xinput set-button-map "ELAN Touchscreen Pen" 1 3 2
(即将必须与右侧按钮对应的按钮 3 的功能映射到物理按钮 2)。
这正是我想要的,但是改变不是永久的。
我添加了命令~/.xsessionrc
(根据这篇文章的答案),所以当我重新启动时它会自动运行,但按钮映射“随机”自行恢复为默认值:它按预期工作了一段时间,突然我发现它没有,所以我得到
$ xinput get-button-map "ELAN Touchscreen Pen"
1 2 3 4 5
我必须手动重新映射它。
我尝试了一些“可疑”的事情,想看看是什么导致了恢复,但我没能找到原因。这不是由
- 暂停笔记本电脑或关闭屏幕
- 旋转屏幕(这是值得怀疑的,因为 xinput 用于旋转来转换输入矩阵。)
- 切换触摸屏、触摸板或手写笔输入的打开/关闭(也可以使用 xinput)。
重要更新:
我发现这个问题并不只出现在触控笔上:我之前因为某种原因通过以下方式禁用了屏幕的手指触摸功能(“ELAN 触摸屏”):
$ 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 Plasma 5.5.5
- Qt 5.5.1
- 内核 4.13.0-32-通用#35~16.04.1-Ubuntu 64 位
xinput 版本 1.6.2
服务器上的 XI 版本:2.3
X.Org X 服务器 1.19.5
发布日期: 2017-10-12
X 协议版本 11,修订版 0
答案1
这似乎是一个错误(触摸屏设备随机断开连接并重新连接为新设备,其副作用是将所有设置重置为默认值)。
作为一种解决方法,你可以创建自己的udev规则(文件名基于Daniel Drake 提出的这些建议)将运行一个脚本,每当触摸屏重新连接时,该脚本就会重新应用 xinput 更改:
sudo nano /etc/udev/rules.d/10-custom-elan.rules
并添加以下包含“供应商编号”和“id产品”信息(来自您的系统日志)。 这绝对路径到“elan.sh”必须使用。
ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="2073", RUN+="/home/username/elan.sh"
(大致翻译为“当找到与指定属性匹配的设备时,运行指定的脚本”)。
然后创建要运行的实际脚本新输入:
nano /home/username/elan.sh
包含以下几行:
#!/usr/bin/env bash
#These lines allow the script to be called by udev rules
export DISPLAY=":0"
export XAUTHORITY="/home/username/.Xauthority"
#Command to remap buttons
xinput set-button-map "ELAN Touchscreen Pen" 1 3 2 4 5
当然还要使其可执行:
chmod +x /home/username/elan.sh
如果没有出口行,当您(活动用户)直接调用该脚本时,该脚本可以工作,但当由 udev(根用户)调用时,该脚本无法工作。详细信息可参见这和这答案,但这里有一个简短的总结:
要在用户的桌面上启动图形程序,您需要两样东西:地址(用户桌面所在的显示器)和授权。当用户登录时,登录管理器会通过生成 cookie、将其添加到服务器并将其写入 $HOME/.Xauthority 传递给用户来授权与 X 服务器的连接。然后,root 用户应该能够通过了解用户使用的显示器并访问 Xauthority cookie 来连接。这就是出口线路实现。
笔记:显示号码硬编码的事实在某些情况下可能会导致问题,但在这种使用场景(个人笔记本电脑的单个用户)下,它可能没问题。