我想在屏幕上的所有窗口上绘制一些基元。我在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)
但屏幕上没有任何内容(但是,根窗口已分配:在工作后抓取键盘)。如何正确地做到这一点?
答案 0 :(得分:3)
您可以在根窗口上绘图 - 您的代码可能有效,但根窗口可能会被某种桌面窗口(nautilus,kde桌面等)遮挡。尝试在没有任何程序运行的情况下启动X会话,你会看到更新(你可以使用Xephyr或Xnest)
另一种方法是创建transparent window,使其最顶层并在其表面上绘制。您需要手动将鼠标事件传播到基础窗口。
要实际绘制所有窗口的顶部,您需要创建简单的composite manager,或者如果已经运行CM,请使用它的叠加窗口。
协议版本0.3添加了复合叠加窗口,其中 为合成管理者提供一个无需绘制的表面 干扰。此窗口始终高于正常窗口 屏幕保护程序窗口下方。它是一个InputOutput窗口,其宽度 和高度是屏幕尺寸。它的视觉是根视觉 它的边界宽度为零。试图使用。重定向它 复合扩展被忽略。此窗口不会出现在 QueryTree请求的回复。它也是一个覆盖重定向 窗口。最后两个功能使窗口管理器不可见 和其他X11客户端。访问此窗口的XID的唯一方法 是通过CompositeGetOverlayWindow请求。最初,复合材料 覆盖窗口未映射。
CompositeGetOverlayWindow返回Composite Overlay的XID 窗口。如果窗口尚未映射,则由此映射 请求。调用此请求的所有客户端都已终止 他们的X11连接窗口未映射。
复合管理器可以直接渲染到复合叠加层 窗户,或者他们可能重新将其他窗户重新成为这个孩子 窗口并渲染到这些。多个客户端可能会呈现给 复合叠加窗口,创建它的子窗口,重塑它,和 重新定义其输入区域,但遵循特定的仲裁规则 本规范未定义这些客户端;这些政策 应该由客户自己定义。