Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ X11/GLX-全屏模式?_C++_Linux_Opengl_X11_Glx - Fatal编程技术网

C++ X11/GLX-全屏模式?

C++ X11/GLX-全屏模式?,c++,linux,opengl,x11,glx,C++,Linux,Opengl,X11,Glx,我正在尝试创建一个Linux应用程序——在本例中,它是一个屏幕保护程序——事实证明,要找到有关使窗口全屏的简单任务的信息非常困难。即使是现有屏幕保护程序的代码也没有提到它们是如何管理它的,我还没有看到任何明显的功能,如XRemoveDecoration() 在反复摸索之后,我成功地创建了一个与桌面大小相同的窗口,如下所示: Window win = DefaultRootWindow(disp); XWindowAttributes getWinAttr; XGetWindowAttribute

我正在尝试创建一个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 );
但这并不能消除标题栏和边框。很明显,我知道有一种方法,但我还没有找到任何指向这个方向的方法,而不依赖于其他一些大规模的库(现有的屏幕保护程序肯定没有使用)

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

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

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


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

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

XSetWindowAttributes wa;                                                     
wa.override_redirect = True;                                           
XCreateWindow( ..., &wa );

我发现freeglut全屏运行良好,即使在内部托管基于着色器的opengl应用程序时也是如此。这里是调用的内部代码(X11分支…)。嗯


请尝试查看以下示例:

非常灵活的屏幕保护程序端口到GLX


看看driver.c中的createWindow()函数。

这绝对不难。您只需将正确的atom添加到所述的正确列表中。

您缺少的信息是,屏幕保护程序不负责全屏显示。屏幕保护程序守护程序将管理屏幕保护程序窗口,将其放入专用屏幕保护程序窗口层并使其全屏显示


因此,对于编写屏幕保护程序来说,你是清白的。如果要编写全屏游戏,必须设置Override Redirect属性,以防止WM管理窗口,并使其覆盖整个屏幕。

实现这一目标的最佳且更简单的方法是使用ICCCM规范
atom
,该规范适用于最新的窗口管理器。只需使用以下代码:

Atom wm_state   = XInternAtom (display, "_NET_WM_STATE", true );
Atom wm_fullscreen = XInternAtom (display, "_NET_WM_STATE_FULLSCREEN", true );

XChangeProperty(display, window, wm_state, XA_ATOM, 32,
                PropModeReplace, (unsigned char *)&wm_fullscreen, 1);

您的窗口可能是透明的,如果是这样的话,只需在需要的地方使用
XSetBackground()
函数,就可以了。

+1显然已经做了一些研究。请检查,答案是最好的,也是唯一对我有效的答案。您可能需要用它来获取关键事件。那。。。实际上是有效的。试图追踪你的步骤,我仍然发现几乎没有关于使用该切换的资源,而且没有一个X屏幕保护程序有它。。。但是,天哪,它确实有效!将CWOverrideRedirect标志添加到上一个参数的第二个参数后,它就可以工作了,但坏消息是键笔划在此之后不再响应。这个解决方案对我不起作用。这扇窗户和以前一模一样。可以调整它的大小,但iTunes顶部仍然有一个标题栏,与我尝试的似乎没有太大区别(并且缺少最终起作用的覆盖重定向),而且似乎对发生的事情的评论比平时更少。@DigitalMan阅读INSTALL.xscreensaver。也请查看此常见问题解答。就像datenwolf发布的一样,听起来您是在创建自己的全屏应用程序,而不是插入屏幕保护程序deamon。默认的xscreensaver模块似乎就是这样,是的,但OpenGL附加组件似乎普遍都在创建自己的窗口。@DigitalMan:窗口创建!=窗口管理。实际上,xscreensaver守护进程的作用类似于窗口管理器,但只适用于屏幕保护程序窗口。X-Screensaver扩展声明了一种附加的根窗口,它总是位于所有其他窗口的顶部,并且Screensaver守护进程负责将效果程序的窗口移动到那里。
Atom wm_state   = XInternAtom (display, "_NET_WM_STATE", true );
Atom wm_fullscreen = XInternAtom (display, "_NET_WM_STATE_FULLSCREEN", true );

XChangeProperty(display, window, wm_state, XA_ATOM, 32,
                PropModeReplace, (unsigned char *)&wm_fullscreen, 1);