我想创建一个应用程序,我在窗口上绘制,无论是窗口还是全屏,我抓住鼠标但不拦截任何WM 键盘快捷键,如 Alt+Tab,并且每当用户输入/离开时我也需要得到通知重点。
Google Chrome、Firefox 或 gnome-terminal 等常见应用程序可以很好地处理这个问题(使用 F11 全屏,但仍然有 Alt+Tab),但它们不会抓住鼠标。
SDL 对这个用例的处理很差是出了名的:SDL_WM_GrabInput 抓取鼠标但也拦截 WM 快捷方式;并且 SDL_FULLSCREEN 本身似乎有某种自动抓取(不要问我为什么)。
一个解决方案可能是自己为 Alt+Tab 编写代码,但这很糟糕(并且对其他 WM 快捷方式没有帮助,例如更改到另一个工作区)。
另一种解决方案是不调用 SDL_WM_GrabInput,而是假装抓取:只需隐藏鼠标指针(使用 SDL_ShowCursor)并在用户移动时将其移回中心。这是丑陋的,但在实践中有效 - 当然除了 SDL_FULLSCREEN,因为它会自动抓取(与理智的实现不同)。支持全屏的 SDL 解决方案就是这样,但这仍然不是我想要的。我不想让黑客启用和禁用抓取,我想抓住鼠标而不是抓住键盘。
所以我对 SDL 很生气,想看看替代品。我想使用 SDL,但这不是必需的。
这个问题似乎在指出,SDL 实际上所做的是使用 XGrabKeyboard。通过阅读手册页,我并不清楚您是否可以在不抓住键盘的情况下抓住鼠标(我自己从未使用过 Xlib)。
我知道如何使用 GTK(即 Alt+Tab 友好的 gnome-terminal 品种)制作“假全屏”。我想这样做,再加上鼠标隐藏并将其移回中心(“假抓取”)可以做到这一点,但这感觉就像太多的胶带。必须有更简单的方法。(此外,我不想将 GTK 添加为依赖项;但我也不确定进行原始 Xlib 调用是否是个好主意)。
对此有什么好的解决方案?
我需要一个 Linux/X11 解决方案,但它最好是跨平台的 - 我知道这可以在 Windows 上顺利解决,所以也许有一个库可以做到这一点。(另外,我用 OpenGL 渲染,但这无关紧要)
PS:也许我对这个问题的理解很差,我没有问正确的问题,所以请随时指出我没有考虑过的方法。