OK、これはxorg evdevドライバーのバグだと思いますが、ubuntu-bugが正確にサポートチャネルを介してこれを処理するように親切に私に頼んだので、私は最初にここに報告しましたそれまでの間、私はquantalにアップグレードして proper bug を報告しましたが、サポートコミュニティの誰かが答えを持っているとしたら、それも間違いではありません。 (段落は 報告されたバグ )を参照するように編集されています
これは、Acer T231Hマルチタッチモニターに正確に接続されたUbuntu 12.04です。実際、私は複数のOSセットアップでこれに遭遇しました。そのうちの1つは、debootstrapを介して行われました。関連するパッケージ:
Xがマウスをアプリケーションに送信する際のマウスイベントは一貫していません。これはxevを使用してデバッグできます。
画面の最初のタッチの前に、すでに状態0x100、つまり左マウスボタンが押されているMotionNotifyイベントが発生します。その後、ButtonPressイベントが発生します。状態は0x100ですが、その値は、イベントが発生する前にボタンの状態を示す必要があります。その後のドラッグは問題なく、ButtonReleaseも同様ですが、状態値の0x100ビットが再びゼロになることはありません。
通常のマウスも接続している場合でも、今後は、マウスの左ボタンを押したままのようにすべての動きが報告されます。私が見つけた唯一の治療法は、Xサーバーを再起動することでした。 ButtonPressイベントとButtonReleaseイベントと共に、左マウスボタンのこの定数ビットは、ボタンの状態の一貫性のないレポートになります。
Javaアプリケーション(例:この問題により、すべての移動がドラッグとして報告され、フォーカス管理に深刻な影響が及びます。マウスの動きは、マウスがアプリケーションウィンドウに入ったコンポーネントにのみ報告されるため、アプリケーションのさまざまな部分を使用することはほとんど不可能になります。
私は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を実行するので、これはあくまでもテスト専用です。