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
)は保持されたキーではなく、発生期のキー押下イベントを検出するように見えるため、不可能な場合があります。任意の回避策をいただければ幸いです。
現在開発しているものを続行するには、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 がある場合があります。