Jar*_*ett 6 opengl window-managers fullscreen minimize xlib
我目前正在尝试从我的全屏Xlib OpenGL窗口启用alt-tabbing,但是遇到了一些困难.我试过XUnmapWindow(..),哪种方法有效,但分辨率没有重置(除非我应该手动执行此操作?)并且我的Xlib窗口不会显示为最小化窗口(即我无法将alt-tab返回窗口,即使应用程序似乎仍然在后台运行).
我尝试的下一件事是将窗口从全屏模式更改为窗口模式(即在窗口模式下重新创建窗口),但显然,我宁愿不必这样做.
我正在听FocusOut和FocusIn事件,FocusOut似乎在我的alt-tab时调用,但我不知道如何让我的应用程序正确地最小化.如果在FocusOut调用事件时我的代码中没有做任何事情,我的应用程序不会做任何事情(即我不能最小化窗口).
任何帮助,将不胜感激!
编辑:不幸的是,我无法让X Windows正确地最小化全屏窗口.因此,为了解决这个问题,我决定destroy()使用全屏窗口,然后create()在窗口模式下使用新窗口.似乎运作良好.
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)
| 归档时间: |
|
| 查看次数: |
2949 次 |
| 最近记录: |