From 9a83e1923241a52132e87f333184433067456097 Mon Sep 17 00:00:00 2001 From: Diederick Niehorster Date: Tue, 26 Feb 2013 16:49:19 +0000 Subject: [PATCH] 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: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1510 7f0cb862-5218-0410-a997-914c9d46530a --- src/mswin/fg_internal_mswin.h | 6 ++++-- src/mswin/fg_window_mswin.c | 30 +++++++++++++++++++++--------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/mswin/fg_internal_mswin.h b/src/mswin/fg_internal_mswin.h index 571db40..21899b8 100644 --- a/src/mswin/fg_internal_mswin.h +++ b/src/mswin/fg_internal_mswin.h @@ -91,8 +91,10 @@ struct tagSFG_PlatformContext typedef struct tagSFG_PlatformWindowState SFG_PlatformWindowState; struct tagSFG_PlatformWindowState { - RECT OldRect; /* window rect - stored before the window is made fullscreen */ - DWORD OldStyle; /* window style - 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 OldStyleEx; /* window Ex style - stored before the window is made fullscreen */ + BOOL OldMaximized; /* window maximized state - stored before the window is made fullscreen */ }; diff --git a/src/mswin/fg_window_mswin.c b/src/mswin/fg_window_mswin.c index 621a18a..ae30001 100644 --- a/src/mswin/fg_window_mswin.c +++ b/src/mswin/fg_window_mswin.c @@ -980,7 +980,6 @@ void fgPlatformGlutFullScreen( SFG_Window *win ) { #if(WINVER >= 0x0500) /* Windows 2000 or later */ - DWORD s; RECT rect; HMONITOR hMonitor; MONITORINFO mi; @@ -992,16 +991,25 @@ void fgPlatformGlutFullScreen( SFG_Window *win ) */ - /* store current window rect */ - GetWindowRect( win->Window.Handle, &win->State.pWState.OldRect ); + /* 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); - /* store current window style */ - win->State.pWState.OldStyle = s = GetWindowLong(win->Window.Handle, GWL_STYLE); + 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); - /* remove decorations from style and add popup style*/ - s &= ~WS_OVERLAPPEDWINDOW; - s |= WS_POPUP; - SetWindowLong(win->Window.Handle, GWL_STYLE, s); + /* remove decorations from style */ + SetWindowLong(win->Window.Handle, GWL_STYLE, + win->State.pWState.OldStyle & ~(WS_CAPTION | WS_THICKFRAME)); + SetWindowLong(win->Window.Handle, GWL_EXSTYLE, + win->State.pWState.OldStyleEx & ~(WS_EX_DLGMODALFRAME | + WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE)); /* For fullscreen mode, find the monitor that is covered the most * 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 */ SetWindowLong(win->Window.Handle, GWL_STYLE, win->State.pWState.OldStyle); + SetWindowLong(win->Window.Handle, GWL_EXSTYLE, win->State.pWState.OldStyleEx); /* Then resize */ SetWindowPos(win->Window.Handle, @@ -1075,6 +1084,9 @@ void fgPlatformGlutLeaveFullScreen( SFG_Window *win ) SWP_NOZORDER ); + if (win->State.pWState.OldMaximized) + SendMessage(win->Window.Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0); + win->State.IsFullscreen = GL_FALSE; #endif } -- 1.7.10.4