6

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

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

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

任何帮助,将不胜感激!

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

4

2 回答 2

6

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

编辑:

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

附带说明:我建议您根本不要更改分辨率,但是,如果可以,则渲染到目标大小的帧缓冲区对象,并将最终结果映射到完整的本机屏幕大小。如果将其与原始分辨率文本/HUD 叠加(我假设这是用于游戏或类似游戏)结合使用,您将获得更高的感知质量并节省分辨率切换。您甚至可以将其与截取桌面屏幕截图并逐渐淡入您的内容相结合。

EDIT 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);
}
于 2011-06-17T06:34:05.457 回答
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(),或查看该函数的源代码。

于 2011-06-17T11:54:01.683 回答