web-dev-qa-db-ja.com

Acer T231Hマルチタッチモニターの一貫性のないマウスXイベント

バグのようです

OK、これはxorg evdevドライバーのバグだと思いますが、ubuntu-bugが正確にサポートチャネルを介してこれを処理するように親切に私に頼んだので、私は最初にここに報告しましたそれまでの間、私はquantalにアップグレードして proper bug を報告しましたが、サポートコミュニティの誰かが答えを持っているとしたら、それも間違いではありません。 (段落は 報告されたバグ )を参照するように編集されています

セットアップ

これは、Acer T231Hマルチタッチモニターに正確に接続されたUbuntu 12.04です。実際、私は複数のOSセットアップでこれに遭遇しました。そのうちの1つは、debootstrapを介して行われました。関連するパッケージ:

  • xserver-xorg-input-evdev 1:2.7.0-0ubuntu1
  • 一方のシステムではlinux-image-*-generic 3.2.0-24.39、もう一方のシステムでは3.2.0-25

症状

Xがマウスをアプリケーションに送信する際のマウスイベントは一貫していません。これはxevを使用してデバッグできます。

画面の最初のタッチの前に、すでに状態0x100、つまり左マウスボタンが押されているMotionNotifyイベントが発生します。その後、ButtonPressイベントが発生します。状態は0x100ですが、その値は、イベントが発生する前にボタンの状態を示す必要があります。その後のドラッグは問題なく、ButtonReleaseも同様ですが、状態値の0x100ビ​​ットが再びゼロになることはありません。

通常のマウスも接続している場合でも、今後は、マウスの左ボタンを押したままのようにすべての動きが報告されます。私が見つけた唯一の治療法は、Xサーバーを再起動することでした。 ButtonPressイベントとButtonReleaseイベントと共に、左マウスボタンのこの定数ビットは、ボタンの状態の一貫性のないレポートになります。

Javaアプリケーション(例:この問題により、すべての移動がドラッグとして報告され、フォーカス管理に深刻な影響が及びます。マウスの動きは、マウスがアプリケーションウィンドウに入ったコンポーネントにのみ報告されるため、アプリケーションのさまざまな部分を使用することはほとんど不可能になります。

予想される行動と実際の行動の比較

予想される動作:

  1. 通常のマウスをドラッグしたときに、状態0x000でMotionNotify
  2. タッチする前に移動するための状態0x000付きのMotionNotify、またはイベントなし
  3. 画面に触れたときに状態0x000のButtonPress
  4. 指のドラッグ中の状態0x100のMotionNotify
  5. 指を離したときの状態0x100のButtonRelease
  6. 後で通常のマウスをドラッグすると、状態0x000でMotionNotify

実際の行動:

  1. 最初のタッチの前に通常のマウスをドラッグすると、状態0x000のMotionNotify
  2. ButtonNotイベントの前の状態0x100でMotionNotify
  3. 画面に触れたときの状態0x100のButtonPress
  4. 指のドラッグ中の状態0x100のMotionNotify
  5. 指を離したときの状態0x100のButtonRelease
  6. 後で通常のマウスをドラッグすると、MotionNotify with state0x100
2
MvG

これを自分で解決した

主なバグの分析

私はevdevとコアxサーバーの両方のソースを掘り下げました。結局、このバグはevdevではなく、xserver-xorg-coreにあることがわかりました。 commit there (これも Xorgアップストリームに含まれます です)は、イベントにTOUCH_ENDフラグを設定した唯一のコードを削除しました。このフラグがない場合、UpdateDeviceStateボタンを状態から削除しません なので、元の質問の「ボタンは常に押されている」動作になります。そのコミットを元に戻すだけで、メインのコアイベント機能が復元されました。つまり、ButtonReleaseイベントの直後にボタンが解放されたとマークされました。

マウスプレスイベントのマイナーバグ

ただし、xevの出力には1つの問題が残っています。ButtonPressイベントにはすでにstate 0x100がありますが、状態はマウスボタンの状態を反映する必要がありますbeforeイベントが発生しました。これは、タッチシーケンスの所有権に対する変更の処理方法が原因であると思われます。その所有権管理コードの one point で、タッチ履歴はTouchEventHistoryReplayを使用して再生されますが、デバイスの内部状態はその再生前の状態に設定されていません。このためのパッチはまだ作成していません。その際、 バグレポート に添付します。これは別の問題なので、このマイナーポイントのパッチがなくても、ここでこの質問に回答したと思います。

これをデバッグする方法

誰かが同様の問題でこれを読んだ場合:私はgdbの使用を検討しましたが、Xサーバーがデバッガーで停止した場合にvtを適切に切り替えることができるかどうかは確かではなく、動作しませんでしたそのマシンで構成されたsshサーバー。そのため、私はこれまでで最も古いデバッグエイドの1つを使用し、コード全体に自由に分散したErrorF呼び出し、特に Xi/exevents.c を使用しました。次に、コードをインストールせずに(最初に debuild を使用してコンパイルした)コードを再コンパイルし、コンパイルされたバイナリ(build-main/hw/xfree86/Xorg)をrootとして次のように実行しました。

$ make -C build-main
$ Sudo -s
# apt-get install openbox
# ( sleep 3; DISPLAY=:1 exec openbox; ) & build-main/hw/xfree86/Xorg :1

これはコードを再コンパイルします(マイナーな変更でも時間がかかるため、makefileでの依存関係の管理は最適ではないようですが、それについても掘り下げたくありませんでした)。次に、rootになった後、新しいXサーバーを起動し、数分後にそのサーバーでopenboxを起動します。 rootとしてopenboxを実行するので、これはあくまでもテスト専用です。

2
MvG