使用 xlib 在屏幕顶部绘图

2024-06-19

我想在屏幕上的所有窗口顶部绘制一些图元。我在 C 中找到了一些代码并尝试将其移植以使用 python 的 xlib:

from Xlib.display import Display
from Xlib import X
from Xlib import protocol

display = Display(':0')
root = display.screen().root
gc = root.create_gc()
root.fill_rectangle(gc, 100, 100, 500, 500)

但屏幕上没有任何显示(但是,根窗口已分配:工作后抓取键盘)。如何正确地做到这一点?


您可以在根窗口上绘图 - 您的代码可能可以工作,但根窗口可能会被某种桌面窗口(nautilus、kde 桌面等)遮挡。尝试在不运行任何程序的情况下启动 X 会话,您将看到更新(您可以使用 Xephyr 或 Xnest 来实现此目的)

另一种方法是创建透明窗 https://stackoverflow.com/questions/3645632/how-to-create-a-window-with-a-bit-depth-of-32,将其置于最上面并在其表面上进行绘制。您需要手动将鼠标事件传播到底层窗口。

要实际在所有窗口顶部绘制,您需要创建简单的综合经理 http://www.talisman.org/~erlkonig/misc/x11-composite-tutorial/或者如果已经有 CM 正在运行,请使用它的覆盖窗口。

From 复合协议规范 http://www.x.org/releases/X11R7.7/doc/compositeproto/compositeproto.txt:

该协议的 0.3 版本添加了复合覆盖窗口,该窗口 为合成管理人员提供了一个可以在其上进行绘制的表面,而无需 干涉。该窗口始终位于普通窗口之上并且始终 在屏幕保护程序窗口下方。它是一个输入输出窗口,其宽度 和高度是屏幕尺寸。它的视觉是根视觉 并且其边框宽度为零。尝试使用重定向它 复合扩展被忽略。该窗口不会出现在 QueryTree 请求的回复。这也是一个覆盖重定向 窗户。最后两个功能使其对窗口管理器不可见 和其他 X11 客户端。访问该窗口的XID的唯一方法 通过 CompositeGetOverlayWindow 请求。最初,复合 覆盖窗口未映射。

CompositeGetOverlayWindow 返回复合叠加层的 XID 窗户。如果窗口尚未映射,则通过此映射 要求。当所有调用此请求的客户端都已终止时 他们的 X11 连接窗口未映射。

复合管理器可以直接渲染到复合叠加 窗口,或者它们可能会将其他窗口重新设置为该窗口的子窗口 窗口并渲染到这些。多个客户端可以渲染到 复合覆盖窗口,创建它的子窗口,重塑它的形状,然后 重新定义其输入区域,但具体仲裁规则遵循 本规范未定义这些客户端;这些政策 应由客户自己定义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 xlib 在屏幕顶部绘图 的相关文章

随机推荐