我目前正在编写一个窗口管理器,我想知道是否可以创建一个覆盖在所有其他窗口之上但根本不获取输入焦点的窗口。换句话说,理想情况下,我希望能够在不接受任何输入的情况下在此窗口上绘图。
一种方法是让窗口管理器调用 XQueryTree,然后将输入(鼠标单击、键盘输入等)传递到相应的窗口。但是,我想知道是否有一种方法可以完全阻止此覆盖窗口获得输入事件。
此外,我不希望直接在根窗口上绘制,因为那样会破坏合成管理器。
最佳答案
复合扩展提供了你想要的:
https://www.x.org/releases/X11R7.7/doc/compositeproto/compositeproto.txt
3.2 复合叠加窗口
协议(protocol)的 0.3 版本添加了复合叠加窗口,它 为合成经理提供了一个可以在上面绘制的表面 干涉。这个窗口总是在普通窗口之上,并且总是 在屏幕保护程序窗口下方。它是一个 InputOutput 窗口,其宽度 和高度是屏幕尺寸。它的视觉是根视觉 其边框宽度为零。尝试使用重定向它 复合扩展被忽略。该窗口不会出现在 QueryTree 请求的回复。它也是一个覆盖重定向窗口。 最后两个特性使它对窗口管理器和其他 X11 不可见 客户。访问此窗口的 XID 的唯一方法是通过 CompositeGetOverlayWindow 请求。最初,复合叠加 窗口未映射。
CompositeGetOverlayWindow 返回 Composite Overlay 的 XID window 。如果窗口还没有被映射,它被这个映射 要求。当调用此请求的所有客户端都终止时 他们的 X11 连接窗口未映射。
复合管理器可以直接渲染到复合叠加层 窗口,或者它们可能会重新设置其他窗口的父级成为此窗口的子级 窗口并渲染到这些。多个客户端可能呈现给 Composite Overlay Window,创建它的子窗口, reshape 它,然后 重新定义其输入区域,但遵循特定的仲裁规则 这些客户没有被本规范定义;这些政策 应该由客户自己定义。
在这里查看 C api:https://linux.die.net/man/3/xcompositegetoverlaywindow
关于使用不接受任何输入事件或获取焦点的 xlib 创建透明窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42426590/