simplified some window rect calculations
[freeglut] / src / mswin / fg_window_mswin.c
index 621a18a..6a86848 100644 (file)
@@ -457,45 +457,22 @@ void fghComputeWindowRectFromClientArea_QueryWindow( RECT *clientRect, const SFG
 
 /* Gets the rect describing the client area (drawable area) of the
  * specified window. Output is position of corners of client area (drawable area) on the screen.
- * Returns an empty rect if window pointer or window handle is NULL.
- * If wantPosOutside is set to true, the output client Rect
- * will follow freeGLUT's window specification convention in which the
- * top-left corner is at the outside of the window, while the size
- * (rect.right-rect.left,rect.bottom-rect.top) is the size of the drawable
- * area.
+ * Does not touch clientRect if window pointer or window handle is NULL.
+ * (rect.right-rect.left,rect.bottom-rect.top) is the size of the drawable area.
  */
-void fghGetClientArea( RECT *clientRect, const SFG_Window *window, BOOL wantPosOutside )
+void fghGetClientArea( RECT *clientRect, const SFG_Window *window )
 {
     POINT topLeftClient = {0,0};
     POINT topLeftWindow = {0,0};
 
     freeglut_return_if_fail((window && window->Window.Handle));
     
-    /*
-     * call GetWindowRect()
-     * (this returns the pixel coordinates of the outside of the window)
-     * cannot use GetClientRect as it returns a rect relative to
-     * the top-left point of the client area (.top and .left are thus always 0)
-     * and is thus only useful for querying the size of the client area, not
-     * its position.
-     */
-    GetWindowRect( window->Window.Handle, clientRect );
-    topLeftWindow.x = clientRect->top;
-    topLeftWindow.y = clientRect->left;
-    
     /* Get size of client rect */
     GetClientRect(window->Window.Handle, clientRect);
     /* Get position of top-left of client area on the screen */
     ClientToScreen(window->Window.Handle,&topLeftClient);
     /* Add top-left offset */
     OffsetRect(clientRect,topLeftClient.x,topLeftClient.y);
-
-    /* replace top and left with top and left of window, if wanted */
-    if (wantPosOutside)
-    {
-        clientRect->left = topLeftWindow.x;
-        clientRect->top  = topLeftWindow.y;
-    }
 }
 
 #if(WINVER >= 0x500)
@@ -751,7 +728,7 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
     ShowWindow( window->Window.Handle, SW_SHOW );
 #else
     ShowWindow( window->Window.Handle,
-                fgState.ForceIconic ? SW_SHOWMINIMIZED : SW_SHOW );
+                fgState.ForceIconic ? SW_SHOWMINIMIZED : SW_SHOWNORMAL );
 #endif /* defined(_WIN32_WCE) */
 
     UpdateWindow( window->Window.Handle );
@@ -807,7 +784,7 @@ void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height )
          * for them.
          */
         RECT parentRect;
-        fghGetClientArea( &parentRect, window->Parent, FALSE );
+        fghGetClientArea( &parentRect, window->Parent );
         OffsetRect(&windowRect,-parentRect.left,-parentRect.top);
     }
     
@@ -980,7 +957,6 @@ void fgPlatformGlutFullScreen( SFG_Window *win )
 
     {
 #if(WINVER >= 0x0500) /* Windows 2000 or later */
-        DWORD s;
         RECT rect;
         HMONITOR hMonitor;
         MONITORINFO mi;
@@ -992,16 +968,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 +1048,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 +1061,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
 }