Linux

Xorg 中有 KeyHold 事件嗎?

  • April 9, 2016

我有一台新的 Macbook Pro,並在上面安裝了 Arch Linux。我想要做的一件事是使用媒體鍵來搜尋曲目(在 mpd 中)並轉到下一個或上一個曲目。這在帶有 iTunes 的 OSX 上是可能的,所以我認為這不是根本不可能的。僅使用xev顯示 Key Press 和 Key Release 事件。拿著鑰匙似乎只是快速地循環通過這兩個事件。

所以我想做的是:

  • 按下 XF86AudioNext 鍵時轉到下一個 mpd 曲目;或者
  • 按住 XF86AudioNext 鍵時搜尋目前 mpd 曲目

當然 XF86AudioPrev 鍵也是一樣的(但在另一個方向)。

似乎這只能通過一些高級腳本來實現。希望你們中的一個人能指出我正確的方向。

編輯:有趣showkey的是,按住一個鍵時不會在 Press 和 Release 之間循環。相反,它只是顯示了一堆 Press 事件,在這些事件中,按鍵被按住,最後一個 Release 事件在它最終鬆開時顯示。

我剛剛注意到的另一件有趣的事情是,當禁用自動重複時,xset無論xev按鍵被按住多長時間,都只會顯示一個按鍵事件,而鬆開按鍵時會顯示一個按鍵釋放事件。另一方面,showkey輸出沒有改變。它顯示了一堆按鍵事件和鬆開時的最終按鍵釋放。

可能有一種方法可以使用它來編寫我想做的腳本,但sxhkd我使用的熱鍵工具似乎遵循了這種xev方式。也是如此Xbindkeys

不,沒有 KeyHold 事件,只有 KeyPress 和 KeyRelease。KeyPress 在按鍵被按下時發送,並在一定時間後再次發送。可以配置時間xset r(有兩個時間:第一次重複的時間和後續重複的時間)。KeyRelease 事件在實際釋放鍵時發送(在按住鍵時不發送)。

如果應用程序希望對按住的鍵做出反應,它需要記下初始按鍵,然後在設定的時間或新的 KeyPress 事件之後做出反應,假設它在此期間沒有收到 KeyRelease。在 Unix GUI 世界中,對持有的鍵做出反應是非常不尋常的,因此存在一個自我延續的循環,應用程序不這樣做,並且程式框架沒有提供簡單的方法來做到這一點。

XKB 允許將某些鍵配置為不可重複;這些鍵只會生成初始 KeyPress 和最終 KeyRelease。我不知道這是在配置中完成的。使用這些鍵,只有 KeyPress+timeout 策略有效,第二個 KeyPress 策略無效。

xbindkeys 和 sxhkd 都沒有讓這變得容易。雖然它們允許將動作綁定到按鍵釋放事件,但它們並不容易將按鍵和按鍵釋放相關聯,因此很難編寫邏輯“在按鍵後執行 X ms,但前提是密鑰尚未釋放”+“在密鑰釋放時執行此操作,但前提是尚未觸發保持事件”。我不知道有任何其他類似的框架可以讓這變得簡單。

引用自:https://unix.stackexchange.com/questions/275037