
私は新しいMacbook Proを持っていて、そこにArch Linuxをインストールしました。私がやりたいことの1つは、メディアキーを使ってmpdからトラックを検索し、次または前のトラックに移動することです。これはiTunesがあるOSXで可能なので、不可能なことではないと思います。xev
キーを押すイベントとキードロップイベントのみを表示するために使用します。鍵を握っていると、両方のイベントが急速に循環するようです。
だから私がしたいことは次のとおりです。
- XF86AudioNextキーを押すと、次のmpdトラックに移動します。
- XF86AudioNextキーを押しながら現在のmpdトラックを探す
もちろん、XF86AudioPrevキーも同じです(しかし反対方向)。
これはいくつかの高度なスクリプトでのみ達成できるようです。あなたの一人が私に正しい方向を教えてくれることを願っています。
編集:興味深いことに、showkey
キーを押したままにしても、クリックとドロップは循環しません。代わりに、キーを押している間に発生する一連のクリックイベントと、キーを最後にドロップしたときの最終リリースイベントのみを表示します。
xset
もう1つ興味深いのは、thenを使用して自動反復を無効にすると、キーをどれだけ長押ししても単一のキー押下イベントのみがxev
表示され、キーを離すと単一のキードロップイベントが表示されることです。一方、出力はshowkey
変更されません。一連の主要イベントとリリース時の最終キーリリースを表示します。
おそらくこれを使って私がやりたいことをスクリプトで書く方法があるでしょう。しかし、sxhkd
私が使用しているショートカットツールはこのアプローチにxev
従うようです。同じだXbindkeys
。
答え1
いいえ、KeyHoldイベントはなく、KeyPressとKeyReleaseのみがあります。 KeyPressはキーを押すと送信され、一定時間が経過すると再送信されます。時間は次のように設定できます。xset r
(最初の繰り返し時間と後続の繰り返し時間の2つの時間があります。)KeyReleaseイベントは、実際にキーを離すと送信されます(キーが押されている間は送信されません)。
アプリケーションが押されたキーに反応する場合は、初期キーの押下を記録し、設定された時間後または新しいKeyPressイベントの後に反応する必要があります(その間、KeyReleaseを受け取らないと仮定)。 Unix GUIの世界では、押されたキーに反応することは非常にまれであるため、これを行わないアプリケーションの独自の永続ループが存在し、プログラミングフレームワークもこれを行う簡単な方法を提供しません。
XKBを使用すると、特定のキーストロークを繰り返すことができないように構成できます。これらのキーストロークは、最初のKeyPressと最終的なKeyReleaseのみを生成します。構成では、これがどこで行われているのかわかりません。これらのキーの場合、KeyPress + timeoutポリシーのみが有効で、2番目のKeyPressポリシーは無効です。
xbindkeysとsxhkdはどちらも簡単にはできません。キーリリースイベントへのバインディング操作を許可しますが、キー押下とキーリリースの相関関係を簡単に関連付けることができないため、「キーを押してからXミリ秒後にこれを実行しますが、キーを押したときにはまだリリースされていません」という論理をプログラムするのは難しいです。 +「キーを離すときにこれを行います。ただし、保留イベントがまだトリガーされていない場合のみ」です。私はこれを簡単にする他の同様のフレームワークを知りません。
答え2
X11には簡単な解決策はありませんが、「keyhold」イベントを使用してカーネルからデバイス出力を読み取ることができます。 *kernel.orgの追加情報*
これは/ dev / input / event#のサンプル出力です(#はデバイスによって異なります)。
Event: time 1677080541.072921, type 4 (EV_MSC), code 4 (MSC_SCAN), value 9d
Event: time 1677080541.072921, type 1 (EV_KEY), code 97 (KEY_RIGHTCTRL), value 1
Event: time 1677080541.072921, -------------- SYN_REPORT ------------
Event: time 1677080541.319094, type 4 (EV_MSC), code 4 (MSC_SCAN), value 9d
Event: time 1677080541.319094, type 1 (EV_KEY), code 97 (KEY_RIGHTCTRL), value 2
Event: time 1677080541.319094, -------------- SYN_REPORT ------------
Event: time 1677080541.348759, type 4 (EV_MSC), code 4 (MSC_SCAN), value 9d
Event: time 1677080541.348759, type 1 (EV_KEY), code 97 (KEY_RIGHTCTRL), value 2
Event: time 1677080541.348759, -------------- SYN_REPORT ------------
Event: time 1677080541.379604, type 4 (EV_MSC), code 4 (MSC_SCAN), value 9d
Event: time 1677080541.379604, type 1 (EV_KEY), code 97 (KEY_RIGHTCTRL), value 0
出力は1(キーを押す)、2(キーを保持)、0(キーを離す)に進みます。
/dev/input/event#の出力を監視することで、私が作成した単純なスクリプトでコマンドを実行して検索と次の動作をシミュレートできます(「playerctl position 5+」と「playerctl next」を使用)。ここにいるフラッグハブブランチ。