2017-02-23 53 views
1

我正在写一个窗口管理器,我想知道是否可以创建一个覆盖所有其他窗口的窗口,但根本没有投入重点。换句话说,我最好喜欢能够在没有任何输入的情况下画出这个窗口。用xlib创建一个不接受任何输入事件或抓取焦点的透明窗口

一种方法是让窗口管理器调用XQueryTree,然后将输入(鼠标点击,键盘输入等)传递给相应的窗口。但是,我想知道是否有办法阻止这个覆盖窗口从来没有获得输入事件。

此外,我不想直接在根窗口上绘图,因为这会破坏合成管理器。

回答

1

复合扩展提供你想要什么:该协议的

https://www.x.org/releases/X11R7.7/doc/compositeproto/compositeproto.txt

3.2复合叠加窗口

0.3版增加了复合叠加窗口, 提供合成管理者在其表面没有 的干扰。该窗口始终在正常窗口之上,并始终在屏幕保护程序窗口下面 。它是一个InputOutput窗口,其宽度为 ,高度为屏幕尺寸。它的视觉效果是根视觉 ,其边框宽度为零。尝试使用 组合扩展名重定向它将被忽略。此窗口不会出现在QueryTree请求的 答复中。它也是覆盖重定向窗口。 最后两个功能使窗口管理器和其他X11 客户端不可见。访问此窗口的XID的唯一方法是通过CompositeGetOverlayWindow请求获取 。最初,复合叠加层 窗口未映射。

CompositeGetOverlayWindow返回复合叠加层的XID 窗口。如果该窗口尚未映射,则该映射将由此 请求映射。当所有呼叫此请求的客户端都终止了 其X11连接时,该窗口未映射。

组合经理可能会直接呈现到复合叠加 窗口,也可以重新设置父级其他窗口是这个 窗口的儿童和渲染这些。多个客户端可能会渲染到 复合叠加窗口,创建它的子窗口,重新定义它,并重新定义其输入区域,但这些客户端的 后面的具体仲裁规则未由本规范定义;这些政策 应该由客户自己定义。

见C API在这里:https://linux.die.net/man/3/xcompositegetoverlaywindow

+0

这是一个有趣的解决方案,我想与开罗一起使用,问题是,如果我们对这个复合叠加窗口的顶部画东西,图纸将在消失几个毫秒(在Ubuntu中用Unity和Arch与Cinnamon一起尝试)。这意味着,如果我们想要借鉴它,我们必须不断(或几乎不断地,有一些睡眠时间)一次又一次地触发绘制操作,但在这种情况下,不仅会影响性能,而且还会出现一个可见的闪烁/闪烁的绘图...我到目前为止找不到解决方法。 – ScienceSE

+0

这可能是因为另一个合成器正在运行(对于Ubuntu,它是Compiz)。尝试从非合成wm或独立合成器程序开始简单的x会话 –

+0

是的,我怀疑某些东西在这个叠加窗口的顶部,这就是我观察闪烁的原因。在这种情况下,“便携式”解决方案可能是创建复合叠加窗口的子窗口,用透明颜色填充它,然后在其上绘制。 – ScienceSE

相关问题