특정 /dev/input/event 노드가 생성되지 않도록 방지

특정 /dev/input/event 노드가 생성되지 않도록 방지

임베디드 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) 앱을 종료하면 이벤트 장치가 다시 "활성" 상태가 됩니다.

기적적으로 작동합니다!

//앤더스

관련 정보