web-dev-qa-db-ja.com

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

here で説明されているように、仮想端末を循環するために、xbindkeysを使用してAlt + leftとAlt + rightをchvtにバインドしています。使用可能な仮想端末の数(6)に関してモジュール式になるように算術を変更しました。ウィンドウマネージャーのインスタンスごとにxbindkeysデーモンを起動します(たとえば、tty1でdwmを開始する前、およびtty2でopenboxを起動する前)。つまり、各ttyには独自のxbindkeysインスタンスがあります。

どうやら、xbindkeysは発生期のキー押下イベントのみを検出でき、残りのキーは検出できません。したがって、tty1からAlt +右を押してtty2に切り替えてから、tty3に進みたい場合は、両方のキーを放し、両方をもう一度押して続行する必要があります。 X以外のttyを使用すると、両方のキーを保持するか、保持することができます Alt 矢印キーをタップしながら押した。この機能(つまり、キーを押すメモリ)をxbindkeysで複製できますか?どうやら複数のインスタンス(前述のようにWMごとに1つ)が必要であり、プログラム(xbindkeys)は保持されたキーではなく、発生期のキー押下イベントを検出するように見えるため、不可能な場合があります。任意の回避策をいただければ幸いです。

2
user001

現在開発しているものを続行するには、evemuツールパッケージを使用して、ユーティリティ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

ご想像のとおり、元の問題にはおそらくもっと簡単な解決策があります。 xbindkeysを使用してこの問題をここで修正する代わりに、libeventを使用して別の解決策を検討することもできます。 Linux Journalの Linux USB Input Subsystem および part 2 のCに例があります。これを簡単にするために、システムにPythonライブラリ evdev がある場合があります。

1
meuh