从XGrabKeyboard中排除一些键
考虑一个应用程序,希望在聚焦时抓住键盘来捕获所有窗口管理器命令(Alt + F4以及其他)以进行处理。 现在,这有一个缺点,即用户无法在抓住键盘时通过键盘切换到另一个应用程序或虚拟桌面。 我希望有一个用户定义的排除在抓取之外的组合键(例如,用于切换虚拟桌面的组合键)的白名单。
我可以想到两种可能的方法。 白名单键盘事件到达时,也是
任何人都可以填写这些空白吗? 还有其他建议吗?
如果没有办法从抓取中排除键,我想我必须要有一个“按键”来解除键盘上的按键。 用户将不得不按下它,然后再按窗口管理器命令,但这并不好。
我不认为有办法做到这一点。 没有任何机制的工作,你会如何需要他们。
方法1是窗口管理器如果决定不拦截点击或键例如做的事情。 但是,WM在特定键上使用“被动”抓取(XGrabKey = passive XGrabKeyboard = active),然后使用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一样简单,并且窗口管理器可以减少它的键绑定或为它们添加额外的修饰符,或者当该窗口关注时。
链接地址: http://www.djcxy.com/p/18425.html