X11/GLX - 全屏模式?

Dig*_*Man 14 c++ linux x11 opengl glx

我想创建一个Linux应用程序-屏幕保护程序,在这种情况下-这被证明是非常难以找到制作窗口全屏简单的任务信息.即使现有屏保的代码也没有提及他们如何管理它,我还没有看到任何明显的功能XRemoveDecoration().

经过多次摸索后,我确实设法创建了一个与桌面大小相同的窗口,其中:

Window win = DefaultRootWindow(disp);
XWindowAttributes getWinAttr;
XGetWindowAttributes(disp, win, &getWinAttr);
win = XCreateWindow(disp, win, 0, 0, getWinAttr.width, getWinAttr.height, 0, vInfo->depth, InputOutput, vInfo->visual, CWBorderPixel|CWColormap|CWEventMask|CWOverrideRedirect, &winAttr );
Run Code Online (Sandbox Code Playgroud)

但这并没有做任何事情来摆脱标题栏和边界.我知道有一种方法,显然 - 但是我还没有找到任何指向那个方向的东西,它不依赖于其他一些大型库被抛到顶部(现有的屏保不会使用).

编辑:请不要删除我的帖子中的信息.有一个很好的理由我明确指出现有的屏保没有使用可选库,这是因为我在过去的大部分时间里一直在分析源代码.

我选择了最直接回答问题的答案,并且适用于一般的应用程序.

如果你发现这个问题研究xscreensavers ......同样仍然适用.是的,xscreensaver有自己的API - 这很复杂,实际上涉及编写更多行代码(是的,认真的).如果您想在屏幕保护程序中使用OpenGL,则需要通过另一个 API(xlockmore,一个竞争系统)和一个将其转换为xscreensaver的兼容层.

但是,xscreensaver能够运行任何可以使用虚拟根窗口(查看vroot.h)作为屏幕保护程序的程序.所以我的建议就是这样做 - 你将拥有更多控制权,没有限制性API,以及更高的可移植性.(我看过的一个例子甚至可以编译为Linux或Windows,使用相同的文件!)

eil*_*ile 13

一种方法是绕过窗口管理器:

XSetWindowAttributes wa;                                                     
wa.override_redirect = True;                                           
XCreateWindow( ..., &wa );
Run Code Online (Sandbox Code Playgroud)

  • 那...实际上有效.试图追踪你的步骤,我仍然发现几乎没有与使用该切换相关的资源,并且X屏幕保护程序似乎都没有...但是通过jove,它确实有效! (4认同)