具体来说,我想在显示器上显示文本和图像,在所有其他窗口之上,但不可单击或以任何方式与之交互 - 单击它应该直接进入下面的任何窗口。
到目前为止,我的研究促使我尝试阅读有关复合覆盖窗口的 X 文档,但不幸的是,我无法使用它。我发现唯一有帮助的资源是一个小型nodejs库(node-x11),不幸的是,它似乎已被放弃,但仍然不完整,我无法开始工作。显然还有一个python库,但它似乎比nodejs更不完整。
node-x11 作者在这里(它并没有被放弃,我只是添加我需要的功能或用户请求的功能,所以如果你错过了什么,请填写一个问题!
可以使用复合扩展中的GetOverlayWindow
:
该协议的 0.3 版添加了复合覆盖窗口,该窗口 为合成管理器提供了一个无需绘制的表面 干扰。此窗口始终高于普通窗口,并且始终 屏幕保护程序窗口下方。它是一个输入输出窗口,其宽度 和高度是屏幕尺寸。它的视觉对象是根视觉对象 并且其边框宽度为零。 尝试使用 复合扩展将被忽略。 此窗口不会出现在 回复查询树请求。它也是一个覆盖重定向窗口。 最后两个功能使其对窗口管理器和其他 X11 不可见 客户。访问此窗口的 XID 的唯一方法是通过 CompositeGetOverlayWindow 请求。最初,复合叠加 窗口未映射。
复合获取覆盖窗口返回复合覆盖的 XID 窗。如果窗口尚未映射,则由 请求。当调用此请求的所有客户端都已终止时 他们的 X11 连接窗口未映射。
复合管理器可以直接渲染到复合叠加 窗口,或者他们可以将其他窗口重新设置为此窗口的子窗口 窗口并呈现到这些。多个客户端可能会呈现到 复合叠加窗口,创建它的子窗口,重塑它的形状,以及 重新定义其输入区域,但遵循特定的仲裁规则 由这些客户端不由此规范定义;这些政策 应由客户自己定义。
节点 x11 示例:
var x11 = require('x11');
x11.createClient(function(err, display) {
var X = display.client;
var root = display.screen[0].root;
X.require('composite', function(err, Composite) {
Composite.GetOverlayWindow(root, function(err, overlayId) {
// now you can draw on overlayId window here.
});
});
});