web-dev-qa-db-ja.com

キーイベントを中断せずに、キーを押すとプログラムを実行します

(グローバル)キー押下を何らかのコマンドにバインドし、それでもキー押下の完了を中断しないことは可能ですか?つまり、bindkeyソリューションを試してみると ここに投稿されています

# 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」キーの押下もシミュレートする場合、バインディングが外部コマンドを再起動し、無限ループに陥ることです。

6
Zorawar

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

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

その後、明らかに、他の入力も監視し、必要に応じて他の何かを実行できます。

5
Zorawar