some cleanup, correctness in naming, correctness in type (those ATOM should be BOOL)
[freeglut] / src / mswin / fg_state_mswin.c
index 27a9461..7c510c5 100644 (file)
@@ -37,7 +37,7 @@ extern GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
  * and the window rect from the client area given the style of the window
  * (or a valid window pointer from which the style can be queried).
  */
-extern void fghGetClientArea( RECT *clientRect, const SFG_Window *window, BOOL wantPosOutside );
+extern void fghGetClientArea( RECT *clientRect, const SFG_Window *window, BOOL posIsOutside );
 extern void fghGetStyleFromWindow( const SFG_Window *window, DWORD *windowStyle, DWORD *windowExStyle );
 extern void fghComputeWindowRectFromClientArea_UseStyle( RECT *clientRect, const DWORD windowStyle, const DWORD windowExStyle, BOOL posIsOutside );
 
@@ -161,17 +161,7 @@ int fgPlatformGlutGet ( GLenum eWhat )
     case GLUT_WINDOW_Y:
     {
         /*
-         *  There is considerable confusion about the "right thing to
-         *  do" concerning window  size and position.  GLUT itself is
-         *  not consistent between Windows and UNIX/X11; since
-         *  platform independence is a virtue for "freeglut", we
-         *  decided to break with GLUT's behaviour.
-         *
-         *  Under UNIX/X11, it is apparently not possible to get the
-         *  window border sizes in order to subtract them off the
-         *  window's initial position until some time after the window
-         *  has been created.  Therefore we decided on the following
-         *  behaviour, both under Windows and under UNIX/X11:
+         *  NB:
          *  - When you create a window with position (x,y) and size
          *    (w,h), the upper left hand corner of the outside of the
          *    window is at (x,y) and the size of the drawable area is
@@ -213,11 +203,20 @@ int fgPlatformGlutGet ( GLenum eWhat )
     break;
 
     case GLUT_WINDOW_WIDTH:
-        freeglut_return_val_if_fail( fgStructure.CurrentWindow != NULL, 0 );
-        return fgStructure.CurrentWindow->State.Width;
     case GLUT_WINDOW_HEIGHT:
+    {
+        RECT winRect;
         freeglut_return_val_if_fail( fgStructure.CurrentWindow != NULL, 0 );
-        return fgStructure.CurrentWindow->State.Height;
+
+        GetClientRect( fgStructure.CurrentWindow->Window.Handle, &winRect);
+
+        switch( eWhat )
+        {
+        case GLUT_WINDOW_WIDTH:      return winRect.right-winRect.left;
+        case GLUT_WINDOW_HEIGHT:     return winRect.bottom-winRect.top;
+        }
+    }
+    break;
 
     case GLUT_WINDOW_BORDER_WIDTH :
     case GLUT_WINDOW_BORDER_HEIGHT :
@@ -236,15 +235,19 @@ int fgPlatformGlutGet ( GLenum eWhat )
 
             /* Get style of window, or default style */
             fghGetStyleFromWindow( fgStructure.CurrentWindow, &windowStyle, &windowExStyle );
-            /* Get client area if any window */
+            /* Get client area if we have a current window, else use dummy rect */
+            /* Also get window rect (including non-client area) */
             if (fgStructure.CurrentWindow && fgStructure.CurrentWindow->Window.Handle)
-                fghGetClientArea(&clientRect,fgStructure.CurrentWindow,FALSE);
+            {
+                fghGetClientArea(&clientRect,fgStructure.CurrentWindow, FALSE);
+                GetWindowRect(fgStructure.CurrentWindow->Window.Handle,&winRect);
+            }
             else
+            {
                 SetRect(&clientRect,0,0,200,200);
-
-            /* Compute window rect (including non-client area) */
-            CopyRect(&winRect,&clientRect);
-            fghComputeWindowRectFromClientArea_UseStyle(&winRect,windowStyle,windowExStyle,FALSE);
+                CopyRect(&winRect,&clientRect);
+                fghComputeWindowRectFromClientArea_UseStyle(&winRect,windowStyle,windowExStyle,FALSE);
+            }
 
             /* Calculate border width by taking width of whole window minus width of client area and divide by two
              * NB: we assume horizontal and vertical borders have the same size, which should always be the case
@@ -253,7 +256,7 @@ int fgPlatformGlutGet ( GLenum eWhat )
              * all other extra pixels are assumed to be atop the window, forming the caption.
              */
             borderWidth   = ((winRect.right-winRect.left)-(clientRect.right-clientRect.left))/2;
-            captionHeight = (winRect.bottom-winRect.top)-(clientRect.bottom-clientRect.top)-borderWidth*2;
+            captionHeight = (winRect.bottom-winRect.top)-(clientRect.bottom-clientRect.top)-borderWidth; /* include top border in caption height */
             
             switch( eWhat )
             {
@@ -324,11 +327,9 @@ int fgPlatformGlutDeviceGet ( GLenum eWhat )
 
     default:
         fgWarning( "glutDeviceGet(): missing enum handle %d", eWhat );
+        return -1;
         break;
     }
-
-    /* And now -- the failure. */
-    return -1;
 }
 
 /*