터치스크린 전환:

터치스크린 전환:

배경 정보:
내 노트북의 터치스크린에 문제가 있어서 이를 처리하기 위해 부팅 시 특별한 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"(이것은 두 개의 다른 장치입니다. 펜은 문제를 일으키지 않지만 필요하지 않으므로 이것에 대해서도 비활성화해도 상관 없습니다)
  4. 해당 단락에서 재부팅할 때마다 N이 무작위로 지정되는 문을 찾으세요 ( / eventN사용 ).grepawk
  5. 달리기sudo evtest --grab /dev/input/event$N > /dev/null

그런 다음 부팅 시 루트 권한으로 실행될 위치에 이 스크립트를 배치합니다(이에 대해 본 적이 있지만 /etc/rc.local아직 시도하지는 않았습니다).

evtest이미 입력 장치를 한 줄로 인쇄했으며 이에 대한 변형을 함께 구성했습니다.

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

우분투 22.04를 새로 설치하고 있습니다. awk의 일치 기능을 작동시키는 방법을 몰랐기 때문에 @meuh 및 @JinnKo의 코드를 사용하여 키워드가 지정된 여러 장치를 비활성화/전환할 수 있는 awk가 아닌 버전을 만들었습니다.

먼저 evtest가 설치되어 있는지 확인하세요.

sudo apt install evtest

두 개의 파일이 있습니다. 하나는 터치 스크린을 켜고 끄는 것이고 다른 하나는 시작 시 항상 비활성화하는 것입니다.

터치스크린 전환:

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

그럼 나도 따라갈게이 답변시작 시 루트로 실행

관련 정보