xbindkeysを使用して保持キーを検出する

xbindkeysを使用して保持キーを検出する

上記のように仮想ターミナルを循環するには、xbindkeysAlt+左とAlt+右バインディングを使用します。chvtここ。使用可能な仮想端末数(6個)に関してアルゴリズムをモジュラーに修正しました。私はxbindkeysウィンドウマネージャの各インスタンスに対してデーモンを起動します(たとえば、tty1でdwmを起動する前に、tty2のopenboxでも同じです)。つまり、各ttyには独自のxbindkeysインスタンスがあります。

明らかに、xbindkeys新しいキーイベントのみを検出でき、残りのキーイベントは検出できません。したがって、Alt +右を押してtty1からに切り替え、続行tty2するには両方のtty3キーを離し、前に移動するには両方のキーをもう一度押す必要があります。 ttyでない場合は、両方のキーを押しながら矢印キーをクリックXできます。Altこの機能(キーメモリなど)をコピーできますかxbindkeys?明らかに、複数のインスタンス(上記のようにWMごとに1つ)が必要であり、プログラム(xbindkeys)が保持されているキーではなく初期キーイベントを検出しているように見えるため、これは不可能です。どんな解決策でも大変感謝します。

答え1

現在開発中の作業を続行するには、次を使用できます。エビムユーティリティプログラムevtestとツールキットを使用してくださいevemu-event。入力イベントデバイスを一覧表示し、sudo evtestキーボードに対応する行を見つけます。特別なキーボードがあり、次のようになります。

/dev/input/event2:      HID 05f3:0007

次に、その番号(私の場合は2)を選択し、識別したいキー(Alt)を押します。左シフトを使って

Event: time 15094562, -------------- SYN_REPORT ------------
Event: time 15094562, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e1
Event: time 15094562, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 1

ここで見ることができるのは、Shiftキーを押すと値が1のKEY_LEFTSHIFTコードを含むEV_KEYタイプイベントが発生し、それを放すと値が0の類似イベントが発生することです。

これで、いつでも(例えばchvt以降)、そのキーの状態を簡単に照会できます。私の場合

sudo evtest --query  /dev/input/event2 EV_KEY KEY_LEFTSHIFT

値が0の場合、このコマンドの戻りコードは0、値が1の場合は戻りコードは10です。を使用してこの値を表示できますecho $?

これでキー押下の状態がわかりましたので、X11サーバーが「現在の」状態を表示できるようにキー押下イベントをシミュレートできます。私の立場ではそうします

sudo evemu-event /dev/input/event2 --type EV_KEY --code KEY_LEFTSHIFT --value 1

想像できるように、元の問題に対するより簡単な解決策があるかもしれません。 libeventを使用すると、ここで使用されているものとは異なるソリューションを確認し、xbindkeysこの問題を解決できます。 Cには例があります。Linux USB入力サブシステムそしてパート2Linuxマガジンから。システムにPythonライブラリがある可能性があります。evdevこれをより簡単にしてください。

関連情報