タッチスクリーンの切り替え:

タッチスクリーンの切り替え:

背景情報:
私のラップトップのタッチスクリーンに問題があったので、それを処理するために起動時に特別なBashスクリプトを使用しましたが、最近はGNUの推奨事項とさらに一致するようにPureOSをインストールしました。私はWaylandエコシステムでxinputにリモートで近いものを見つけることをあきらめましたが、絶対に強制しない限り、レガシーソフトウェアを実行するのは好きではありません.ドライバのような方法や libinput が提供する情報を操作することは役に立ちません。タッチスクリーンのほぼ疑似ランダム動作を停止した唯一のコマンドはDivineでしたevtest --grab。タッチスクリーンを無効にしないと、仕事用ノートブックはTTYを除いて全く役に立たないことを強調したいと思います。


重要な部分:
スクリプトを作成しようとしました。

  1. 入力デバイスのリストを検索します。cat /proc/bus/input/devices
  2. 段落を見つけるために出力を解析します"ELAN0732:00 04F3:264C"(使用してみましたが、awkよく理解していません)。
  3. 上記と区別してください"ELAN0732:00 04F3:264C Pen"(これは2つの異なるデバイスです。ペンは問題を引き起こすことはありませんが、必要ではないので、これについても無効にしても構いません)
  4. その段落で再起動するたびに、Nがランダムに指定されたステートメントを見つけます(/eventN使用)。grepawk
  5. 走るsudo evtest --grab /dev/input/event$N > /dev/null

次に、起動時にroot権限で実行される場所にこのスクリプトを配置します(これを見たことがありますが、/etc/rc.localまだ試していません)。

evtestすでに入力デバイスを1行で印刷しており、そのためのバリエーションをまとめました。

sudo timeout 2 evtest --grab | grep "ELAN073 | grep "ELAN0732:00 04F3:264C"

しかしgrep、正しく解析されませんが(おそらくstdoutがパイプされる方法のために)timeoutコマンドを実行し、出力をパイピングし、コマンドを終了して解析するよりも、上記の手順に従って解析する方が良いかもしれません。 。もう一度実行してみてください。/proc/bus/input/devicesawk


追加情報:
PureOS 9.0(Debian テストベース)、Linux 4.19.0-5-amd64
cat /proc/bus/input/devicesは以下を印刷します。

N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
S: Sysfs=/devices/platform/i8042/serio0/input/input0
U: Uniq=
H: Handlers=sysrq kbd leds event0 
B: PROP=0
B: EV=120013
B: KEY=20000 20 0 0 1500f02100000 3803078f900d401 feffffdfffefffff fffffffffffffffe
B: MSC=10
B: LED=7

I: Bus=0019 Vendor=0000 Product=0001 Version=0000
N: Name="Power Button"
P: Phys=PNP0C0C/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input2
U: Uniq=
H: Handlers=kbd event1 
B: PROP=0
B: EV=3
B: KEY=10000000000000 0

I: Bus=0019 Vendor=0000 Product=0005 Version=0000
N: Name="Lid Switch"
P: Phys=PNP0C0D/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0D:00/input/input3
U: Uniq=
H: Handlers=event2 
B: PROP=0
B: EV=21
B: SW=1

I: Bus=0019 Vendor=0000 Product=0001 Version=0000
N: Name="Power Button"
P: Phys=LNXPWRBN/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXPWRBN:00/input/input4
U: Uniq=
H: Handlers=kbd event3 
B: PROP=0
B: EV=3
B: KEY=10000000000000 0

I: Bus=0019 Vendor=0000 Product=0006 Version=0000
N: Name="Video Bus"
P: Phys=LNXVIDEO/video/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:14/LNXVIDEO:02/input/input6
U: Uniq=
H: Handlers=kbd event4 
B: PROP=0
B: EV=3
B: KEY=3e000b00000000 0 0 0

I: Bus=0011 Vendor=0002 Product=0007 Version=01a1
N: Name="SynPS/2 Synaptics TouchPad"
P: Phys=isa0060/serio1/input0
S: Sysfs=/devices/platform/i8042/serio1/input/input5
U: Uniq=
H: Handlers=mouse2 event9 
B: PROP=5
B: EV=b
B: KEY=e520 10000 0 0 0 0
B: ABS=660800011000003

I: Bus=0019 Vendor=0000 Product=0000 Version=0000
N: Name="HP Wireless hotkeys"
P: Phys=hpq6001/input0
S: Sysfs=/devices/virtual/input/input13
U: Uniq=
H: Handlers=kbd event10 rfkill 
B: PROP=0
B: EV=3
B: KEY=80000000000000 0 0 0

I: Bus=0010 Vendor=001f Product=0001 Version=0100
N: Name="PC Speaker"
P: Phys=isa0061/input0
S: Sysfs=/devices/platform/pcspkr/input/input14
U: Uniq=
H: Handlers=kbd event11 
B: PROP=0
B: EV=40001
B: SND=6

I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="HD-Audio Generic HDMI/DP,pcm=3"
P: Phys=ALSA
S: Sysfs=/devices/pci0000:00/0000:00:08.1/0000:03:00.1/sound/card0/input15
U: Uniq=
H: Handlers=event12 
B: PROP=0
B: EV=21
B: SW=140

I: Bus=0003 Vendor=04f2 Product=b634 Version=0012
N: Name="HP Wide Vision FHD Camera: HP W"
P: Phys=usb-0000:03:00.4-1/button
S: Sysfs=/devices/pci0000:00/0000:00:08.1/0000:03:00.4/usb3/3-1/3-1:1.0/input/input16
U: Uniq=
H: Handlers=kbd event13 
B: PROP=0
B: EV=3
B: KEY=100000 0 0 0

I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="HD-Audio Generic Mic"
P: Phys=ALSA
S: Sysfs=/devices/pci0000:00/0000:00:08.1/0000:03:00.6/sound/card1/input17
U: Uniq=
H: Handlers=event5 
B: PROP=0
B: EV=21
B: SW=10

I: Bus=0019 Vendor=0000 Product=0000 Version=0000
N: Name="HP WMI hotkeys"
P: Phys=wmi/input0
S: Sysfs=/devices/virtual/input/input19
U: Uniq=
H: Handlers=kbd event6 
B: PROP=0
B: EV=33
B: KEY=4000000000 0 1000700000000 2102400 0 0
B: MSC=10
B: SW=0

I: Bus=0003 Vendor=04f2 Product=b634 Version=0012
N: Name="HP Wide Vision FHD Camera: HP I"
P: Phys=usb-0000:03:00.4-1/button
S: Sysfs=/devices/pci0000:00/0000:00:08.1/0000:03:00.4/usb3/3-1/3-1:1.2/input/input20
U: Uniq=
H: Handlers=kbd event14 
B: PROP=0
B: EV=3
B: KEY=100000 0 0 0

I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="HD-Audio Generic Headphone"
P: Phys=ALSA
S: Sysfs=/devices/pci0000:00/0000:00:08.1/0000:03:00.6/sound/card1/input18
U: Uniq=
H: Handlers=event7 
B: PROP=0
B: EV=21
B: SW=4

# THIS IS THE PARAGRAPH I NEED
I: Bus=0018 Vendor=04f3 Product=264c Version=0100
N: Name="ELAN0732:00 04F3:264C"
P: Phys=i2c-ELAN0732:00
S: Sysfs=/devices/platform/AMDI0010:00/i2c-0/i2c-ELAN0732:00/0018:04F3:264C.0001/input/input21
U: Uniq=
H: Handlers=mouse0 event8 #THIS IS THE EVENT NUMBER I NEED
B: PROP=2
B: EV=1b
B: KEY=400 0 0 0 0 0
B: ABS=3273800000000003
B: MSC=20

# THIS PARAGRAPH SHOULD BE IGNORED, OR BOTH CAN BE USED, BUT NOT EXCLUSIVELY THIS ONE
I: Bus=0018 Vendor=04f3 Product=264c Version=0100
N: Name="ELAN0732:00 04F3:264C Pen"
P: Phys=i2c-ELAN0732:00
S: Sysfs=/devices/platform/AMDI0010:00/i2c-0/i2c-ELAN0732:00/0018:04F3:264C.0001/input/input24
U: Uniq=
H: Handlers=mouse1 event15 
B: PROP=0
B: EV=1b
B: KEY=c03 0 0 0 0 0
B: ABS=1000003
B: MSC=10

I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="BRLTTY 5.6 Linux Screen Driver Keyboard"
P: Phys=pid-692/brltty/14
S: Sysfs=/devices/virtual/input/input27
U: Uniq=
H: Handlers=sysrq kbd event16 
B: PROP=0
B: EV=100003
B: KEY=402000007 ffc03078f800d2a9 f2beffdfffefffff fffffffffffffffe

I: Bus=0005 Vendor=045e Product=082f Version=0206
N: Name="Microsoft Bluetooth Mouse Mouse"
P: Phys=80:2B:F9:52:CA:DC
S: Sysfs=/devices/virtual/misc/uhid/0005:045E:082F.0002/input/input28
U: Uniq=DD:47:30:64:95:63
H: Handlers=mouse3 event17 
B: PROP=0
B: EV=17
B: KEY=1f0000 0 0 0 0
B: REL=143
B: MSC=10

I: Bus=0005 Vendor=045e Product=082f Version=0206
N: Name="Microsoft Bluetooth Mouse Keyboard"
P: Phys=80:2B:F9:52:CA:DC
S: Sysfs=/devices/virtual/misc/uhid/0005:045E:082F.0002/input/input29
U: Uniq=DD:47:30:64:95:63
H: Handlers=sysrq kbd event18 
B: PROP=0
B: EV=100013
B: KEY=1000000000007 ff800000000007ff febeffdff3cfffff fffffffffffffffe
B: MSC=10

I: Bus=0005 Vendor=045e Product=082f Version=0206
N: Name="Microsoft Bluetooth Mouse"
P: Phys=80:2B:F9:52:CA:DC
S: Sysfs=/devices/virtual/misc/uhid/0005:045E:082F.0002/input/input30
U: Uniq=DD:47:30:64:95:63
H: Handlers=event19 
B: PROP=0
B: EV=9
B: ABS=10000000000

I: Bus=0005 Vendor=0000 Product=0000 Version=0000
N: Name="00:0A:45:0A:FB:49"
P: Phys=
S: Sysfs=/devices/virtual/input/input33
U: Uniq=
H: Handlers=kbd event20 
B: PROP=0
B: EV=100007
B: KEY=2fc800 145200000000 0 10300 49e800000c00 e16800000000f f810000010000ffc
B: REL=0

答え1

これは適切なawkスクリプトでなければなりません。

device=$( cat /proc/bus/input/devices |
  awk '
  /"ELAN0732:00 04F3:264C"/{ inside = 1 }
  /Handlers=/  { if(match($0,"event([0-9]+)",group))event = group[1] }
  /^$/         { if(inside && event!="")print "/dev/input/event" event
                 inside = 0; event = ""
  }')
if [ -n "$device" ]
then sudo evtest --grab "$device" > /dev/null &
fi

最初の行は、必須文字列と一致し、inside正しいセクションにあることを示す変数を設定します。次の行では、正規表現を見つけてHandlers使用し、数値を配列としてキャプチャしてから変数を設定します。match(string, regexp, returnarray)event[0-9]+()groupevent

最後に、各セクションの終わり(最後のセクションを含む)の空白行を一致させ、内部にあり、イベント番号がある場合は、イベント番号に関連付けられているデバイスパスを印刷します。

awkがGNUではなくPOSIXの場合は、Handlers行を次のように置き換えます。

/Handlers=/{ if(split($0,part,"event"))event = part[2]+0 }

「event」という単語で行を分割し、次の文字を数値に変換します。

上記のスクリプトを直接作成した場合は/etc/rc.local必ず実行していただきsudo chmod +x /etc/rc.local、そうでなければ実行されません。

Systemdが起動時に中断されないようにするには、コマンドの最後が&必要です(続行する前にシャットダウンすることを期待し、稼働時間全体を実行する必要があるため)。メモリを節約するためにタッチスクリーンの使用状況を報告するために使用される標準出力を/dev/null無視します。evtest追加は/dev/nullマイナーかもしれませんが、害はありません。

答え2

ああ。この質問に感謝します。実際にタッチスクリーンを無効にする方法に対する答えを得ました。私は大丈夫でしたが、突然非常に弾道になり、画面上のすべてをクリックし続けました。

受け入れられたソリューションは素晴らしく素晴らしいですが、実際に理解できる非常に基本的なソリューションが必要です。したがって、通常のシェルの場合は次のようになります。

sudo evtest --grab /dev/input/$(grep "SYNA2393" -A 5 /proc/bus/input/devices | grep "Handlers=" | cut -d" " -f 3)

これは許容されるソリューションより脆弱であるため、読者がハードコーディングを好まない限り、それを使用することをお勧めします。

答え3

Ubuntu 22.04を新しくインストールしています。私はawkのマッチング機能をどのように機能させるのかわからなかったので、@meuhと@JinnKoのコードを使ってキーワードを指定した複数のデバイスを無効に/切り替えることができるawk以外のバージョンを作成しました。

まず、evtestがインストールされていることを確認してください。

sudo apt install evtest

2つのファイルがあります。 1つはタッチスクリーンをオン/オフすること、もう1つは起動時に常に無効にすることです。

タッチスクリーンの切り替え:

#!/bin/bash
# This toggles my touchscreen
#search for "Touchscreen" or something like that in /proc/bus/input/devices to make sure you're disabling what you want to disable.

path_for_temp_files="/ANY_PATH_YOU_WANT_TO_STORE_SOME_PID_FILES/"
regex='event([0-9]+)'
DEVICE="Touchscreen"

if [ -r "${path_for_temp_files}touchscreen-evtest0.pid" ]; then
    kill_these_files=("${path_for_temp_files}"touchscreen-evtest*)

    for i in "${kill_these_files[@]}"; do
        echo "kill" $(cat "${i}")
        sudo kill $(cat "${i}")
        sudo rm "${i}"
    done  

else
    filename='/proc/bus/input/devices'
    inside=0
    events=()
    while read line; do
        if [[ $line =~ $DEVICE ]]; then 
            inside=1
        fi

        if [[ $line =~ $regex ]]; then
            if [[ "$inside" -eq 1 ]]; then
                events+=("${BASH_REMATCH[1]}")
            fi
            inside=0
        fi
    done < $filename
    
    numevents=${#events[@]}
    
    for (( i=0; i<${numevents}; i++ )); do
        sudo evtest --grab "/dev/input/event${events[$i]}" > /dev/null &
        pid=$!
        echo $pid > "${path_for_temp_files}touchscreen-evtest${i}.pid"
        echo "/dev/input/event${events[$i]} running on pid ${pid}"
    done
fi

起動時にタッチスクリーンの実行を無効にします。

#!/bin/bash
# This disables my touchscreen
#search for "Touchscreen" or something like that in /proc/bus/input/devices to make sure you're disabling what you want to disable.

path_for_temp_files="/ANY_PATH_YOU_WANT_TO_STORE_SOME_PID_FILES/"
regex='event([0-9]+)'
DEVICE="Touchscreen"

if [ -r "${path_for_temp_files}touchscreen-evtest0.pid" ]; then
    kill_these_files=("${path_for_temp_files}"touchscreen-evtest*)

    for i in "${kill_these_files[@]}"; do
        echo "kill" $(cat "${i}")
        sudo kill $(cat "${i}")
        sudo rm "${i}"
    done  

fi

filename='/proc/bus/input/devices'
inside=0
events=()
while read line; do
    if [[ $line =~ $DEVICE ]]; then 
        inside=1
    fi

    if [[ $line =~ $regex ]]; then
        if [[ "$inside" -eq 1 ]]; then
            events+=("${BASH_REMATCH[1]}")
        fi
        inside=0
    fi
done < $filename

numevents=${#events[@]}

for (( i=0; i<${numevents}; i++ )); do
    sudo evtest --grab "/dev/input/event${events[$i]}" > /dev/null &
    pid=$!
    echo $pid > "${path_for_temp_files}touchscreen-evtest${i}.pid"
    echo "/dev/input/event${events[$i]} running on pid ${pid}"
done

だから私も従うこの回答起動時にrootとして実行

関連情報