为什么激活子菜单时键盘快捷键不起作用?

为什么激活子菜单时键盘快捷键不起作用?

如果右键单击子菜单(例如桌面、图标/文件或面板)处于活动状态,则键盘快捷键(如Ctrl+ Alt+ )或多媒体键(如播放/暂停)将不起作用。T同样,在 gmusicbrowser、qpdfview 或 Libreoffice 等应用程序中打开右键菜单时,它们也不起作用(我不会尝试每一个)。通过按任何面板图标在面板中打开子菜单后,或者在 Thunar 中打开子菜单(例如编辑)时,它们都不起作用。

为什么是这样?直观上看,这似乎是因为活动子菜单禁用了“系统”的“监听快捷方式的调用”功能。这是正确的吗?严格来说,这难道不是对系统“监听能力”的限制吗?

奇怪的是(?),当 Firefox 的右键菜单打开时,不会发生这种情况。

答案1

这种效应是由于在 X Windows 中抓取。当我在 Fedora 25 中运行 Wayland 桌面时,甚至 XWayland 中的 X 应用程序也不再具有这种效果。 AKDE 错误与此问题相关的问题已被关闭,以支持使用 Wayland。

从技术上讲,是否使用抓取取决于所使用的 GUI 工具包/小部件(或应用程序,如果它直接与 X 对话)。许多 GUI 工具包在菜单打开时使用 X 抓取。但是,那原因对于这一点 - 以及 Firefox 似乎如何避免它 - 似乎相当晦涩难懂。

X 抓取的另一个用途是游戏和嵌套桌面(例如远程访问和虚拟机)。最初编写此答案时,Wayland 不支持任何获取所需键盘事件的方法。[1][2]。因此,尚不清楚 XWayland 抓取将如何处理,即 XWayland 抓取是否会再次开始产生您描述的特定效果。 Fedora 27 上的测试表明并非如此。


堆栈溢出建议使用输入抓取,而不是将输入焦点设置到子窗口,可能是防止窗口管理器以“非活动”颜色重绘主窗口标题栏的唯一方法。

我能找到的关于此问题的最“官方”来源是错误报告。显然,使用 X 抓取菜单是一个长期存在的问题。如果您读到最后,您将看到解决上述窗口管理器问题的建议。也许这就是火狐所做的。

(想一想,我不确定全局键盘快捷键在原始桌面环境中是否同样重要。我知道 Alt+Tab 来自 CDE,但没有明显的理由在菜单打开时使用 Alt+Tab)。


Qt 菜单弹出窗口抓取键盘和指针,阻止用户使用系统热键(例如进行屏幕截图)

X11提供的实现弹出菜单的机制是全局键盘和鼠标抓取。所有现代应用程序和工具包都使用这种机制,包括 Qt。不幸的是,我没有看到一种方法可以在不进行一些非常严重的行为改变的情况下改变这一点(这也会损害用户体验)。


打开某些菜单时屏幕不会锁定

米歇尔在中回答了这个问题http://bugs.debian.org/514036


--8<-- 米歇尔·丹泽

确实如此;这是当指针位于菜单之外时菜单可以接收输入事件的唯一方法。 AFAIK 这是一个相当深的 X11 设计问题,所以我担心这不能轻易解决。不过,请随意将其带到上游。

--8<--

好的。感谢您提供此信息。我向上游报告了这一情况:

http://bugs.freedesktop.org/show_bug.cgi?id=19946


我不清楚是否确实需要键盘抓取来实现带有访问键的菜单,尽管这是工具包经常做的事情。

从将事件定向到菜单窗口的角度来看可能很方便。

但在大多数情况下,主应用程序窗口将具有焦点,因此应用程序可以在那里接收键盘事件。

如果由于某种原因客户端通常不会在主窗口中接收焦点,我想知道它是否应该协商键盘焦点(可能在全局活动输入模型下)而不是窃取键盘抓取,在客户端释放之前无法覆盖键盘抓取。


指针抓取可能有助于通过单击屏幕上的其他任何位置来“单击出”菜单,但不会实际触发您单击的元素。然而维基百科说可以在不抓住键盘的情况下抓住指针。/

相关内容