저는 두 개의 동일한(ELO 브랜드) 터치스크린이 있는 xorg에서 애플리케이션을 사용하고 있습니다. USB 케이블이나 모니터 케이블을 다시 연결하더라도 해당 모니터에 올바른 터치 패널을 자동으로 할당하고 싶습니다. (어떤 패널이 어떤 모니터에 속하는지 확인하기 위해 설정 유틸리티를 한 번 실행해야 했지만 문제가 되지 않았습니다.)
모니터와 터치 패널 모두 일련 번호가 있으므로 구성 파일에 넣고 시작 시 해당 번호를 찾아 거기에서 올바른 xinput 명령을 실행하는 것이 좋습니다. 아마도 이것이 올바른 방법이므로 udev를 통해 이 작업을 수행하는 것이 가장 좋습니다.
내가 이전에 한 일은 다음과 같습니다.
xinput
입력을 보려면 실행하세요 .
$ xinput
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Logitech USB-PS/2 Optical Mouse id=9 [slave pointer (2)]
⎜ ↳ Atmel Atmel maXTouch Digitizer id=10 [slave pointer (2)]
⎜ ↳ Atmel Atmel maXTouch Digitizer id=11 [slave pointer (2)]
⎜ ↳ Atmel Atmel maXTouch Digitizer id=15 [slave pointer (2)]
⎜ ↳ Atmel Atmel maXTouch Digitizer id=16 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard ... etcetera
그런 다음 Atmel 패널의 장치를 나열합니다.
xinput --list-props 10|grep Device.Node|cut -f2 -d'"'
이는 나에게 제공됩니다 /dev/input/event11
(다른 3개의 Atmel ID에도 이 작업을 수행). 그런 다음 udevadm을 실행하여 어떤 것이 터치 스크린인지 확인하세요.그리고일련번호 읽기:
udevadm info /dev/input/event11
나에게 주세요
N: input/event11
L: 0
S: input/by-path/pci-0000:00:14.0-usb-0:7:1.1-event
S: input/by-id/usb-Atmel_Atmel_maXTouch_Digitizer_E21R077282-event-if01
E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.1/0003:03EB:8A6E.0003/input/input12/event11
E: DEVNAME=/dev/input/event11
E: MAJOR=13
E: MINOR=75
E: SUBSYSTEM=input
E: USEC_INITIALIZED=5462678
E: ID_INPUT=1
E: ID_INPUT_TOUCHSCREEN=1
E: ID_INPUT_WIDTH_MM=341
E: ID_INPUT_HEIGHT_MM=273
E: ID_VENDOR=Atmel
E: ID_VENDOR_ENC=Atmel
E: ID_VENDOR_ID=03eb
E: ID_MODEL=Atmel_maXTouch_Digitizer
E: ID_MODEL_ENC=Atmel\x20maXTouch\x20Digitizer
E: ID_MODEL_ID=8a6e
E: ID_REVISION=1034
E: ID_SERIAL=Atmel_Atmel_maXTouch_Digitizer_E21R077282
E: ID_SERIAL_SHORT=E21R077282
E: ID_TYPE=hid
E: ID_BUS=usb
E: ID_USB_INTERFACES=:030000:
E: ID_USB_INTERFACE_NUM=01
E: ID_USB_DRIVER=usbhid
E: ID_PATH=pci-0000:00:14.0-usb-0:7:1.1
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_7_1_1
E: LIBINPUT_DEVICE_GROUP=3/3eb/8a6e:usb-0000:00:14.0-7
E: DEVLINKS=/dev/input/by-path/pci-0000:00:14.0-usb-0:7:1.1-event /dev/input/by-id/usb-Atmel_Atmel_maXTouch_Digitizer_E21R077282-event-if01
이제 패널의 일련번호를 얻었습니다.
xrandr -q --verbose
그런 다음 모니터( 디스플레이 모니터 및 edid 블록) 를 연결해야 합니다 . edid 정보는 읽기 전용이고 변경할 수 없으므로 이제 이를 고정 식별자로 사용할 수 있습니다. (달릴 수는 있지만 달릴 필요는 없습니다 edid-decode
).
xrandr 출력에서 모니터 이름을 가져오는 스크립트를 생략했지만 결국에는 ID_SERIAL_SHORT=E21R077282
DP-4를 모니터링해야 하는 Atmel 디지타이저를 연결 xinput --map-to-output 10 DP-4
하고 DP-6에 또 다른 Atmel 패널을 추가할 수 있습니다.
id=10
그러나 일련 번호에서 일련 번호 까지 많은 숫자를 처리하는 것처럼 느껴집니다 /dev/input/event11
.
- udev 규칙을 사용하여 이 작업을 수행할 수 있습니까?
- 를 구별하는 udev 규칙을 만들어야 합니까
ID_SERIAL_SHORT
? - 그렇다면 이 정보로 무엇을 해야 할까요?
- 즉, udev에서 xorg로 정보를 전송하는 방법은 무엇입니까?
- 또한
udev
xorg에서 모니터 정보를 얻을 수 있습니까? 아니면 둘 사이의 연결을 어떻게 설정해야 합니까?
답변1
짧은 대답: 할 수 없습니다(업데이트: 당신할 수 있는, 아래 참조)
udev
USB 장치 처리에 관한 모든 것입니다. USB 포트에 무언가가 연결되면 udev
udev 규칙에서 사용자 정의 스크립트 실행을 포함하여 많은 것과 연결할 수 있는 작업이 발생합니다.
그러나 (a) X11 서버가 당시에 실행 중이라는 보장은 없으며 (b) 실행 중이라 하더라도 다른 사용자가 소유할 수 있으며, 이는 무언가를 몰래 침입할 수 있는 경우 보안 허점이 될 수 있습니다. X11 서버에 액세스하기 위해 시스템 호출 권한 있는 스크립트를 통해 이를 수행합니다 udev
.
예를 들어, udev 규칙의 일부로 명령을 합법적으로 호출할 수 없으며 xinput
데스크탑에 로그인한 사용자가 호출하면 동일한 명령이 제대로 작동하더라도 아무 작업도 수행할 수 없어야 합니다.
규칙에 대한 제안은 다양합니다(예: Wacom 터치패드).
ATTRS{idVendor}=="056a", ACTION=="add", ENV{DISPLAY}=":0.0", ENV{XAUTHORITY}="/home/someusername/.Xauthority", RUN+="/usr/local/sbin/wacom.sh $env{DEVNAME}"
스크립트 는 wacom.sh
차례로 적절한 xinput
호출을 수행하지만 반드시 true가 아닌 여러 가지 가정을 합니다. 즉, DISPLAY가 실제로 그렇습니다. :0.0
또는 해당 루트가 지정된 .Xauthority
파일에 액세스할 수 있습니다(홈 디렉토리의 위치에 따라 항상 true는 아닙니다). 설치됨) 또는 다중 사용자 시스템에서는 사용자 이름이 항상 동일합니다.
유일한 법적 해결 방법은 사용자가 USB 터치 장치를 연결한 후 스크립트를 수동으로 실행하는 것입니다. 패널/데스크탑의 버튼과 연결할 수 있지만 시스템에서는 이를 호출할 수 없습니다 udev
.
다음은 나란히 배열된 두 개의 동일한 터치스크린 모니터를 확장된 데스크톱에 매핑하는 데 사용한 예입니다. xinput/udevadm(장치에 따라 감지 체계가 다름)을 사용하고 모든 화면과 장치에 하드코딩된 일련 번호를 사용하여 왼쪽 스타일러스/터치스크린을 왼쪽 모니터에, 오른쪽 스타일러스/터치스크린을 오른쪽 모니터에 매핑했습니다. EDID를 구문 분석할 때 정확한 검색 문자열은 운영 체제 및 EDID 디코딩 버전에 따라 크게 달라지므로 상황에 맞게 조정해야 할 수도 있습니다. EDID 정보를 추출하는 일반적인 방법을 알 수 없었습니다.
#!/bin/bash
LEFT_USB=XXXXXXX
LEFT_HDMI=YYYYYYY
RIGHT_USB=ZZZZZZZ
RIGHT_HDMI=TTTTTTT
### all xinput devices
ids=`xinput list --id-only`
left_ids=""
right_ids=""
for i in $ids
do
node=`xinput list-props $i | grep Device\ Node | cut -f2 -d\"`
if [ ! -z "$node" ]; then
serial=`udevadm info $node | grep ID_SERIAL_SHORT | cut -f2 -d=`
touch_id=`xinput list $i | grep "TouchClass" | sed -r 's/[^0-9]*([0-9]+).*/\1/'`
pen_id=`xinput list $i | grep Pen | cut -f2 -d= | cut -f1`
if [ "$serial" == "$LEFT_USB" ]; then
left_ids+="$pen_id $touch_id "
elif [ "$serial" == "$RIGHT_USB" ]; then
right_ids+="$pen_id $touch_id "
fi
fi
done
left_ids=`echo $left_ids | uniq | xargs`
right_ids=`echo $right_ids | uniq | xargs`
### all connected displays
DISPLAYS=`xrandr | grep \ connected | cut -f1 -d\ `
for d in $DISPLAYS
do
serial=`xrandr -q --verbose | sed -n "/$d connected/,/HDCP/p" | edid-decode | grep '\ \ Serial\ Number:' | cut -f2 -d: | xargs`
if [ "$serial" == "$LEFT_HDMI" ]; then
for i in $left_ids
do
xinput map-to-output $i $d
done
elif [ "$serial" == "$RIGHT_HDMI" ]; then
for i in $right_ids
do
xinput map-to-output $i $d
done
fi
done
exit 0
편집하다:
imdn은 흥미로운 대안을 제안합니다Arch Linux 시스템 관리 포럼에서. 기본 아이디어는 규칙에 의해 생성된 세마포어 파일을 활용 udev
하고 이를 inotifywait
X 구성(예: file-inotify
서비스 시작 시 ~/.xprofile
)에 추가하여 해당 잠금 파일의 변경 사항을 모니터링하고 xinput
변경 사항이 발생할 때 적절한 명령을 실행하는 것입니다. 원칙적으로는 가능할 것 같지만 계속할 수는 없습니다.
유일한 올바른 해결책은 X 구성 자체를 변경하고 새 포인팅 장치를 구성할 때 적절한 옵션의 설정을 호출하는 것입니다. 장치 이름이 고유한 경우 /etc/X11/xorg.d/*
기반으로 규칙을 추가하면 됩니다. MatchProduct
이 예는 Ubuntu 23.04, xfce4에서 테스트된 Wacom Cintiq 태블릿에 대한 것입니다.
## this file is /etc/X11/xorg.conf.d/50-wacom.conf
# xrandr:
# DVI-0 connected primary 2560x1600+0+0 (main monitor)
# DisplayPort-0 connected 1920x1080+2560+0 (Wacom Cintiq tablet)
# Wacom tablet can be configured to be --right-of 1920x1080+2560+0 or --below 1920x1080+0+1600
# --right-of means x-shift=2560/(2560+1920)=0.571429, x-scale=1920/(2560+1920)=0.428571, yscale=1080/1600=0.675
# Option "TransformationMatrix" "0.428571 0 0.571429 0 0.675 0 0 0 1"
# --below means y-shift=1600/(1600+1080)=0.597015, y-scale=1080/(1600+1080)=0.402985, xscale=1920/2560=0.75
# Option "TransformationMatrix" "0.75 0 0 0 0.402985 0.597015 0 0 1"
# Refs:
# https://unix.stackexchange.com/questions/58117/determine-xinput-device-manufacturer-and-model
# https://askubuntu.com/questions/178140/xinput-coordinate-transformation-matrix-in-xorg-conf
# https://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations
#
# Can match by a common substring for all Wacom devices (as reported by xinput):
# MatchProduct "Wacom ISDv5 307 Pen stylus"
# MatchProduct "Wacom ISDv5 307 Pen eraser"
# MatchProduct "Wacom ISDv5 309 Finger touch"
Section "InputClass"
Identifier "Wacom Cintiq"
Driver "wacom"
MatchProduct "Wacom ISDv5"
Option "TransformationMatrix" "0.428571 0 0.571429 0 0.675 0 0 0 1"
EndSection
동일한 제품 ID(유일한 고유 식별자는 일련 번호임)를 가진 두 개의 동일한 장치가 있는 경우 상황은 더 복잡해집니다. 안타깝게도 MatchSerial
xorg에는 해당 옵션이 없지만 TAG
in udev
규칙을 설정한 다음 MatchTag
in 에서 사용할 수 있습니다 xorg
.
편집하다:
마지막으로 이것은올바른 솔루션. 다음 예는 나란히 있는 두 개의 FlatFrog 패널에 대한 것입니다. 이 특정 솔루션의 장점은 활성화 시 모든 하위 장치가 이러한 크기 조정 속성을 상속하므로 터치/스타일러스/지우개를 개별적으로 추적할 필요가 없다는 것입니다.
### this is /etc/udev/rules.d/69-flatfrog.rules
ACTION=="remove", GOTO="flatfrog_end"
KERNEL!="event[0-9]*", GOTO="flatfrog_end"
ATTRS{idVendor}=="25b5", ATTRS{idProduct}="0082", ENV{ID_SERIAL_SHORT}=="XXXXXXXXX", ENV{ID_INPUT.tags}="FlatFrogRHS"
ATTRS{idVendor}=="25b5", ATTRS{idProduct}="0082", ENV{ID_SERIAL_SHORT}=="YYYYYYYYY", ENV{ID_INPUT.tags}="FlatFrogLHS"
LABEL="flatfrog_end"
### this is /etc/X11/xorg.conf.d/10-flatfrog.conf
Section "InputClass"
Identifier "RHstylus"
MatchTag "FlatFrogRHS"
Option "TransformationMatrix" "0.5 0 0.5 0 1 0 0 0 1"
EndSection
Section "InputClass"
Identifier "LHstylus"
MatchTag "FlatFrogLHS"
Option "TransformationMatrix" "0.5 0 0 0 1 0 0 0 1"
EndSection
인용하다:https://gitlab.freedesktop.org/xorg/xserver/-/issues/1592