gpt4 book ai didi

keyboard - 从 XGrabKeyboard 中排除一些键

转载 作者:行者123 更新时间:2023-12-04 20:23:25 30 4
gpt4 key购买 nike

考虑一个应用程序,它希望在获得焦点时捕获键盘,以便捕获所有窗口管理器命令(Alt+F4 等)进行处理。现在,这有一个缺点,即用户在捕获键盘时无法通过键盘切换到另一个应用程序或虚拟桌面。我想要一个用户定义的组合键白名单(例如,用于切换虚拟桌面的组合键),这些组合被排除在抓取之外。

我可以想到两种可能的方法。当列入白名单的关键事件到达时,要么

  • 不知何故告诉 X 像往常一样继续处理它。这听起来像是一种更自然的方法,但我找不到这样做的方法,或者
  • 松开键盘并手动将事件重新发送到窗口管理器进行处理,但是我不知道将它发送到哪里(根窗口?)或者这是否可行。

  • 任何人都可以填写这些空白吗?还有其他建议吗?

    如果没有办法从抓取中排除键,我想我将不得不接受一个“退出键”,它在按下时会释放键盘。但是,用户必须同时按下它,然后按下窗口管理器命令,这不是很好。

    最佳答案

    我不认为有办法做到这一点。没有一种机制能完全按照您的需要工作。

    方法 1 是窗口管理器在决定不拦截点击或按键时所做的事情。但是,WM 在特定键上使用“被动”抓取(XGrabKey=passive XGrabKeyboard=active),然后是 XAllowEvents()。 XAllowEvents() 不适用于 XGrabKeyboard()。此外,当您使用其中一种重播模式进行 XAllowEvents 时,重播事件会绕过具有原始抓取的窗口及其所有父窗口上的所有被动抓取。 WM 的抓取将在根窗口上,该窗口始终是父窗口,因此无法重播到根窗口,我能说得最好。无论如何,对每一个可能的键都执行 XGrabKey 会有点心理。

    方法 2 会出现糟糕的竞争条件问题,因为在重新发送之前可以处理其他键和鼠标事件,因此您需要重新排序键并将事件发送到被破坏的窗口和其他困惑。此外,没有发送关键事件的好方法。 XSendEvent() 被许多客户端忽略(它在允许这样做的事件中设置了 send_event 标志)。可以使用 XTest 扩展,但可能在生产 X 服务器上被禁用,并且仍然存在竞争条件问题。

    您可能需要的是一个协议(protocol)扩展,它允许您在 GrabKeyboard 之后执行 AllowEvents(mode=ReplayKeyboard),而无需绕过父窗口上的被动抓取。

    需要注意的是,我不知道所有可以用 XKB 和 XInput2 完成的疯狂的东西,所以也许这些扩展中有一些东西。

    无论如何,据我所知,您必须满足于“退出键”,尽管最终 X 服务器和/或窗口管理器规范具有“VMWare/VNC 类型的事物意识”可能会很好,这赢得了短期内帮不了你。例如,EWMH 规范扩展可以像 vnc/vmware/stuff-like 的新 _NET_WM_WINDOW_TYPE 一样简单,并且窗口管理器可以减少其键绑定(bind)或向它们添加额外的修饰符或其他东西。

    关于keyboard - 从 XGrabKeyboard 中排除一些键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3795636/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com