我有 Ubuntu 16.04 的联想 ThinkPad X230 平板电脑。它有一个可转换的屏幕,当它处于平板电脑模式时,触摸板仍然处于活动状态并弄得一团糟。
我创建了以下脚本并将其绑定到内置按钮之一(通过自定义快捷方式):
#!/bin/bash -e
# Find the TouchPad device ID
ID="$(xinput | grep -ioP 'touchpad.*id=\K[0-9]*')"
if [ "$(LANG=C xinput --list-props "$ID" | awk 'NR==2{print $4}')" == "0" ]; then
# If the device is disabled, then enable it and kill 'onboard' virtual keyboard
xinput enable "$ID"; killall onboard; xrandr -o normal
elif [ "$(LANG=C xinput --list-props "$ID" | awk 'NR==2{print $4}')" == "1" ]; then
# If the device is enabled, then disable it and run 'onboard' virtual keyboard
xinput disable "$ID"; nohup onboard >/dev/null 2>&1 &
fi
该脚本工作正常,但这是一个虚假的解决方案,昨天我花了几个小时来学习如何以正确的方式做到这一点。所以我决定在这里分享这个经验。
要检查设备是否处于平板电脑模式,我们可以读取以下值(
0
或1
):该值由特定事件切换。我们可以捕获这些事件,并可以使用
acpid
高级配置和电源接口事件守护程序将脚本绑定到它们。1.抓住事件。执行
acpi_listen
或netcat -U /var/run/acpid.socket
,在平板模式下转动盖子,然后将其转回。这是一个示例输出:请注意,当盖子关闭/打开时,结果会有所不同:
2.配置
acpid
识别设备模式改变触发的事件。将以下行作为(单个)命令运行到终端中:上述命令将创建文件:
/etc/acpi/events/thinkpad-tablet-enabled
/etc/acpi/events/thinkpad-tablet-disabled
注意:此处不提供盖子打开/关闭的脚本。但它们与上述类似。
3.重新启动
acpid
,以便它可以重新读取事件过滤器,包括您刚刚添加的过滤器:4.
/etc/acpi/thinkpad-touchpad-in-twist-mode.sh
创建将禁用1
和启用0
触摸板的脚本(&&
使其可执行):$DISPAY
和环境变量$XAUTHORITY
,以便分别允许root
(谁运行acpid
进程)访问用户的 X 会话xinput
。$ID
触摸板的。根据输入变量的值,$1
它将启用或禁用触控板。注意:美元符号前的反斜杠
\$
旨在转义命令中的变量(命令替换)扩展cat
。因此,如果您复制/粘贴脚本(而不是使用该cat
方法),您应该手动删除它们。参考:
acpid
- 高级配置和电源接口事件守护进程。w
andawk
和Remove specific words from lines usinggrep -P '\K'
。使用 pa4080 的答案,我必须对其进行更改才能在 Ubuntu 18.04 中工作:在脚本中硬编码我的用户 (
tim
) 并在我的用户上下文中运行脚本。文件
/etc/acpi/events/thinkpad-lid-event
:和
lid.sh.post
:对 'lid' 和 'tabletmode' 进行了另一个变体,只有 2 条规则捕获 ACPI 事件的响应(在操作中使用“%e”,注意引号!):
享受使用脚本...
编辑: $USER 在由 root 使用时并不总是返回结果......所以我用它替换了它: user1="$(who | cut -d ' ' -f1)"