xinput 的更改会随机恢复为默认值

xinput 的更改会随机恢复为默认值

我在一台配有 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 来连接。这就是出口线路实现。

笔记:显示号码硬编码的事实在某些情况下可能会导致问题,但在这种使用场景(个人笔记本电脑的单个用户)下,它可能没问题。

相关内容