web-dev-qa-db-ja.com

蓋がねじれている、または閉じているときにタッチパッドを無効にするにはどうすればよいですか?

Ubuntu 16.04を搭載したLenovo ThinkPad X230タブレットを使用しています。 コンバーチブルスクリーン があり、タブレットモードの場合、タッチパッドはまだアクティブで混乱します。

次のスクリプトを作成し、組み込みのボタンの one にバインドしました( カスタムショートカット によって)。

#!/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

スクリプトは正常に動作しますが、これは偽のソリューションであり、昨日、適切な方法でそれを行う方法を学ぶために数時間を費やしました。そこで、この経験をここで共有することにしました。

2
pa4080

デバイスがタブレットモードかどうかを確認するには、次の値(0または1)を読み取ることができます。

/sys/devices/platform/thinkpad_acpi/hotkey_tablet_mode

この値は、特定のイベントによって切り替えられます。 acpid -Advanced Configuration and Power Interfaceイベントデーモンを使用して、これらのイベントをキャッチし、スクリプトをバインドできます。


1.イベントをキャッチします。 acpi_listenまたはnetcat -U /var/run/acpid.socketを実行し、タブレットモードでふたを回してから元に戻します。出力例を次に示します。

$ acpi_listen
video/tabletmode TBLT 0000008A 00000001
video/tabletmode TBLT 0000008A 00000000

蓋が閉じている/開いているときは結果が異なることに注意してください:

$ acpi_listen
button/lid LID close
button/lid LID open

2.デバイスモードの変更によってトリガーされたイベントを認識するようにacpidを構成します。以下の行を(単一の)コマンドとして端末で実行します。

cat << EOF | Sudo tee /etc/acpi/events/thinkpad-tablet-enabled
# /etc/acpi/events/thinkpad-tablet-enabled
# This is called when the lid is placed in tablet position on
# Lenovo ThinkPad X230 Tablet

event=video/tabletmode TBLT 0000008A 00000001
action=/etc/acpi/thinkpad-touchpad-twist-mode.sh 1
EOF
cat << EOF | Sudo tee /etc/acpi/events/thinkpad-tablet-disabled
# /etc/acpi/events/thinkpad-tablet-disabled
# This is called when the lid is placed in normal position on
# Lenovo ThinkPad X230 Tablet

event=video/tabletmode TBLT 0000008A 00000000
action=/etc/acpi/thinkpad-touchpad-twist-mode.sh 0
EOF

上記のコマンドはファイルを作成します:

  • /etc/acpi/events/thinkpad-tablet-enabled
  • /etc/acpi/events/thinkpad-tablet-disabled

注:ふたの開閉のスクリプトはここでは提供されません。しかし、それらは上記と似ています。


3.acpidを再起動して、追加したイベントフィルターを含むイベントフィルターを再読み取りできるようにします。

Sudo systemctl restart acpid.service

4.タッチパッドの/etc/acpi/thinkpad-touchpad-in-twist-mode.shを無効にし、1を有効にするスクリプト0を作成します(&&実行可能にします)

cat << EOF | Sudo tee /etc/acpi/thinkpad-touchpad-twist-mode.sh && Sudo chmod +x /etc/acpi/thinkpad-touchpad-twist-mode.sh
#!/bin/sh
LANG=C                                                                                                        # Ensure stable parsing
export DISPLAY="\$(w | awk 'NF > 7 && \$2 ~ /tty[0-9]+/ {print \$3; exit}' 2>/dev/null)"                      # Get and export the current user's \$DISPAY
export XAUTHORITY="/home/\$(w | awk 'NF > 7 && \$2 ~ /tty[0-9]+/ {print \$1; exit}' 2>/dev/null)/.Xauthority" # Get and export the currentuser's \$XAUTHORITY
ID="\$(xinput | grep -ioP 'touchpad.*id=\K[0-9]*')"                                                           # Find the TouchPad device ID

if   [ "\${1}" -eq 0 ]; then xinput enable "\$ID"   # Laptop mode or Lid is open
Elif [ "\${1}" -eq 1 ]; then xinput disable "\$ID"  # Tablet mode or Lid is closed
fi
EOF
  • スクリプトは、現在のユーザーのセッションの環境変数$DISPAYおよび$XAUTHORITYを解析およびエクスポートし、rootacpidプロセスを実行するユーザー)がユーザーのXセッションにそれぞれアクセスできるようにします。それぞれxinput
  • 次に、スクリプトはタッチパッドの$IDを解析します。そして、入力変数$1の値に応じて、touckpadを有効または無効にします。

注:ドル記号\$の前のバックスラッシュは、catコマンド内の変数(コマンド置換)展開をエスケープするためのものです。そのため、(catアプローチの代わりに)スクリプトをコピー/貼り付けする場合は、手動で削除する必要があります。


参照:

2
pa4080

pa4080の答えを使用して、

Ubuntu 18.04で動作させるには、この変更を行う必要がありました。スクリプトでユーザーをハードコーディングし、ユーザーのコンテキストでスクリプトを実行します。

ファイル:/ etc/acpi/events/thinkpad-lid-event

event=button/lid.*
action=su tim -c '/home/tim/scripts/lid.sh.post'

また、lid.sh.postは

#! /bin/bash
# toggle touchpad enabled status when lid changes (lid closed,touchpad off)
# is run in user context
# 
# example rule /etc/acpi/events/thinkpad-lid-close
# event=button/lid.*
# action=su tim -c '/home/tim/scripts/lid.sh.post'  
#
# see https://askubuntu.com/questions/91534/disable-touchpad-while-the-lid-is-down
# and https://askubuntu.com/questions/980997/how-do-i-disable-the-touchpad-when-the-lid-is-twisted-or-closed/980999#980999
# this needs an event defined in /etc/acpi/events to call this script when lid status changes
# these variables need to be set to use xinput properly
export XAUTHORITY=`ls -1 /home/$USER/.Xauthority | head -n 1`
export DISPLAY=":`ls -1 /tmp/.X11-unix/ | sed -e s/^X//g | head -n 1`"

export TouchPadID=$(xinput | grep 'TouchPad' | sed  -n "s/^.*id=\([[:digit:]]\+\).*$/\1/p")
grep -q closed /proc/acpi/button/lid/*/state
LidClosedResult=$?
xinput set-int-prop  $TouchPadID "Device Enabled" 8 $LidClosedResult
if [ $? -eq 0 ]
then
echo "for user: $USER xinput device $TouchPadID enabled status changed to $LidClosedResult because of LID ACPI event" | systemd-cat
else
        echo "failed to change xinput device $TouchPadID enabled status after LID ACPI event" | systemd-cat
fi

1
Tim Richardson