我目前正在尝试在全屏 Xlib OpenGL 窗口中启用 alt-tab 功能,但遇到了一些困难。我试过XUnmapWindow(..)
,哪种有效,但分辨率不会重置(除非我应该手动执行此操作?)并且我的 Xlib 窗口不会显示为最小化窗口(即我无法通过 alt-tab 返回窗口,即使应用程序似乎仍然在后台运行)。
我尝试的下一件事是将窗口从全屏更改为窗口模式(即在窗口模式下重新创建窗口),但显然,我不想这样做。
我正在听FocusOut
和FocusIn
事件,以及 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/