- 0x0000007b
- 2차세계대전
- 3.20해킹
- 4대강
- 502 error
- 53빌딩
- 7840hs
- 88체육관 수영장
- ABI
- abortive close
- abortive shutdown
- AHCI
- aic8800d80 chipset
- akmods
- ALC1220
- alma linux
- alternatives
- AM4 메인보드
- AMD
- amd 7840hs
- amd 그래픽 게임용
- amd 내장 그래픽 최적화
- anonymous file
- API
- apple.com
- APT
- apt-get
- Armagnac
- Asrock
- ASTALIFT
- Today / Yesterday
- /
- Total
Linux Programmer
Zeuslab 터치 모니터의 터치 범위 설정 본문
Zeuslab의 P16KT 같은 터치 모니터를 사용해서 서브 모니터로 연결하면 터치하는 위치가 이상해지거나 혹은 첫번째 모니터 화면이 터치되는 경우가 있다. 이는 터치 위치가 전체 모니터 크기(2개의 모니터 공간의 합)로 계산되어 일어나는 문제이다. 따라서 특정 모니터 좌표만 터치되도록 조정해주면 된다.
1. 준비 작업 : event 장치명 확인 (root 권한으로)
우선 Zeuslab의 P16KT 터치 모니터의 event 장치명을 알기 위해 아래와 같이 명령한다. Zeuslab의 USB VID, PID는 0457, 0819이므로 grep에서 'usb:0457:0819'를 필터링했는데, 만일 다른 회사 제품이라면 libinput list-devices에서 제품명을 직접 찾은 다음에 Id값을 찾아서 넣으면 된다. 예를 들어 당신의 제품이 'usb:0123:4567' 이라면 grep -B 2 -A 12 'usb:0123:4567' 이라고 명령하면 쉽게 찾을 수 있다.
아래 결과에서 보듯이 /dev/input/event26 를 기억해두면 된다. 이는 뒤에서 udevadm로 리로드와 트리거를 명령 할 때 필요하기 때문에 미리 알아본 것이다. 참고로 libinput 명령어는 root권한을 필요로 한다. 일반 유저로 명령시 Permission denied 에러가 발생할 것이다.
$ sudo libinput list-devices | grep -B 2 -A 12 'usb:0457:0819'
Device: Silicon Integrated System Co. SiS HID Touch Controller
Kernel: /dev/input/event26
Id: usb:0457:0819
Group: 3
Seat: seat0, default
Size: 117x85mm
Capabilities: touch
Tap-to-click: n/a
Tap-and-drag: n/a
Tap button map: n/a
Tap drag lock: n/a
Left-handed: n/a
Nat.scrolling: n/a
Middle emulation: n/a
Calibration: 0.5 0.00 0.0 0.00 1.00 0.00
2. LIBINPUT_CALIBRATION_MATRIX의 이해
Wayland를 사용하는 최근의 리눅스에서는 LIBINPUT_CALIBRATION_MATRIX를 이용해서 터치 공간의 픽셀 위치를 조정(calibration) 할 수 있다. 이 값은 총 9개의 매트릭스로 되어있으며 각각은 아래와 같다.
여기서 터치 스크린용으로 사용되는 값은 M11, M12, M13, M21, M22, M23의 6개이며 각각은 아래와 같은 의미를 가진다.
M11 | X축 배율(scaling), 입력된 X좌표에 곱해져서 최종 X좌표를 구한다. 예를 들어 0.5면 좌표의 위치가 절반으로 줄어드는 효과를 가진다. |
M12 | X좌표의 Y의존성(Skew/Rotation). 화면이 로테이션이 된 경우에 보정하는 값이다. |
M13 | X축 오프셋(offset), X좌표에 시작위치이다. 0이면 이동이 없는 것을 의미한다. |
M21 | Y좌표의 X의존성(Skew/Rotation). 화면이 로테이션이 된 경우에 보정하는 값이다. |
M22 | Y축 배율(scaling), 입력된 Y좌표에 곱해져서 최종 Y좌표를 구한다. 예를 들어 1이면 좌표를 변화시키지 않는다. |
M23 | Y축 오프셋(Offset), Y좌표의 시작위치이다. |
M31 | 투시 변환(Perspective), 일반적으로 0이다. 이 값들은 건드리지 않는다.(뭔지는 자세히 모른다) |
M32 | 투시 변환(Perspective), 일반적으로 0이다. 이 값들은 건드리지 않는다.(뭔지는 자세히 모른다) |
M33 | 투시 변환(Perspective), 일반적으로 1이다. 이 값들은 건드리지 않는다.(뭔지는 자세히 모른다) |
예를 들어 2개의 모니터가 있고, 각각 2560x1600의 해상도를 가진다고 가정하자. 모니터1이 일반 모니터이고, 모니터2가 Zeuslab의 P16KT 터치 모니터이다. 그리고 P16KT가 좌측에 배치되어있다고 가정하자.
이런 경우 전체 화면 크기는 5120x1600의 화면 크기를 가진다. 그리고 좌측 상단의 X,Y좌표는 (0,0)이고 2560x1600이므로 절반만 사용하는 셈이다. 따라서 M11은 0.5를 넣고, Y축 크기는 둘다 1600이므로 배율을 변화시킬 필요가 없으므로 M22는 1이다. 따라서 LIBINPUT_CALIBRATION_MATRIX는 다음과 같다.
LIBINPUT_CALIBRATION_MATRIX="0.5 0 0 0 1 0 0 0 1"
이 값을 적용시킬려면 udev의 rules 파일로 만드는 것이 좋다. 파일을 만들 디렉터리 경로는 /etc/udev/rules.d 이며, 파일명은 98-zeuslab-p16kt-libinput-calibration.rules 정도로 만들자. 사실 파일명은 다르게 해도 상관은 없다. 보통 앞의 숫자 2개와 파일 내용을 설명하는 적당한 이름이면 된다. 이것도 당연히 root 권한으로 파일을 생성해야만 한다. 내용은 아래 1줄짜리를 넣어두면 된다.
ACTION=="add|change", SUBSYSTEM=="input", ATTRS{idVendor}=="0457", ATTRS{idProduct}=="0819", ENV{LIBINPUT_CALIBRATION_MATRIX}="0.5 0 0 0 1 0 0 0 1"
보통은 rules 파일을 새로 넣으면 곧바로 적용되지만 기존 파일을 수정했거나, 혹여 로딩이 잘 안되는 경우가 있기 때문에 아래처럼 수동으로 이벤트를 발생시키는 것을 권장한다. 당연히 root로 명령한다. --name 의 장치명은 앞서 libinput에서 알아낸 파일명을 쓰면 된다. 혹시라도 이벤트가 제대로 작동하는지 확인하고 싶다면 미리 터미널 창을 하나 더 열고 udevadm monitor --environment --udev 명령을 내려두면 모니터링을 할 수 있다.
$ sudo udevadm control --reload && udevadm trigger --name=/dev/input/event26
보통 명령이 내려지면 바로 적용되는 경우도 있지만 때에 따라서는 10여분 가까이 걸리기도 한다. 왜 그런지는 잘 모르겠다. 적용이 제대로 되었는지는 libinput list-devices ... 명령에서 "Calibration" 항목을 보면 된다.
3. 화면의 크기가 다른 모니터 사용시
두 화면의 크기가 다른 모니터를 사용하는 경우에는 X, Y 좌표의 값이 달라지기 때문에 계산이 조금 복잡해진다. 예를 들어 모니터1번이 3840x2160, 모니터2번이 P16KT(2560x1600)이라면 논리적인 좌표값은 최대값을 따르기 때문에 토탈 화면 크기는 6400x2160이 된다. 이런 경우에는 M11, M13, M22의 좌표 계산이 약간 골치아파지기 때문에 이를 계산해주는 bash script를 하나 작성했다 (copilot을 이용해서 기본적인 뼈대를 작성하고, 오류가 있어서 약간 수정을 했다.)
#!/bin/bash
# 아래 1번, 2번 모니터의 설정을 본인의 화면에 맞게 수정한다.
### 설정 시작 ###
# 1. 모니터 설정 (물리적 픽셀 및 배율)
# 1번 모니터 (주 모니터)
MONITOR1_P_WIDTH=5120
MONITOR1_P_HEIGHT=2160
MONITOR1_SCALE=1.5 # 150%
# 2번 모니터 (터치 모니터)
MONITOR2_P_WIDTH=2560
MONITOR2_P_HEIGHT=1600
MONITOR2_SCALE=1.0 # 100% 가정 (필요에 따라 1.25, 1.5 등으로 변경 가능)
### 설정 끝 ###
# 터치 입력을 적용할 2번 모니터의 위치
TARGET="$1"
if [[ "$TARGET" != "left" && "$TARGET" != "right" ]]; then
echo "Usage $0 [left|right]"
exit 1
fi
# ### 2. 논리적 크기 계산 ###
# 1번 모니터 논리적 크기
MONITOR1_L_WIDTH=$(echo "scale=4; $MONITOR1_P_WIDTH / $MONITOR1_SCALE" | bc -l)
MONITOR1_L_HEIGHT=$(echo "scale=4; $MONITOR1_P_HEIGHT / $MONITOR1_SCALE" | bc -l)
echo "Monitor[1] : Logical width x height = $MONITOR1_L_WIDTH x $MONITOR1_L_HEIGHT"
# 2번 모니터 논리적 크기
MONITOR2_L_WIDTH=$(echo "scale=4; $MONITOR2_P_WIDTH / $MONITOR2_SCALE" | bc -l)
MONITOR2_L_HEIGHT=$(echo "scale=4; $MONITOR2_P_HEIGHT / $MONITOR2_SCALE" | bc -l)
echo "Monitor[2] : Logical width x height = $MONITOR2_L_WIDTH x $MONITOR2_L_HEIGHT"
# 전체 화면 논리적 크기 (두 모니터의 논리적 너비 합산)
TOTAL_WIDTH=$(echo "scale=4; $MONITOR1_L_WIDTH + $MONITOR2_L_WIDTH" | bc -l)
# 전체 화면 논리적 높이 (두 모니터의 논리적 높이 중 큰 값)
if (( $(echo "$MONITOR1_L_HEIGHT > $MONITOR2_L_HEIGHT" | bc -l) )); then
TOTAL_HEIGHT=$MONITOR1_L_HEIGHT
else
TOTAL_HEIGHT=$MONITOR2_L_HEIGHT
fi
# 2번 모니터의 논리적 Y축 오프셋 (중앙 정렬 가정)
Y_OFFSET_PIXELS=0
# ### 3. 매트릭스 계산 함수 ###
calc_matrix() {
local x_offset=$1
local y_offset=$2
local width=$3
local height=$4
# 스케일링 비율 (A, E)
local scale_x=$(echo "scale=4; $width / $TOTAL_WIDTH" | bc -l)
local scale_y=$(echo "scale=4; $height / $TOTAL_HEIGHT" | bc -l)
# 오프셋 비율 (C, F)
local offset_x=$(echo "scale=4; $x_offset / $TOTAL_WIDTH" | bc -l)
local offset_y=$(echo "scale=4; $y_offset / $TOTAL_HEIGHT" | bc -l)
# 행렬 출력: M11 M12 M13 M21 M22 M23 M31 M32 M33 M12와 M21은 0: Rotation없음)
echo "LIBINPUT_CALIBRATION_MATRIX=\"$scale_x 0 $offset_x 0 $scale_y $offset_y 0 0 1\""
}
# ### 4. 매트릭스 적용 ###
if [[ "$TARGET" == "left" ]]; then
# 2번 모니터가 left: X 오프셋=0, Y 오프셋=$Y_OFFSET_PIXELS, 크기=2번 모니터 논리적 크기
calc_matrix 0 $Y_OFFSET_PIXELS $MONITOR2_L_WIDTH $MONITOR2_L_HEIGHT
else
# 2번 모니터가 right: X 오프셋=1번 모니터 논리적 너비, Y 오프셋=$Y_OFFSET_PIXELS, 크기=2번 모니터 논리적 크기
calc_matrix $MONITOR1_L_WIDTH $Y_OFFSET_PIXELS $MONITOR2_L_WIDTH $MONITOR2_L_HEIGHT
fi
고해상도 모니터는 종종 배율을 150%나 200%로 높이는 경우도 있는데, 배율이 높아지면 논리적인 해상도가 달라진다. 예를 들어 4k 모니터의 물리적인 해상도는 3840x2160이지만, 배율을 200%로 높이면 논리적인 해상도는 1920x1080으로 변한다. 따라서 위에 스크립트에 위에서 6줄 코드 부분에 각 모니터의 해상도와 배율을 적도록 해뒀다.
일단 예제의 현재 값은 1번 모니터는 5k (5120x2160)에 배율은 150%로 저장해뒀다. 이 상태에서 터치 모니터가 왼쪽에 배치된 경우라면 아래처럼 명령한다.
$ ./libinput_calibration_matrix.sh left
Monitor[1] : Logical width x height = 3413.3333 x 1440.0000
Monitor[2] : Logical width x height = 2560.0000 x 1600.0000
LIBINPUT_CALIBRATION_MATRIX=".4285 0 0 0 1.0000 0 0 0 1"
위에서 나온 맨 아랫줄을 /etc/udev/rules.d 에 설정 파일에 넣어두면 된다. 설정 후 적용은 앞서 본 udevadm control --reload && udevadm trigger --name=/dev/input/event26 명령을 사용하도록 하자. (명령 후 실제 효과는 10여분까지 지연될 수 있음을 명심하자)
만일 오른쪽에 배치된 경우라면 right를 명령을 하면 된다.
$ ./libinput_calibration_matrix.sh right
Monitor[1] : Logical width x height = 3413.3333 x 1440.0000
Monitor[2] : Logical width x height = 2560.0000 x 1600.0000
LIBINPUT_CALIBRATION_MATRIX=".4285 0 .5714 0 1.0000 0 0 0 1"
혹시라도 아예 터치 기능을 비활성화 하고자 한다면 예전에 써둔 글이 있으니 그것을 참고하기 바란다.
2025.06.23 - [컴퓨터 관련/리눅스 데스크탑] - 리눅스에서 제우스랩 P16KT 터치 기능 끄기
히스토리
- 2025-10-12 초안 작성
레퍼런스
- Calibrating Touchscreen, Arch Linux wiki, https://wiki.archlinux.org/title/Calibrating_Touchscreen
- How to calibrate touch screen on Wayland, https://unix.stackexchange.com/questions/708447/how-to-calibrate-touch-screen-on-wayland
'컴퓨터 관련 > 리눅스 데스크탑' 카테고리의 다른 글
삼성 갤럭시북3 갤럭시북4 스피커 사운드 및 Fn키 설정 (0) | 2025.10.10 |
---|---|
리눅스에서 제우스랩 P16KT 터치 기능 끄기 (0) | 2025.06.23 |
gnome-tweaks로 리눅스 데스크탑 환경의 미세 조정 (0) | 2025.01.19 |
페도라 리눅스의 한글 입력기를 fcitx5로 교체하기 (2) | 2024.12.13 |
리눅스용 멀티미디어 프로그램 - 유튜브 플레이어, 다운로더 (7) | 2024.07.23 |
Audacious 리눅스 & 윈도 MP3 플레이어 (0) | 2024.05.31 |
터치패드 켜기/끄기 토글 기능 - Fedora Linux (4) | 2024.01.08 |
리눅스에서 커스텀 키보드 펑션키 F11, F12등의 이상 작동 문제 (0) | 2023.10.31 |