web-dev-qa-db-ja.com

/ dev / input / mouse0と/ dev / input / miceの違い

私はマウスUSBドライバーを使用していますが、/dev/input/mouse0および/dev/input/miceによって送信された情報をどのように区別して使用するかわかりません。

Googleで数回検索したところ、/dev/input/miceの使用に関するコードがいくつか見つかりました

int fd, bytes;
unsigned char data[4];

const char *pDevice = "/dev/input/mice";

// Open Mouse
fd = open(pDevice, O_RDWR);
if(fd == -1)
{
    printf("ERROR Opening %s\n", pDevice);
    return -1;
}

int left, middle, right;
signed char x, y;

// Read Mouse
bytes = read(fd, data, sizeof(data));

if(bytes > 0)
{
    left = data[0] & 0x1;
    right = data[0] & 0x2;
    middle = data[0] & 0x4;

    x = data[1];
    y = data[2];
    printf("x=%d, y=%d, left=%d, middle=%d, right=%d\n", x, y, left, middle, right);

    if(left)
        return left;
    if(right)
        return right;
    if(middle)
        return middle;
}

return 0;

このプログラムは動作しますが、ホイールスクロールに関する情報を取得しませんでした

/dev/input/event0を使用するプログラムを見つけることができました

int fd;
struct input_event ev
const char* pFile = "/dev/input/event0";

fd = open(pFile, O_RDONLY);
if(fd == -1)
{
    printf("ERROR Opening %s\n", pFile);
    return -1;
}

read(fd, &ev, sizeof(ev));
std::cout << "type : " << ev.type << "  code : " << ev.code << "  value : " << ev.value << std::endl;

close(fd);

return 0;

ただし、このファイルは同時に1つの座標しか保存せず、X座標はYを優先するため、斜め方向の移動には問題があります。 Y軸上でマウスを動かしたいときはとても面倒です

ただし、/dev/input/mouse0を使用するコードが見つからないため、このファイルにはどのような情報が保存されますか?

私の質問は次のとおりです。1. /dev/input/mouse0に保存される情報は何ですか? 2. 2つのファイルを開かずに、優先順位の問題(全体のスクロール+ X/Y軸の移動)なしに、すべてのマウス情報を読み取るにはどうすればよいですか?

1
damadam

Linux Input SubsystemユーザースペースAPIドキュメント が質問に答えます。一般に、/dev/input/のすべてのファイルは、デバイスイベントをユーザースペースに配布するイベントハンドラーによって提供されます。

/ dev/input/mouse0および/ dev/input/miceとは何ですか?

introduction (重要な部分が強調表示されています)から

1.3.1.3。 mousedev

mousedevは、マウス入力を使用するレガシープログラムを機能させるためのハックです。マウスまたはデジタイザー/タブレットのいずれかからイベントを取得し、PS/2スタイル(la/dev/psaux)マウスデバイスをユーザーランドで使用できるようにします。

/ dev/input内のMousedevデバイス(上記を参照)は次のとおりです。

crw-r--r--   1 root     root      13,  32 Mar 28 22:45 mouse0
crw-r--r--   1 root     root      13,  33 Mar 29 00:41 mouse1
crw-r--r--   1 root     root      13,  34 Mar 29 00:41 mouse2
crw-r--r--   1 root     root      13,  35 Apr  1 10:50 mouse3 ... 
...
crw-r--r--   1 root     root      13,  62 Apr  1 10:50 mouse30
crw-r--r--   1 root     root      13,  63 Apr  1 10:50 mice

各マウスデバイスは、最後のマウスを除く単一のマウスまたはデジタイザに割り当てられます-マウス。この単一文字のデバイスは、すべてのマウスとデジタイザーで共有されており、接続されていなくてもデバイスは存在します。これは、USBマウスのホットプラグに役立ちます。これにより、ホットプラグを処理しない古いプログラムは、マウスが存在しない場合でもデバイスを開くことができます。 [...]

Mousedevは、データを読み取るプログラムの要求に応じて、PS/2、ImPS/2(Microsoft IntelliMouse)またはExplorerPS/2(IntelliMouse Explorer)プロトコルのいずれかを生成します。 GPMとXをこれらのいずれかに設定できます。 USBマウスのホイールを使用する場合はImPS/2が必要で、追加の(up 5)ボタン。

...これは、マウスホイールイベントが表示されない理由でもあります。レガシープログラムの「ハック」であるため、必要がない場合は使用しないでください。

どのようにしてすべてのマウス情報を読むことができますか[...]?

evdevによって提供される対応する/dev/input/eventXファイルを使用します(xorg-driver evdevと混同しないように、イベントハンドラー)。それが、2番目のコードスニペットが明らかにすることです。

...しかし、優先順位の問題はどうですか?

優先順位の問題はありません。 2.2。イベントコード によると:

SYN_REPORT:

イベントを同期化して、同じ瞬間に発生する入力データ変更のパケットに分離するために使用されます。たとえば、マウスのモーションは、1つのモーションに対してREL_XおよびREL_Yの値を設定し、SYN_REPORTを発行します。次のモーションは、さらにREL_XおよびREL_Y値を発行し、別のSYN_REPORTを送信します。

SYN_REPORTイベントまでのすべての連続したイベントは同時に発生したとみなすことができるため、レポートされる順序は重要ではありません。

たとえば、( このプログラム を使用してgithubで見つけました):

time:1528290186.256449  type:EV_REL     code:REL_X      value:-1
time:1528290186.256449  type:EV_REL     code:REL_Y      value:1
time:1528290186.256449  type:EV_SYN     code:SYN_REPORT value:0
time:1528290186.264460  type:EV_REL     code:REL_Y      value:1
time:1528290186.264460  type:EV_REL     code:REL_WHEEL  value:-1
time:1528290186.264460  type:EV_SYN     code:SYN_REPORT value:0

ご覧のとおり、同時イベントはSYN_REPORTイベントで区切られているだけでなく、同じタイムスタンプも持っています。

ところで、evtestを使用して、デバイスによって生成されたイベントを表示することもできます。ソースコードを見つけることができます こちら 仕組みに興味があるなら。

3
danzel