繁体   English   中英

如何创建一个位于所有其他窗口之上、不受 WM 控制且没有输入的 X 窗口/客户端? (叠加,OSD)

[英]How can I create an X window/client that is on top of all other windows, not under WM control and has no input? (overlay, OSD)

我想编写应用程序(或使用现有的应用程序,这会更方便),其行为类似于硬件屏幕 OSD(屏幕显示),但无需输入。

即: 图形输出(例如来自 Qt 或 Gtk 之类的 GUI 工具包)放置在一个层上,它甚至位于全屏窗口(如 Firefox F11 模式)或全屏模式下的视频播放器之上。 这也包括鼠标光标的“上方”,因此从技术上和图形上讲,鼠标光标将移动到此小部件下方。 虽然我不知道使用 SDL 或 OpenGL 的真正全屏应用程序,但这不是必需的。 如果您也知道这一点,请将其包含在您的答案中。

现实世界的应用程序是只读的叠加层,比如一个小的网络摄像头窗口、一个像徽标或预制注释的电视台。 因此,总而言之,这适用于以最少的后期处理进行现场演示、流式传输和录制截屏视频和教程。

我自己的黑客攻击,不成功的实验表明,至少从 WM 控件中删除这个窗口(我通过选择 GTK 弹出对话框而不是真正的主窗口来做到这一点)可以让你在绝对坐标中定位,它会忽略诸如虚拟桌面和工作区,这很好,因此您可以在这些工作区之间切换,并且叠加层/HUD 将保持原位。

当然,这不能在与硬件屏幕具有相同 Z 值(顶部/底部窗口)的软件中完成。 所以从技术上讲,我说的是在所有其他窗口之上,但在屏幕保护程序或锁屏层之下。

+1 互联网用于链接到文档并提供正确的关键字。

工作代码示例、语言、gui-toolkit 等的 +2 互联网无关紧要。

您可能需要来自 Composite 扩展的复合覆盖窗口 - 请参阅第 3.2 节“复合覆盖窗口”扩展文档。 (光标在此窗口上方)

该协议的 0.3 版添加了复合叠加窗口,它为合成管理器提供了一个可以在其上不受干扰地绘制的表面。 这个窗口总是在普通窗口之上,并且总是在屏幕保护程序窗口之下。 它是一个 InputOutput 窗口,其宽度和高度是屏幕尺寸。 它的视觉对象是根视觉对象,其边框宽度为零。 尝试使用复合扩展重定向它会被忽略。 该窗口不会出现在 QueryTree 请求的回复中。 它也是一个覆盖重定向窗口。 最后两个特性使其对窗口管理器和其他 X11 客户端不可见。 访问此窗口的 XID 的唯一方法是通过 CompositeGetOverlayWindow 请求。 最初,未映射复合叠加窗口。

使用node-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, overlay) {
        // already automatically mapped here:
        //
        // CompositeGetOverlayWindow returns the XID of the Composite Overlay
        // Window. If the window has not yet been mapped, it is mapped by this
        // request. When all clients who have called this request have terminated
        // their X11 connections the window is unmapped.
      });
    });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM