最小化全屏Xlib OpenGL窗口

Jar*_*ett 6 opengl window-managers fullscreen minimize xlib

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

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

我正在听FocusOutFocusIn事件,FocusOut似乎在我的alt-tab时调用,但我不知道如何让我的应用程序正确地最小化.如果在FocusOut调用事件时我的代码中没有做任何事情,我的应用程序不会做任何事情(即我不能最小化窗口).

任何帮助,将不胜感激!

编辑:不幸的是,我无法让X Windows正确地最小化全屏窗口.因此,为了解决这个问题,我决定destroy()使用全屏窗口,然后create()在窗口模式下使用新窗口.似乎运作良好.

dat*_*olf 5

XUnmapWindow()从显示屏上完全删除窗口.最小化窗口是通过EMWH ICCCM状态发生的,因此窗口管理器知道窗口仍以某种形式存在.就像你已经假设你负责重置屏幕分辨率一样.这在Windows中与BTW完全相同.

编辑:

最小化Xlib中的窗口是完成的XIconifyWindow,它将注意设置正确的ICCCM属性,并取消映射窗口.必须完成这两项工作才能与WM正确交互.但是X11只定义方法,而不是策略,所以当取消映射全屏窗口时,你也有责任重置屏幕分辨率,就像我上面已经写过的那样.

注意:我建议您根本不更改分辨率,而是如果可用,则渲染到目标大小的Framebuffer对象,并将最终结果映射到完整的原生屏幕大小.如果将它与原始分辨率文本/ 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);
}
Run Code Online (Sandbox Code Playgroud)