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

我在带有ELAN触摸屏和DELL 750-AAHC有源手写笔的笔记本电脑上使用Kubuntu 16.04(xenial)。 手写笔上的一个按钮表现为鼠标中键,我希望它是一个右键。

我可以做到这一点

$ xinput set-button-map "ELAN Touchscreen Pen" 1 3 2 

(即,将必须对应于右按钮的按钮3的function映射到物理按钮2)。

这就是我想要的,但改变不是永久性的。

我在~/.xsessionrc添加了命令(根据这篇文章中的答案 ),所以当我重启时它会自动运行,但按钮映射“随机”会自动恢复为默认值:它按预期工作了一段时间,并且突然间我发现它没有,所以我明白了

 $ xinput get-button-map "ELAN Touchscreen Pen" 1 2 3 4 5 

我必须手动重新映射它。

我尝试了几个“可疑”的东西,看看可能有什么责任归还,但我无法弄清楚。 这不是由

  • 暂停笔记本电脑或关闭屏幕
  • 旋转屏幕(这是可疑的,因为xinput用于旋转以转换输入矩阵。)
  • 打开/关闭触摸屏,触摸板或手写笔输入(也使用xinput)。

重要更新

我发现这个问题不是手写笔特有的:我之前由于某种原因禁用了屏幕的手指触摸function(“ELAN触摸屏”):

 $ xinput disable "ELAN Touchscreen" 

我刚刚发现它自己回来了(手写笔右键再次恢复)。 因此,似乎所有xinput更改都会因为这个未知原因而恢复为默认值。

更新2

当发生这种情况时,我在/var/log/syslog发现了一些可疑条目。 时间戳是在我实际上没有使用笔记本电脑一段时间的时间,因此节能function可能已激活(我在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-通用#35~16.04.1-Ubuntu 64位
  • xinput版本1.6.2

    服务器上的XI版本:2.3

  • X.Org X Server 1.19.5

    发布日期:2017-10-12

    X协议版本11,修订版0

这似乎是一个错误(触摸屏设备随机断开并重新连接为新设备的事实,其具有将所有设置重置为默认值的副作用)。

作为一种解决方法,您可以创建自己的udev规则(基于Daniel Drake的这些建议的文件名),该规则将运行脚本,以便在触摸屏重新连接时重新应用xinput更改:

 sudo nano /etc/udev/rules.d/10-custom-elan.rules 

并添加包含“idVendor”“idProduct”信息的这一行(来自您的系统日志 )。 必须使用“elan.sh”绝对路径

 ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="2073", RUN+="/home/username/elan.sh" 

(当找到与指定属性匹配的设备时,大致转换为“”,运行指定的脚本“)。

然后创建实际脚本来运行xinput

 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(root用户)调用时不起作用。 详细信息可以在这个和这个答案中找到,但这里有一个简短的总结:

要在用户桌面上启动图形程序,您需要两件事:地址(用户桌面显示的内容)和授权。 当用户登录时,登录管理器通过生成cookie,将其添加到服务器并通过将其写入$ HOME / .Xauthority将其传递给用户来授权与X服务器的连接。 然后,root用户应该能够通过了解用户使用的显示以及访问Xauthority cookie来进行连接。 这就是出口部门的目标。

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