【问题标题】:Windows covering all screens - even struts - full screen failingWindows 覆盖所有屏幕 - 甚至是 struts - 全屏失败
【发布时间】:2016-05-05 17:56:55
【问题描述】:

我创建了两个监视器。我创建了两个窗口。我将它们移到不同的显示器上并全屏显示。现在,当窗口具有焦点时,所有保留的“支柱”(我认为它们被称为)都被覆盖了。但是,当窗口没有焦点时,后面的“支柱”会显示在窗口上方。

有没有办法暂时让我的窗口最上面(甚至在所有支柱上)。我确实将我的窗口设置为始终在顶部。

【问题讨论】:

  • 这完全取决于窗口管理器。你唯一能做的就是让你的窗口 override_redirect 窗口,强制它们在上面,并希望窗口管理器不会和你作对。

标签: xcb


【解决方案1】:

我假设通过“使您的窗口全屏”,您的意思是您为 _NET_WM_STATE_FULLSCREEN 原子发送了 _NET_WM_STATE 客户端消息。

因此,此请求完全由窗口管理器处理。这不仅包括接受或拒绝请求,还意味着窗口管理器可以决定“全屏”的含义,即,尽管全屏,其他客户端是否可见或在什么时候可见(尽管规范明确说明了如何fullscreen 应该被解释)。

底线是您的窗口仍然是一个托管窗口,虽然您自己的窗口总是想做自己的事情,但窗口管理器的责任(更重要的是,它的权利)权衡个别客户的意愿与其他一切。

长话短说:不,没有办法。事实上,全屏的请求可能已经被完全拒绝了,这很好。 有责任处理窗口管理器决定在这里做什么。

也就是说,您可以选择不重定向您的窗口,即使其不受管理。您可以通过将其设为override_redirect 窗口来做到这一点,但它不受管理也意味着没有装饰,没有任何窗口管理器交互等。

无论如何,引发非托管窗口不会再导致配置请求,而只会被 X 服务器接受。见man XRaiseWindow

如果窗口的 override-redirect 属性为 False 并且某些其他客户端已在父级上选择了 SubstructureRedirectMask,则 X 服务器生成 ConfigureRequest 事件,并且不执行任何处理。否则,窗口 被提升了。

当然,窗口管理器(或其他客户端)仍然能够注意到这一点,并且可能会通过再次启动其他窗口来做出反应(尽管这不太可能)。像 i3lock 这样的屏幕储物柜有这个问题,解决这个问题的唯一方法是自己监听可见性事件并再次抬起窗口,希望你和另一个窗口不要陷入无休止的战斗。

一般来说,我会重新考虑您是否真的想这样做。如果窗口管理器决定这是它想要提供的感觉,你不应该乱用它。如果您的窗口甚至没有焦点,那么您的窗口仍然是输出上唯一可见的窗口真的那么重要吗?

【讨论】:

  • 是的,我认为 override_redirect 在您的情况下可能是一种有效的方法,因为无论如何用户都不应该将叠加层体验为普通的、可移动的、可调整大小的窗口。
  • 请注意,由于您绕过了窗口管理器,因此现在无法以这种方式全屏显示。您需要自己将窗口配置为适当的大小(并定位它)。
  • 看看i3lock源代码。它创建了一个覆盖整个屏幕的 override_redirect 窗口并将其升起——全部使用 xcb。它还会对可见性事件做出反应以再次升起窗口。只需在其代码中搜索“raise”即可查看如何使用 xcb 提升窗口。
  • @Noitidart 不,“始终在顶部”的事情只是需要由窗口管理器确保的协议。但是您的窗口不再受到管理。每当另一个窗口挡住它时,您需要重新升起窗口。同样,这意味着您可能最终与另一个应用程序发生冲突。这就是协议的用途;让窗口管理器协调事情。但正如您在原始问题中看到的那样,窗口管理器可能会决定反对您。
猜你喜欢
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
相关资源
最近更新 更多