特定の/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つの異なる「タッチポイント」です)。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"

そして、イベントデバイスの1つを無効にしようとした後:

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

これは正しいアプローチですか?ルールを使用して目的の操作を実行できますか?それともタッチスクリーンドライバで作業を行う必要がありますか?

私が一つ見つけた同様の投稿SEの解決策は、EVIOCGRABデバイスの排他的な使用を得ることです。たぶんこれは別の解決策ですか?デバイスを持って入ってくるすべてのイベントを削除してもよろしいですか?

ベストアンサー1

さて、私はこの問題に対する非常に簡単な解決策を見つけました。 (私の考えでは)理想的な解決策はブロックし/dev/input/event12生成することですが、私が望む方法で動作する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)、アプリを終了するとイベントデバイスは再び「アクティブ」になります。

奇跡的に動作します!

//アンダース

おすすめ記事