使用xlib在屏幕顶部绘制

时间:2013-01-07 16:59:08

标签: 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)

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

1 个答案:

答案 0 :(得分:3)

您可以在根窗口上绘图 - 您的代码可能有效,但根窗口可能会被某种桌面窗口(nautilus,kde桌面等)遮挡。尝试在没有任何程序运行的情况下启动X会话,你会看到更新(你可以使用Xephyr或Xnes​​t)

另一种方法是创建transparent window,使其最顶层并在其表面上绘制。您需要手动将鼠标事件传播到基础窗口。

要实际绘制所有窗口的顶部,您需要创建简单的composite manager,或者如果已经运行CM,请使用它的叠加窗口。

来自composite protocol spec

  

协议版本0.3添加了复合叠加窗口,其中   为合成管理者提供一个无需绘制的表面   干扰。此窗口始终高于正常窗口   屏幕保护程序窗口下方。它是一个InputOutput窗口,其宽度   和高度是屏幕尺寸。它的视觉是根视觉   它的边界宽度为零。试图使用。重定向它   复合扩展被忽略。此窗口不会出现在   QueryTree请求的回复。它也是一个覆盖重定向   窗口。最后两个功能使窗口管理器不可见   和其他X11客户端。访问此窗口的XID的唯一方法   是通过CompositeGetOverlayWindow请求。最初,复合材料   覆盖窗口未映射。

     

CompositeGetOverlayWindow返回Composite Overlay的XID   窗口。如果窗口尚未映射,则由此映射   请求。调用此请求的所有客户端都已终止   他们的X11连接窗口未映射。

     

复合管理器可以直接渲染到复合叠加层   窗户,或者他们可能重新将其他窗户重新成为这个孩子   窗口并渲染到这些。多个客户端可能会呈现给   复合叠加窗口,创建它的子窗口,重塑它,和   重新定义其输入区域,但遵循特定的仲裁规则   本规范未定义这些客户端;这些政策   应该由客户自己定义。