reworked fullscreen code based on implementation of Chromium. can now handle/restore...
authorDiederick Niehorster <dcnieho@gmail.com>
Tue, 26 Feb 2013 16:49:19 +0000 (16:49 +0000)
committerDiederick Niehorster <dcnieho@gmail.com>
Tue, 26 Feb 2013 16:49:19 +0000 (16:49 +0000)
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
src/mswin/fg_window_mswin.c

index 571db40..21899b8 100644 (file)
@@ -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 */
 };
 
 
index 621a18a..ae30001 100644 (file)
@@ -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
 }