从 XGrabKeyboard 中排除一些键

2024-04-26

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

我可以想到两种可能的方法。当白名单中的关键事件到来时,

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

有人可以填补这些空白吗?还有其他建议吗?

如果没有办法从抓取中排除按键,我想我将不得不满足于使用“退出键”,在按下时可以取消抓取键盘。不过,用户必须同时按下该命令和窗口管理器命令,这不太好。


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

例如,如果窗口管理器决定不拦截单击或按键,则采用方法 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/类似的东西的新 _NET_WM_WINDOW_TYPE 一样简单,并且窗口管理器可以减少其键绑定或向它们添加额外的修饰符或在该窗口聚焦时添加额外的修饰符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 XGrabKeyboard 中排除一些键 的相关文章

  • 适用于 Raspberry Pi 的触摸屏 Kivy 应用

    场景如下 我使用 python 框架编写了一个 guiKivy http kivy org 我想在树莓派上运行它这个触摸屏 https learn adafruit com adafruit pitft 28 inch resistive
  • 在 JS/jQuery 中绑定方向键

    如何在 Javascript 和 或 jQuery 中将函数绑定到左右箭头键 我查看了 jQuery 的 js hotkey 插件 包装内置绑定函数以添加参数来识别特定键 但它似乎不支持箭头键 document onkeydown func
  • 在java中注入击键

    我正在寻找一种将击键注入操作系统键盘输入缓冲区的方法 就像当您单击一个按钮时 程序会插入一个 或多个 键盘敲击 我想在java中执行此操作 因为我想在 win linux和osx 中运行它 我想我必须利用 JNI 有人有什么想法吗 感谢所有
  • 如何在Android移动网站中强制使用数字键盘

    我有一个移动网站 它有一些 HTMLinput其中的元素 如下所示
  • 如何在循环期间的任意时刻检查按键按下情况?

    我正在尝试制作一个倒数到 0 然后开始向上计数的计时器 我正在使用时间和键盘模块 这keyboard https pypi org project keyboard来自 PyPi 的模块 一切都按预期进行 我可以按一个按钮关闭程序 但它只在
  • 从另一个 Activity 返回时 SearchView 获得焦点并打开键盘

    当我从另一个活动返回主活动时 searchView 获得焦点并且键盘打开 我设法使用以下方法阻止键盘打开 getWindow setSoftInputMode WindowManager LayoutParams SOFT INPUT ST
  • 按下某个键时仅增加 1

    我想在按下 s 键时将变量 shot pressed 增加一 无论我按下多长时间 但结果是变量不断增大 我按下的时间越长 变量的值就越大 下面是我的代码的一部分 import keyboard shot pressed 0 if keybo
  • 如果没有 sudo,则无法在 Qt 应用程序中使用键盘

    我有一个在 BeagleBone Black 上运行的交叉编译的嵌入式 Qt 应用程序 它工作正常 但有一件事 如果我不直接在 BeagleBone Black 上运行 它不接受键盘输入sudo 这是一个问题 因为 我无法远程调试应用程序并
  • getch 返回-1?

    他们询问如何捕获 F11 或 insand getchr 等键 这些键不会返回任何内容 而且我找不到任何可以接受来自输入事件的原始输入的方法 我现在正在 C 程序中尝试 ncurses curses 来捕获这些键 我的测试程序很简单 基本上
  • Android 中的自定义键盘视图

    我正在开发一个自定义 Android 键盘 我开始开发我的键盘 基于this http code tutsplus com tutorials create a custom keyboard on android cms 22615教程
  • Android Web 视图中隐藏在键盘下方的文本框

    我创建了一个简单的 iPhone Android 应用程序 包含一个普通的 Web 视图 这个网络视图调用我的网站 在我的网站上有几种输入类型 文本或文本区域的表单 当它们位于页面底部时 我遇到了问题 1 在我的iPhone应用程序中 键盘
  • 通过代码使 SHIFT+3 在 OSX 上生成 `#` 而不是 `£`

    在我的英国 MacBook Air 上 可以使用 OPT 3 键入 SHIFT 3 目前产生 如何重新接线以便 SHIFT 3 产生 这个问题的动机是https apple stackexchange com questions 15615
  • android 中软键盘上方需要上一个、下一个按钮

    我想在键盘上方显示带有 上一个 下一个 按钮的虚拟键盘 当用户单击 上一个 按钮时 光标应移动到上一个编辑文本输入字段 单击 下一个 按钮应转到视图中的下一个编辑文本字段 如果我们在Android浏览器中打开任何要求输入的页面 我们就可以看
  • WPF 将“菜单”键称为什么?

    我正在查看此处定义的键 http msdn microsoft com en us library system windows input key aspx http msdn microsoft com en us library sy
  • 在键盘隐藏的颤动页面文本字段中

    我正在使用 flutter 制作一个有人可以评论的页面 该页面由 showModalBottomSheet 显示 但是当键盘显示在前面时 文本字段会被键盘隐藏 flutter doctor output Doctor summary to
  • 使用 xlib 将图像加载到窗口上

    我已经创建了窗口类 我想插入图像作为该窗口的背景 文件格式必须为 png 我使用magick 的XImage来加载图像 但不知道如何将其作为我的窗口的背景 知道怎么做吗 使用创建像素图 Pixmap XCreatePixmap displa
  • 使用 FocusScope.of(context).unfocus() 重建小部件树

    我有这个例子 override Widget build BuildContext context return Scaffold body SafeArea child Padding padding const EdgeInsets a
  • 如何检测 OS X 上是否按下了某个键?

    我正在为 OSX 编写 Spritekit 游戏 如何检查当前是否按下某个键 考虑这个例子 some code this could be e g inside a game loop if is key w pressed move fo
  • X11剪贴板如何处理多种数据格式?

    这可能也发生在您身上 有时 当您将某个网页中的文本复制到您最喜欢的网络邮件客户端中的富文本电子邮件草稿中时 您不喜欢粘贴的内容piece有不同的字体 大小 粗细 它以某种方式记住样式 通常是图像 当选择时 如果您将相同的内容粘贴到您最喜欢的
  • 在 Swing 中使用印度语输入法输入文本时不显示英文字符

    我正在开发一个应用程序 它接受英语文本并使用自定义的第 3 方 API 将音译为印度语 受支持的几种语言之一 该应用程序针对 Windows XP 7 和 Ubuntu 我们使用自定义输入法来加载所需的印度语字体 并使用它渲染文本 此外 用

随机推荐