キー押下イベントを中断せずにキー押下時にプログラムを実行する

キー押下イベントを中断せずにキー押下時にプログラムを実行する

(グローバル)キーストロークをコマンドにバインドし、キーストロークの完了を妨げないようにすることは可能ですか?私は、バインディングキーソリューションを使用しようとするとここで他の場所に投稿:

# In file: ~/.xbindkeysrc
# Bind key 'q' to running 'some_command'
"some_command"
  q

これにより、「q」キーは他の場合のように完了しません。たとえば、文字「q」は端末に印刷されません。

xdotool次のように「q」キーを押すために使用されます。

# In file: ~/.xbindkeysrc
# Bind key 'q' to running 'some_command'
"some_command && xdotool key q"
  q

xdotool実行された「q」キーがバインディングを介して別の「some_command」を実行するため、ループが発生します。

もっと明確にするために、「q」キーを押していつものように実行したいと思います。しかもいくつかの外部コマンドを実行します。上記の解決策変える一部の外部コマンドを実行する「q」キー押下イベント。問題は、対応する外部コマンドが "q"キーを押してもシミュレートする場合、バインディングが外部コマンドを再開し、無限ループに陥るということです。

答え1

いいですね。私が見つけた解決策を投稿します。しかし、他の人がより良い解決策を持っているかもしれません。答えた後ここ、実行中に押されたすべてのキーを見ることができます

xinput test <keyboad_id>

ターミナルから。その後、そのコマンドの出力を「キーリリース24」(キーボードから「q」を離したときの出力)などの文字列を監視するプログラムにパイプする単純なケースです。その後、プログラムは必要に応じて操作を実行します。この文字列と一致します。

たとえば、「q」キーを押すことをキャプチャして、次のような音を出すことができます。

xinput test <keyboard_id> | while read in ; do
  [[ $in = "key press   24" ]] && aplay /usr/share/sounds/purple/alert.wav
done

明らかに、我々は異なる入力を観察し、必要に応じて他のタスクを実行することもできます。

関連情報