opengl - 最小化全屏 Xlib OpenGL 窗口

标签 opengl fullscreen xlib minimize window-managers

我目前正在尝试在全屏 Xlib OpenGL 窗口中启用 alt-tab 功能,但遇到了一些困难。我试过XUnmapWindow(..) ,哪种有效,但分辨率不会重置(除非我应该手动执行此操作?)并且我的 Xlib 窗口不会显示为最小化窗口(即我无法通过 alt-tab 返回窗口,即使应用程序似乎仍然在后台运行)。

我尝试的下一件事是将窗口从全屏更改为窗口模式(即在窗口模式下重新创建窗口),但显然,我不想这样做。

我正在听FocusOutFocusIn事件,以及 FocusOut似乎在我使用 alt-tab 时被调用,但我只是不确定如何让我的应用程序正确最小化。如果当 FocusOut 时我不在代码中执行任何操作事件被调用,我的应用程序不执行任何操作(即我无法最小化窗口)。

如有任何帮助,我们将不胜感激!

编辑:不幸的是,我无法让 X Windows 正确最小化全屏窗口。因此,为了解决这个问题,我决定 destroy()全屏窗口,然后 create()窗口模式下的新窗口。看起来效果不错。

最佳答案

XUnmapWindow() 从显示中完全删除窗口。最小化窗口是通过 EMWH ICCCM 状态进行的,以便窗口管理器知道该窗口仍然以某种形式存在。 就像您已经假设您负责重置屏幕分辨率一样。顺便说一句,这在 Windows 中是一样的。

编辑:

最小化 Xlib 中的窗口是使用 XIconifyWindow 完成的,它将注意设置正确的 ICCCM 属性,并取消映射窗口。两者都必须完成才能与 WM 正确交互。然而,X11 仅定义方法,而不定义策略,因此当取消映射全屏窗口时,您还负责重置屏幕分辨率,就像我上面已经写的那样。

旁注:我建议您根本不要更改分辨率,而是,如果可用,则渲染到目标尺寸的帧缓冲区对象,并将最终结果映射到完整的 native 屏幕尺寸。如果您将其与原始分辨率文本/HUD 覆盖相结合(我假设这是用于游戏或类似的),您将获得更高的感知质量并节省分辨率切换。您甚至可以将其与桌面屏幕截图结合起来,并逐渐淡出您的内容。

编辑 2 以供引用 : XIconifyWindow 只是一个辅助/便利函数,它的源代码是

/*
 * This function instructs the window manager to change this window from
 * NormalState to IconicState.
 */
Status XIconifyWindow(Display *dpy, Window w, int screen)
{
    XClientMessageEvent ev;
    Atom prop;

    prop = XInternAtom(dpy, "WM_CHANGE_STATE", False);
    if(prop == None)
    return False;

    ev.type = ClientMessage;
    ev.window = w;
    ev.message_type = prop;
    ev.format = 32;
    ev.data.l[0] = IconicState;
    return XSendEvent(dpy, RootWindow(dpy, screen), False,
            SubstructureRedirectMask|SubstructureNotifyMask,
            (XEvent *)&ev);
}

关于opengl - 最小化全屏 Xlib OpenGL 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6381098/

相关文章:

c - 使用 openMP 进行 OpenGL 3D 渲染

canvas - 如何在Dart中设置和取消全屏 Canvas

c++ - 我的 Xlib 包装器类 (C++) 中的段错误

c++ - opengl 着色器程序中的重复顶点

c++ - 在 OpenGl 中加载多个对象

java - JFrame 大小、调整大小、全屏

iOS 7(子层)AVPlayer 全屏动画,需要在上面(覆盖)UINavigationBar

c - 通过开罗表面绘画时清除 X 窗口的正确方法是什么

x11 - Atom 为 64 位的系统上的 atom 属性的 XChangeProperty

c++ - 我用于渲染随机多边形的代码无法正常工作