Windows覆盖所有屏幕 - 甚至是支柱 - 全屏失败

时间:2016-05-05 17:56:55

标签: xcb

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

无论如何,暂时让我的窗户最顶端(甚至超过所有支柱)。我确定我的窗户总是在最顶层。

1 个答案:

答案 0 :(得分:1)

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

因此,此请求完全由窗口管理器处理。这不仅包括尊重或拒绝请求,还意味着窗口管理器决定“全屏”意味着什么,即尽管全屏显示其他客户端是否或在哪个位置可见(尽管规范当中已明确说明应该解释全屏。)

底线是你的窗口仍然是一个托管窗口,而你自己的窗口总是想做自己的事情,它是窗口管理器的责任(更重要的是,它的正确)到权衡个人客户的愿望与其他一切。

长话短说:不,没有办法。事实上,全屏的要求可能已被完全拒绝,这样就可以了。 有责任处理窗口管理员决定在此处执行的操作。

那就是说 - 你可以选择不重定向你的窗口,即让它不受管理。您可以通过将其设置为override_redirect窗口来实现此目的,但它不受管理也意味着没有任何装饰,也没有任何窗口管理器交互等。

无论如何,提升非托管窗口不会再导致配置请求,但只会受到X服务器的尊重。见man XRaiseWindow

  

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

当然,窗口管理器(或其他客户端)仍然能够注意到这一点,并可能通过再次提高其他窗口作出反应(尽管这不太可能)。像i3lock这样的屏幕锁定器存在这个问题,解决问题的唯一方法就是自己监听可见性事件并再次提升窗口,希望你和其他窗口不会遇到永无止境的争斗。

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

相关问题