XorgにKeyHoldイベントがありますか?

XorgにKeyHoldイベントがありますか?

私は新しい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ミリ秒後にこれを実行しますが、キーを押したときにはまだリリースされていません」という論理をプログラムするのは難しいです。 +「キーを離すときにこれを行います。ただし、保留イベントがまだトリガーされていない場合のみ」です。私はこれを簡単にする他の同様のフレームワークを知りません。

おすすめ記事