nil*_*shi 5 linux user-interface desktop overlay xorg
我想编写像硬件屏幕 OSD(屏幕显示)一样运行的应用程序(或使用现有的应用程序,这会更方便),只是不需要输入。
也就是说:图形输出(例如来自 Qt 或 Gtk 等 GUI 工具包)被放置在甚至位于全屏窗口(如 Firefox F11 模式或全屏模式下的视频播放器)上方的层上。这也包括鼠标光标“上方”,因此从技术上和图形上讲,鼠标光标将移动到该小部件下方。我不知道 SDL 或 OpenGL 的真正全屏应用程序,但这不是要求。如果您也知道这一点,请将其包含在您的答案中。
现实世界的应用程序是只读覆盖层,例如一个小网络摄像头窗口、一个电视台(例如徽标)或预制注释。总而言之,这一切都是为了现场演示、流媒体和录制截屏视频和教程,并进行最少的后期处理。
我自己的黑客攻击,不成功的实验至少表明,从 WM 控件中删除这个窗口(我通过选择 GTK 弹出对话框而不是真正的主窗口来做到这一点)可以让您定位在绝对坐标中,并且它会忽略诸如虚拟桌面和工作区,这很好,因此您可以在这些工作区之间切换,并且覆盖/HUD 将保持在原位。
当然,这不能在与硬件屏幕具有相同 Z 值(顶部/底部窗口)的软件中完成。因此,从技术上讲,我所说的是在所有其他窗口之上,但在屏幕保护程序或锁屏层之下。
+1 互联网,用于链接到文档并提供正确的关键字。
+2 互联网用于工作代码示例、语言、GUI 工具包等并不重要。
您可能需要复合扩展中的复合覆盖窗口 - 请参阅第 3.2 节“复合覆盖窗口”扩展文档。(光标在此窗口上方)
该协议的 0.3 版本添加了“合成覆盖窗口”,它为合成管理器提供了一个可以在不受干扰的情况下进行绘制的表面。该窗口始终位于普通窗口上方,并且始终位于屏幕保护程序窗口下方。它是一个输入输出窗口,其宽度和高度是屏幕尺寸。其视觉对象是根视觉对象,其边框宽度为零。使用复合扩展对其进行重定向的尝试将被忽略。该窗口不会出现在 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.
});
});
});
Run Code Online (Sandbox Code Playgroud)