組み込み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/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
)、アプリを終了するとイベントデバイスは再び「アクティブ」になります。
奇跡的に動作します!
//アンダース