reworked fullscreen code based on implementation of Chromium. can now handle/restore windows in maximized state and no longer uses WS_POPUP.

git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1510 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
dcnieho 2013-02-26 16:49:19 +00:00
parent 5fa61c0c64
commit ddda931bac
2 changed files with 25 additions and 11 deletions

View File

@ -93,6 +93,8 @@ struct tagSFG_PlatformWindowState
{ {
RECT OldRect; /* window rect - stored before the window is made fullscreen */ RECT OldRect; /* window rect - stored before the window is made fullscreen */
DWORD OldStyle; /* window style - stored before the window is made fullscreen */ DWORD OldStyle; /* window style - stored before the window is made fullscreen */
DWORD OldStyleEx; /* window Ex style - stored before the window is made fullscreen */
BOOL OldMaximized; /* window maximized state - stored before the window is made fullscreen */
}; };

View File

@ -980,7 +980,6 @@ void fgPlatformGlutFullScreen( SFG_Window *win )
{ {
#if(WINVER >= 0x0500) /* Windows 2000 or later */ #if(WINVER >= 0x0500) /* Windows 2000 or later */
DWORD s;
RECT rect; RECT rect;
HMONITOR hMonitor; HMONITOR hMonitor;
MONITORINFO mi; MONITORINFO mi;
@ -992,16 +991,25 @@ void fgPlatformGlutFullScreen( SFG_Window *win )
*/ */
/* store current window rect */ /* save current window rect, style, exstyle and maximized state */
win->State.pWState.OldMaximized = !!IsZoomed(win->Window.Handle);
if (win->State.pWState.OldMaximized)
/* We force the window into restored mode before going
* fullscreen because Windows doesn't seem to hide the
* taskbar if the window is in the maximized state.
*/
SendMessage(win->Window.Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
GetWindowRect( win->Window.Handle, &win->State.pWState.OldRect ); GetWindowRect( win->Window.Handle, &win->State.pWState.OldRect );
win->State.pWState.OldStyle = GetWindowLong(win->Window.Handle, GWL_STYLE);
win->State.pWState.OldStyleEx = GetWindowLong(win->Window.Handle, GWL_EXSTYLE);
/* store current window style */ /* remove decorations from style */
win->State.pWState.OldStyle = s = GetWindowLong(win->Window.Handle, GWL_STYLE); SetWindowLong(win->Window.Handle, GWL_STYLE,
win->State.pWState.OldStyle & ~(WS_CAPTION | WS_THICKFRAME));
/* remove decorations from style and add popup style*/ SetWindowLong(win->Window.Handle, GWL_EXSTYLE,
s &= ~WS_OVERLAPPEDWINDOW; win->State.pWState.OldStyleEx & ~(WS_EX_DLGMODALFRAME |
s |= WS_POPUP; WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE));
SetWindowLong(win->Window.Handle, GWL_STYLE, s);
/* For fullscreen mode, find the monitor that is covered the most /* For fullscreen mode, find the monitor that is covered the most
* by the window and get its rect as the resize target. * by the window and get its rect as the resize target.
@ -1063,6 +1071,7 @@ void fgPlatformGlutLeaveFullScreen( SFG_Window *win )
/* restore style of window before making it fullscreen */ /* restore style of window before making it fullscreen */
SetWindowLong(win->Window.Handle, GWL_STYLE, win->State.pWState.OldStyle); SetWindowLong(win->Window.Handle, GWL_STYLE, win->State.pWState.OldStyle);
SetWindowLong(win->Window.Handle, GWL_EXSTYLE, win->State.pWState.OldStyleEx);
/* Then resize */ /* Then resize */
SetWindowPos(win->Window.Handle, SetWindowPos(win->Window.Handle,
@ -1075,6 +1084,9 @@ void fgPlatformGlutLeaveFullScreen( SFG_Window *win )
SWP_NOZORDER SWP_NOZORDER
); );
if (win->State.pWState.OldMaximized)
SendMessage(win->Window.Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
win->State.IsFullscreen = GL_FALSE; win->State.IsFullscreen = GL_FALSE;
#endif #endif
} }