Evitar a criação de certos nós / dev / input / event

2

Eu tenho esse problema multitouch estranho em nosso produto Linux incorporado (baseado em Ångström). O conto é que nosso aplicativo Qt não consegue detectar eventos TouchEnd em certos casos quando acidentalmente multitouching, que, em seguida, "bloqueia" o aplicativo. Nós não precisamos de suporte a multitouch, então eu já tentei desativar o multitoque editando xorg.conf e adicionando:

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

e posso verificar que X (xinput list) não "vê" mais de um dispositivo de toque:

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, no entanto, parece desconsiderar isso (ele está usando o evdev?).

Portanto, a solução feia para isso (em minha mente) é simplesmente impedir que /dev/input/event1 e 2 sejam criados e deixar que /dev/input/event0 seja o único dispositivo de entrada (1 e 2 são os outros dois "pontos de contato"). ).

Eu tentei editar as regras do udev, mas não consegui impedir que os dispositivos de evento "indesejados" fossem criados. /libs/udev/rules.d/99-xf86-input-tslib.rules antes da edição:

SUBSYSTEM=="input", KERNEL=="event[0-9]*", ATTRS{modalias}=="input:*-e0*,3,*a0,1,*18,*", SYMLINK+="input/touchscreen%n", ENV{x11_driver}="tslib"

e depois de tentar desativar um dos dispositivos de evento:

SUBSYSTEM=="input", KERNEL=="event1", ATTRS{name}=="scf0700_ts1", OPTIONS=="ignore_device"

Este é o caminho certo a seguir? Posso fazer o que quiser usando as regras ou preciso fazer algo com o driver da tela sensível ao toque?

Eu encontrei um Post similar aqui no SE, onde a solução era usar EVIOCGRAB para pegar o uso exclusivo do (s) dispositivo (s). Talvez esta seja outra solução? Agarrando os dispositivos e soltando todos os eventos que entram?

    
por user1143242 08.02.2017 / 10:25

1 resposta

1

Ok, então consegui encontrar uma maneira bem simples de contornar esse problema. A solução ideal seria (na minha opinião) impedir que /dev/input/event1 e 2 fossem criados, mas não consegui que as regras do udev funcionassem da maneira que eu queria.

Acabei usando EVIOCGRAB no meu aplicativo Qt. Eu tenho um filtro de evento "global" no topo que detecta se o usuário tocou no dispositivo e escurece a exibição após alguns minutos de inatividade. Adicionando isso ao construtor:

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;
}

e não fazendo mais nada, consegui o resultado que precisava. As entradas de event1 e event2 não estão mais aparecendo no meu aplicativo (e não estão acessíveis por evtest ) e, se eu sair do aplicativo, os dispositivos de evento se tornarão "ativos" novamente.

Funciona como um encanto!

// Anders

    
por 09.02.2017 / 15:58

Tags