最小化全屏Xlib OpenGL窗口

时间:2011-06-17 03:42:05

标签: opengl fullscreen xlib minimize window-managers

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

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

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

任何帮助将不胜感激!

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

2 个答案:

答案 0 :(得分:5)

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

编辑:

最小化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);
}

答案 1 :(得分:1)

您可以尝试这样做:

XEvent xev;
Atom wm_state     =  XInternAtom(dpy, "_NET_WM_STATE", False);
Atom wm_hide_win  =  XInternAtom(dpy, "_NET_WM_STATE_HIDDEN", False);

memset(&xev, 0, sizeof(xev));
xev.type = ClientMessage;
xev.xclient.window = win;
xev.xclient.message_type = wm_state;
xev.xclient.format = 32;
xev.xclient.data.l[0] = _NET_WM_STATE_ADD;
xev.xclient.data.l[1] = wm_hide_win;

XSendEvent(dpy, DefaultRootWindow(dpy), False, SubstructureNotifyMask, &xev);

修改

如果您有权访问gnome API,可以使用wnck_window_minimize(),或者查看该功能的来源。