apl*_*vin 5 python unix drawing xlib xorg
我想在屏幕上的所有窗口上绘制一些基元.我在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)
Run Code Online (Sandbox Code Playgroud)
但屏幕上没有任何内容(但是,根窗口已分配:在工作后抓取键盘).怎么做到这一点?
您可以在根窗口上绘图 - 您的代码可能有效,但根窗口可能被某种桌面窗口(nautilus、kde 桌面等)遮挡。尝试在不运行任何程序的情况下启动 X 会话,您将看到更新(您可以使用 Xephyr 或 Xnest)
另一种方法是创建透明 window,使其最顶层并在其表面上绘制。您需要手动将鼠标事件传播到底层窗口。
要在所有窗口上实际绘制,您需要创建简单的复合管理器,或者如果已经有 CM 运行,请使用它的覆盖窗口。
从复合协议规范:
该协议的 0.3 版添加了复合叠加窗口,它为合成管理器提供了一个可以在其上不受干扰地绘制的表面。这个窗口总是在普通窗口之上,并且总是在屏幕保护程序窗口之下。它是一个 InputOutput 窗口,其宽度和高度是屏幕尺寸。它的视觉对象是根视觉对象,其边框宽度为零。尝试使用复合扩展重定向它会被忽略。该窗口不会出现在 QueryTree 请求的回复中。它也是一个覆盖重定向窗口。最后两个特性使其对窗口管理器和其他 X11 客户端不可见。访问此窗口的 XID 的唯一方法是通过 CompositeGetOverlayWindow 请求。最初,未映射复合叠加窗口。
CompositeGetOverlayWindow 返回复合叠加窗口的 XID。如果窗口还没有被映射,它被这个请求映射。当调用此请求的所有客户端都终止了它们的 X11 连接时,窗口将取消映射。
复合管理器可以直接渲染到复合覆盖窗口,或者他们可以将其他窗口重新设置为该窗口的子窗口并渲染到这些窗口。多个客户端可以渲染到复合叠加窗口,创建它的子窗口,重塑它,并重新定义它的输入区域,但这些客户端遵循的具体仲裁规则在本规范中没有定义;这些政策应由客户自己定义。