Linuxでキーボード修飾子の物理状態を読みます(CまたはC ++を使用することをお勧めします)。

Linuxでキーボード修飾子の物理状態を読みます(CまたはC ++を使用することをお勧めします)。

プログラムで情報を読み、検出または取得する方法はありますか?実際の物理状態修飾キー、ルートレベルのアクセスは必要ありません。右?

X11、XCB、およびXKBを試してみましたが、対応するイベントベースの方法は、修飾キーが物理的に解放されたか、別の方法で使用された後にのみ、修飾キーの変更を登録します(マウスクリック中など)。

SHIFT次の「消費」イベントが発生するのを待たずに、キーを押す/解除する状態などを非同期的に読み取る方法を探しています。 X11/XCB/XKBがこれを許可しない場合は、HID方向に行くことも考慮するでしょうが、そうする前に非ブロック修飾子イベントパターンのような単純なものを見落としていないのか、そのようなものだけをオンにするだけです。

修正(2023-09-30):

これでv2とrawキーストロークのサポートも見ましたが、XInputあまり役に立ちませんでした。イベント処理は明らかにドライバレベルでこの動作を継承しました。

次のステップは、この理論を確認すると思われる調査の結果ですevtest。ドライバ層が関連する状態の変更を同期的に処理/通信しない場合、物理的な状態を非同期的に見ることは不可能です。

以下は、修飾子を押す/ドロップする間隔がほんの数ミリ秒であることがわかる端末出力のコピーです。実際には、それよりずっと長く押すことがあります。

Testing ... (interrupt to exit)
Event: time 1696090563.122466, type 4 (EV_MSC), code 4 (MSC_SCAN), value 1c
Event: time 1696090563.122466, type 1 (EV_KEY), code 28 (KEY_ENTER), value 0
Event: time 1696090563.122466, -------------- SYN_REPORT ------------
Event: time 1696090567.475603, type 4 (EV_MSC), code 4 (MSC_SCAN), value 2a
Event: time 1696090567.475603, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 1
Event: time 1696090567.475603, -------------- SYN_REPORT ------------
Event: time 1696090567.487761, type 4 (EV_MSC), code 4 (MSC_SCAN), value 2a
Event: time 1696090567.487761, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 0
Event: time 1696090567.487761, -------------- SYN_REPORT ------------
Event: time 1696090570.051134, type 4 (EV_MSC), code 4 (MSC_SCAN), value 2a
Event: time 1696090570.051134, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 1
Event: time 1696090570.051134, -------------- SYN_REPORT ------------
Event: time 1696090570.062911, type 4 (EV_MSC), code 4 (MSC_SCAN), value 2a
Event: time 1696090570.062911, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 0
Event: time 1696090570.062911, -------------- SYN_REPORT ------------
Event: time 1696090574.108130, type 4 (EV_MSC), code 4 (MSC_SCAN), value 2a
Event: time 1696090574.108130, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 1
Event: time 1696090574.108130, -------------- SYN_REPORT ------------
Event: time 1696090574.119016, type 4 (EV_MSC), code 4 (MSC_SCAN), value 2a
Event: time 1696090574.119016, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 0
Event: time 1696090574.119016, -------------- SYN_REPORT ------------
Event: time 1696090576.276169, type 4 (EV_MSC), code 4 (MSC_SCAN), value 1d
Event: time 1696090576.276169, type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 1
Event: time 1696090576.276169, -------------- SYN_REPORT ------------
Event: time 1696090576.288810, type 4 (EV_MSC), code 4 (MSC_SCAN), value 1d
Event: time 1696090576.288810, type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 0
Event: time 1696090576.288810, -------------- SYN_REPORT ------------
Event: time 1696090577.396269, type 4 (EV_MSC), code 4 (MSC_SCAN), value 38
Event: time 1696090577.396269, type 1 (EV_KEY), code 56 (KEY_LEFTALT), value 1
Event: time 1696090577.396269, -------------- SYN_REPORT ------------
Event: time 1696090577.407817, type 4 (EV_MSC), code 4 (MSC_SCAN), value 38
Event: time 1696090577.407817, type 1 (EV_KEY), code 56 (KEY_LEFTALT), value 0
Event: time 1696090577.407817, -------------- SYN_REPORT ------------

関連情報