임베디드 Linux 제품(Ångström 기반)에서 이상한 멀티 터치 문제가 발생했습니다. 간단히 말해서, 특정 상황에서 실수로 멀티 터치를 했을 때 Qt 애플리케이션이 TouchEnd 이벤트를 감지할 수 없어 애플리케이션이 "잠겨"졌습니다. 멀티터치 지원이 필요하지 않으므로 다음 xorg.conf
을 편집하고 추가하여 멀티터치를 비활성화해 보았습니다.
Section "InputClass"
Identifier "NoTouch1"
MatchIsTouchscreen "on"
MatchProduct "scf0700_ts1"
Option "Ignore" "on"
EndSection
Section "InputClass"
Identifier "NoTouch2"
MatchIsTouchscreen "on"
MatchProduct "scf0700_ts2"
Option "Ignore" "on"
EndSection
X(xinput 목록)가 더 이상 여러 터치 장치를 "인식"하지 않는다는 것을 확인할 수 있습니다.
xinput list
Virtual core pointer id=2 [master pointer (3)]
↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
↳ scf0700_ts0 id=8 [slave pointer (2)]
Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ twl4030_pwrbutton id=6 [slave keyboard (3)]
↳ TWL4030 Keypad id=7 [slave keyboard (3)]
그러나 Qt는 이를 무시하는 것 같습니다(대신 evdev를 사용합니까?).
따라서 (내 생각에는) 이에 대한 추악한 해결책은 단순히 생성되는 것을 방지 /dev/input/event1
하고 이를 유일한 입력 장치로 만드는 것입니다(1과 2는 다른 두 개의 "터치 포인트"입니다).2
/dev/input/event0
udev 규칙을 편집하려고 시도했지만 "원치 않는" 이벤트 장치 생성을 방지할 수 없었습니다./libs/udev/rules.d/99-xf86-input-tslib.rules편집하기 전:
SUBSYSTEM=="input", KERNEL=="event[0-9]*", ATTRS{modalias}=="input:*-e0*,3,*a0,1,*18,*", SYMLINK+="input/touchscreen%n", ENV{x11_driver}="tslib"
그리고 이벤트 장치 중 하나를 비활성화하려고 시도한 후:
SUBSYSTEM=="input", KERNEL=="event1", ATTRS{name}=="scf0700_ts1", OPTIONS=="ignore_device"
이것이 올바른 접근 방식입니까? 규칙을 사용하여 원하는 작업을 수행할 수 있습니까? 아니면 터치스크린 드라이버로 작업을 수행해야 합니까?
내가 하나 찾았어비슷한 게시물SE에서 해결책은 EVIOCGRAB
장치의 독점적 사용을 얻는 것입니다. 어쩌면 이것이 또 다른 해결책일까요? 기기를 잡고 들어오는 모든 이벤트를 삭제하시겠습니까?
답변1
좋아요, 그래서 저는 이 문제에 대한 매우 간단한 해결책을 찾았습니다. (제 생각에는) 이상적인 해결책은 차단 /dev/input/event1
하고 2
생성하는 것이지만, 제가 원하는 방식으로 작동하는 udev 규칙이 없습니다.
EVIOCGRAB
나는 이것을 내 Qt 애플리케이션에서 사용 하게 되었습니다 . 상단에는 사용자가 장치를 터치하는지 감지하고 몇 분 동안 활동이 없으면 디스플레이가 어두워지는 "전역" 이벤트 필터가 있습니다. 이것을 생성자에 추가하면 다음과 같습니다.
QString dev1 = QLatin1String("/dev/input/event1");
QString dev2 = QLatin1String("/dev/input/event2");
int fd1 = QT_OPEN(dev1.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
if(fd1 >= 0)
{
::ioctl(fd1, EVIOCGRAB, 1);
qDebug() << "Grabbed " << dev1;
}
int fd2 = QT_OPEN(dev2.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
if(fd2 >= 0)
{
::ioctl(fd2, EVIOCGRAB, 1);
qDebug() << "Grabbed " << dev2;
}
아무것도 하지 않고 원하는 결과를 얻었습니다. 내 앱 의 입력이 더 event1
이상 event2
내 앱에 표시되지 않고(를 통해 액세스할 수 없음 evtest
) 앱을 종료하면 이벤트 장치가 다시 "활성" 상태가 됩니다.
기적적으로 작동합니다!
//앤더스