具体来说,我想在显示器上显示文本和图像,在所有其他窗口的顶部,但不能点击或以任何可能的方式与之交互 - 点击它应该直接进入下面的任何窗口。
到目前为止,我的研究使我尝试阅读有关复合覆盖窗口的 X 文档,但不幸的是,我无法使用它。我发现唯一有帮助的资源是一个小型 nodejs 库(node-x11),不幸的是,它似乎已被遗弃,但仍然不完整,我无法开始工作。显然还有一个 python 库,但它似乎比 nodejs 上的更不完整。
具体来说,我想在显示器上显示文本和图像,在所有其他窗口的顶部,但不能点击或以任何可能的方式与之交互 - 点击它应该直接进入下面的任何窗口。
到目前为止,我的研究使我尝试阅读有关复合覆盖窗口的 X 文档,但不幸的是,我无法使用它。我发现唯一有帮助的资源是一个小型 nodejs 库(node-x11),不幸的是,它似乎已被遗弃,但仍然不完整,我无法开始工作。显然还有一个 python 库,但它似乎比 nodejs 上的更不完整。
node-x11作者在这里(它并没有被放弃,我只是添加我需要或用户请求的功能,所以如果你遗漏了什么,请填写问题!)
您可以使用GetOverlayWindow
复合扩展:
该协议的 0.3 版添加了 Composite Overlay Window,它为合成管理器提供了一个可以在不受干扰的情况下在其上绘制的表面。此窗口始终位于普通窗口之上,并且始终位于屏幕保护程序窗口之下。它是一个 InputOutput 窗口,其宽度和高度是屏幕尺寸。它的视觉是根视觉,其边框宽度为零。尝试使用复合扩展对其进行重定向将被忽略。此窗口不会出现在 QueryTree 请求的回复中。它也是一个覆盖重定向窗口。最后两个特性使它对窗口管理器和其他 X11 客户端不可见。访问此窗口的 XID 的唯一方法是通过 CompositeGetOverlayWindow 请求。最初,复合叠加窗口未映射。
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.
});
});
});