Предотвращение создания определенных узлов / 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 list) больше не «видит» более одного сенсорного устройства:

 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 и 2 и позволить /dev/input/event0 быть единственным устройством ввода (1 и 2 являются двумя другими «касательными точками» «).

Я попытался изменить правила 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 для эксклюзивного использования устройства (ов). Возможно, это еще одно решение? Захват устройств и удаление всех событий, которые входят?

  • Прокрутка по центру с помощью ThinkPad / предотвращение вставки
  • Используйте Emulated Scrollwheel вместо Real One X11
  • Причины установки X Windows на сервер Linux
  • Запустить скрипт при загрузке?
  • Как настроить разрешение экрана на постоянной основе
  • Как ввести символ степени в X11 (с использованием раскладки английской клавиатуры по умолчанию)?
  • как «пересылать» данные отображения x?
  • Как заставить Debian Jessie использовать проприетарный драйвер nvidia?
  • One Solution collect form web for “Предотвращение создания определенных узлов / dev / input / event”

    Хорошо, поэтому мне удалось найти довольно простой способ решения этой проблемы. Идеальное решение было бы (по-моему) /dev/input/event1 том, чтобы предотвратить /dev/input/event1 и 2 , но я не получил правил udev, чтобы работать так, как я хотел.

    В итоге я использовал EVIOCGRAB в своем приложении Qt. Я hava «глобальный» eventfilter наверху, который обнаруживает, что пользователь коснулся устройства, и затемняет дисплей через пару минут бездействия. Добавив это к конструктору:

     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 ), и если я evtest из приложения, то устройства событий снова станут активными.

    Работает как шарм!

    // Anders

    Interesting Posts
    Linux и Unix - лучшая ОС в мире.