1

Linux/ubuntu を使用していますが、タッチパッドで少し遊んでみたいと思います。python-evdev を使用して /dev/input/events からイベントを読み取ろうとしていますが、今はそれらを印刷するだけです:

import evdev
dev = evdev.InputDevice('/dev/input/event6')

import time
while True:
  try:
    for event in dev.read():
      print event
  except:
    print " ~ "
    time.sleep(.5)

そのスクリプトを仮想コンソール (X の外で ctrl+alt+F1 を押す) で root 権限で実行すると、スクリプトはタッチパッドに触れるとイベントを出力します。それでも、X が画面に表示されていて、これを gnome ターミナル コンソールで実行すると、何も出力されません。どういうわけかこれは正常だと思います.入力はXによって傍受されています.それでも、とにかくそれらを取得したいと思います. X と私のスクリプトの両方がすべてのイベントを読み取ることができるように、/dev/input/event6 から来るものを複製する方法はありますか?

4

3 に答える 3

1

申し訳ありませんが、ここでの回答が少し遅れました。

バージョン 1.8 まで、xorg synaptics ドライバーは EVIOCGRAB ioctl を使用して、イベントが他のクライアントに配信されるのを防ぎました。これはデフォルトで無効になりました。 GrabEventDevice オプションを使用して、古いバージョンのマシンで無効にすることができます (man synaptics を参照)。

要するに、スクリプトに問題はありません。ここで問題となっているのはシナプス ドライバーです。スクリプトは他のデバイスでも問題なく動作することがわかります (ただし、xorg wacom ドライバーは最近までデバイスを取得していました)。

シナプスの上流コミット: http://cgit.freedesktop.org/xorg/driver/xf86-input-synaptics/commit/?id=f1948e08ee9894864254a18098e4f4fceb6e322f

于 2014-08-28T00:00:12.107 に答える
-1

デバイス入力が通常の /dev/input/eventN と、たとえば /dev/input/copied_eventN の両方に分散されるように、evdev に基づいてカーネル入力ハンドラーを作成できます。

X は /dev/input/eventN から読み取りますが、/dev/input/copied_eventN からは引き続き読み取ることができます。

実際には、drivers/input/evdev.c のコードをコピーして貼り付けることで、カーネル モジュールを非常に簡単に作成できます。

于 2014-05-30T18:40:10.313 に答える
-1

つまり、あなたの考えは、X がタッチパッドからデータを取得したため、Python コードがタッチパッド信号の受信をブロックされているということですよね? または、あなたの言葉を繰り返してもいいですか: 少なくとも特定の種類のデバイスでは、別のアプリケーションがそのデバイスから読み込んでいるときに、アプリケーションは /dev/input/event* を取得できませんか?

理論的には、Linux はすべてのデバイスをファイルとして作成するため、ファイルに読み取り専用としてアクセスしますが、X もファイルに読み取り専用でアクセスします。

別の実験を行いました。archlinux に赤外線受信機があり、2 つの ssh コンソールでシステムに接続しました。IR にアクセスするには 2 つの方法を使用します。つまり、2 つのアプリケーションを使用して /dev/input/event0 のファイルを読み取ります (event0 は私のアーキテクチャの SF です)。

1、evdev を使用した Python コードの一部。

2、次のようなシェル コマンド: sudo cat /dev/input/event0 | 16進ダンプ

2 番目は X として機能していると見なすことができます。正しく推論していれば、IR リモートコントローラーから信号を送信するときに、両方が同時に IR (event0) からデータを受信しないはずですよね? しかし、私は本当に2つのsshコンソールで日付を取得しました(画像を投稿できればいいのですが、評判が低すぎて投稿できません)。

ですから、それが理由であってはならないと思います。タッチパッド自体のせいかもしれません。一部のデバイスは、1 つのアプリケーションでしか動作しません。たとえば、キーボードはアクティブなアプリケーションでのみ文字を入力でき、一部の入力メソッドは他のアプリケーションよりもアクティブになり、処理後にリダイレクトされます。また、たとえば、システムで VM を実行していて、マウスを 1 つしか使用していない場合、ホスト デスクトップでポインタを移動するとどうなるでしょうか。VM のポインターは移動しますか? それともその逆?

タッチパッドについてもっと情報が必要です。TP が 1 つのアクティブなアプリケーションでのみ動作する場合、X よりも先にタッチパッド信号を取得し、それを X と Python コードにリダイレクトするフックのようなものが必要になると思いますが、これは evdev を超えている可能性があります。

于 2013-11-19T17:19:08.390 に答える