记一次实现电磁笔靠近屏幕时自动禁用触摸屏
in with 4 comment

记一次实现电磁笔靠近屏幕时自动禁用触摸屏

in with 4 comment

太长不看

脚本可以从AutoDisableTouchscreen下载,分别填入自己的触摸屏及电磁屏设备名称后运行即可使用。

起因

前段时间在海鲜市场上收了一块酷比魔方i7手写板。根据它的名字就可以看出,这部平板最明显的特征就是支持Wacom的手写笔,也正是这一点吸引了我购入。然而实际体验一言难尽,在此就不展开说了。

言归正传,Windows有个很人性化的功能,可以在电磁笔靠近屏幕时自动关闭触摸输入,方便用户将手放在屏幕上书写,避免了悬空操作的窘态。然而Linux上似乎没有这样的工具,只得尝试自己写一个。

历程

查阅manpage后得知,xinput list可以列出所有的输入设备。

 $ xinput list
⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ……
⎜   ↳ Wacom HID 104 Pen stylus                  id=10   [slave  pointer  (2)]
⎜   ↳ Wacom HID 104 Pen eraser                  id=14   [slave  pointer  (2)]
⎜   ……
⎜   ↳ FTSC1000:00 2808:5012                     id=11   [slave  pointer  (2)]
    ……

我们可以从中找到数位屏和触摸屏对应的设备,此处是1011。由于我的手写笔不带橡皮功能,就不考虑另一端的情况了。

xinput query-state可以获取指定输入设备的状态信息,我们先运行一下。

xinput query-state 'Wacom HID 104 Pen stylus'
......
ValuatorClass Mode=Absolute Proximity=In
......
xinput query-state 'Wacom HID 104 Pen stylus'
......
ValuatorClass Mode=Absolute Proximity=Out
......

经过尝试后发现Proximity反映了电磁笔是否接近屏幕。

xinput enablexinput disable又分别可以启用和禁用输入设备。至此我们就知道该怎么做了。

这是一段伪代码:

while True:
	if Proximity == In:
		disable touchscreen
	elif Proximity == Out:
		enable touchscreen

结尾

这样虽然解决了问题,但实在算不得优雅。由于不断循环命令性能开销太大,我在结尾加上了sleep 0.5使得脚本每500ms执行一次。如果想要使响应更加快速,可以尝试将这个值调小一些。