2010-09-25 44 views
5

一些關鍵考慮一個應用程序,這是理想的重點時,爲了捕獲所有的窗口管理器命令(ALT + F4和諸如此類的東西)進行處理,從而抓住鍵盤。現在,這有一個缺點,即用戶無法在抓住鍵盤時通過鍵盤切換到另一個應用程序或虛擬桌面。我希望有一個用戶定義的排除在抓取之外的組合鍵(例如,用於切換虛擬桌面的組合鍵)的白名單。剔除XGrabKeyboard

我能想到的兩種可能的方法。當列入白名單的按鍵事件發生時,或者是

  1. 以某種方式告訴X像往常一樣繼續處理它。這聽起來像是做的更自然的方式,但我無法找到一個方法來做到這一點,或
  2. Ungrab鍵盤和手工重新發送該事件處理的窗口管理器,但我不知道在哪裏發送它(根窗口?)或者它是否可以工作。

任何人都可以在這些填補空白?還有其他建議嗎?

如果沒有辦法從抓鬥排除鑰匙,我想我會滿足於具有「退出鍵」按下時ungrabs鍵盤。用戶將不得不按下它,然後再按窗口管理器命令,但這並不好。

回答

4

我不認爲有辦法做到這一點。沒有任何機制的工作,你會如何需要他們。

方法1是排序的,如果它決定不攔截例如點擊或關鍵窗口管理器做什麼。然而,WM是使用「無源」上的特定鍵(XGrabKey =被動XGrabKeyboard =活性)抓鬥然後XAllowEvents()。 XAllowEvents()不適用於XGrabKeyboard()。此外,當您XAllowEvents與回放模式中的一種,在重放時繞過了原來的搶窗口,並在其所有的父窗口的所有被動爭奪。 WM的抓鬥將會放在根窗口上,這將始終是父窗口,所以無法重播到根窗口,我可以告訴。無論如何,在每個可能的關鍵點上做XGrabKey都會是一種心理。

方法2將有不良競爭狀態的問題,因爲你可以重新發送之前其他鍵和鼠標事件可以被處理,所以你會重新排序鍵和事件發送到破壞的窗戶和其他混亂。另外,沒有好的方法來發送關鍵事件。許多客戶端忽略XSendEvent()(它允許在事件中設置send_event標誌)。可以使用XTest擴展,但可以在生產X服務器上禁用,但仍存在競爭條件問題。

你可能需要的是一個協議擴展,它可以讓你在GrabKeyboard之後做一個AllowEvents(mode = ReplayKeyboard),並且不需要繞過父窗口的被動抓取。

一個需要注意的是,我不知道所有的野生的東西,可以用XKB和XInput2來完成,所以也許有什麼東西在這些擴展。不管怎麼說,就我所知,你必須解決「逃脫密鑰」問題,儘管最終X服務器和/或窗口管理器規範可能具有「VMWare/VNC類型的事物意識,「這在短期內不會對你有所幫助。例如,一個EWMH規範擴展可能就像vnc/vmware/stuff這樣的新的_NET_WM_WINDOW_TYPE一樣簡單,並且窗口管理器可以減少它的鍵綁定或爲它們添加額外的修飾符,或者當該窗口關注時。

+0

我怕我會得到這樣的回答。我敢肯定,如果可能的話,我會看到一款能夠做到這一點的軟件。但是,感謝您指向XInput 2,我現在正在看它,它似乎有抓取輸入設備的新方法。將運行一些測試,看看它是否可能 – 2010-09-26 14:01:05

+0

事實證明,這樣的事情「可能計劃用於XI2.1」,根據谷歌,這似乎還沒有存在。但是,新的WM提示聽起來不是一個壞主意,所以我開始討論freedesktop.org wm-spec列表。 http://mail.gnome.org/archives/wm-spec-list/2010-September/thread.html – 2010-09-27 20:46:10