我正在尝试创建一个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 );但这对摆脱标题栏和边框没有任何帮助。我知道有一种方法,很明显,但我还没有找到任何指向这个方向的东西,而不是依赖于其他大型库被抛到顶部(现有的屏幕保护程序绝对不使用)。
编辑:请不要从我的帖子中删除信息。我明确指出,现有的屏幕保护程序没有使用可选库,这是很好的原因,因为我在过去一天的大部分时间里一直在分析源代码。
我选择了最直接回答这个问题的答案,并且适用于一般的申请。
如果你发现这个问题在研究屏幕保护程序..。同样的情况仍然适用。是的,xscreensaver有自己的API --这很复杂,实际上需要编写更多的代码(是的,认真地说)。如果您想在屏幕保护程序中使用OpenGL,则需要通过另一个API (xlockmore,竞争系统)和一个兼容层将其转换为xscreensaver。
但是,screensaver能够运行任何可以使用虚拟根窗口(查看vroot.h)作为屏幕保护程序的程序。因此,我的建议是这样做-您将有更多的控制,没有限制的API,更好的可移植性。(我看过的一个示例甚至可以用相同的文件为Linux或Windows编译!)
发布于 2012-01-30 14:51:28
一种方法是绕过窗口管理器:
XSetWindowAttributes wa;
wa.override_redirect = True;
XCreateWindow( ..., &wa );发布于 2012-01-30 17:58:10
你缺少的信息是,屏幕保护程序不负责整个屏幕。屏幕保护程序守护进程将管理屏幕保护程序窗口,将其放入专门的屏幕保护窗口层并使其成为全屏。
所以写屏幕保护程序你是清白的。如果您要编写一个全屏游戏,您必须设置重写重定向属性,以防止窗口被WM管理,并使其覆盖整个屏幕。
发布于 2015-02-08 17:06:59
实现这一目标的最佳和更容易的方法是使用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()函数就可以了。
https://stackoverflow.com/questions/9065669
复制相似问题