我目前正在尝试从全屏Xlib OpenGL窗口启用alt-tabbing,但是遇到了一些困难。我已经尝试了XUnmapWindow(..)
,哪种方式有效,但分辨率没有重置(除非我应该手动执行此操作?)并且我的Xlib窗口不会显示为最小化窗口(即我无法使用alt-tab回到窗口,即使应用程序似乎仍然在后台运行。)
我尝试的下一件事是将窗口从全屏模式更改为窗口模式(即在窗口模式下重新创建窗口),但显然,我宁愿不必这样做。
我正在收听FocusOut
和FocusIn
个事件,当我使用alt-tab时似乎会调用FocusOut
,但我只是不确定如何获取我的应用最小化。如果在调用FocusOut
事件时我的代码中没有执行任何操作,我的应用程序不会执行任何操作(即我无法最小化窗口)。
任何帮助将不胜感激!
编辑:不幸的是,我无法让X Windows正确地最小化全屏窗口。因此,要解决此问题,我决定destroy()
全屏窗口,然后create()
窗口模式下的新窗口。似乎运作良好。
答案 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(),或者查看该功能的来源。