Finished off most of the issues with freeglut_structure.c, from a stylistic
[freeglut] / src / freeglut_window.c
index 0f394e5..bf9d58f 100644 (file)
@@ -306,6 +306,8 @@ GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly, unsigned
 void fgSetWindow ( SFG_Window *window )
 {
 #if TARGET_HOST_UNIX_X11
+  if ( window )
+  {
     /*
         * Make the selected window's GLX context the current one
      */
@@ -314,7 +316,7 @@ void fgSetWindow ( SFG_Window *window )
         window->Window.Handle,
         window->Window.Context
     );
-
+  }
 #elif TARGET_HOST_WIN32
        /*
         * Release the previous' context's device context
@@ -395,6 +397,10 @@ void fgOpenWindow( SFG_Window* window, const char* title, int x, int y, int w, i
          */
         fgState.DisplayMode |= GLUT_DOUBLE ;
         window->Window.VisualInfo = fgChooseVisual();
+       /* OK, we got a double-buffered window, but we only wanted
+        * single-buffered.  Clear the double-buffer flag now.
+        */
+       fgState.DisplayMode &= ~GLUT_DOUBLE ;
       }
 
       /*
@@ -433,6 +439,15 @@ void fgOpenWindow( SFG_Window* window, const char* title, int x, int y, int w, i
     mask = CWBackPixmap | CWBorderPixel | CWColormap | CWEventMask;
 
     /*
+     * If this is a menu window we want the window manager to ignore it.
+     */
+    if ( fgState.BuildingAMenu )
+    {
+        winAttr.override_redirect = True;
+       mask |= CWOverrideRedirect;
+    }
+
+    /*
      * Have the window created now
      */
     window->Window.Handle = XCreateWindow(
@@ -556,46 +571,6 @@ void fgOpenWindow( SFG_Window* window, const char* title, int x, int y, int w, i
      */
     XMapWindow( fgDisplay.Display, window->Window.Handle );
 
-    /*
-     * If we're a menu, then we need to ask the WM to remove decorations.
-     * This is stolen shamelessly from Brian Paul
-     * (19 Sep 1995   brianp@ssec.wisc.edu)
-     */
-    if ( window->IsMenu ) {
-      set_mwm_border(fgDisplay.Display, window->Window.Handle, 0);
-    }
-
-    /*
-     * In game mode, move the viewport a bit to hide the decorations.
-     * This code depends on the XFree86 video mode extensions.
-     */
-    if( gameMode == TRUE )
-    {
-        /*
-         * This somehow fixes the glutGet() GLUT_WINDOW_X and GLUT_WINDOW_Y problem...
-         */
-        XMoveWindow( fgDisplay.Display, window->Window.Handle, x, y );
-
-#       ifdef X_XF86VidModeSetViewPort
-
-        /*
-         * Set the newly created window as the current one...
-         */
-        fgSetWindow( window );
-
-        /*
-         * Move the viewport a bit down and right from top-left corner to hide the decorations
-         */
-        XF86VidModeSetViewPort(
-            fgDisplay.Display,
-            fgDisplay.Screen,
-            glutGet( GLUT_WINDOW_X ),
-            glutGet( GLUT_WINDOW_Y )
-        );
-
-#       endif
-    }
-
 #elif TARGET_HOST_WIN32
 
        WNDCLASS wc;
@@ -1238,15 +1213,46 @@ void FGAPIENTRY glutFullScreen( void )
 {
     freeglut_assert_ready; freeglut_assert_window;
 
-    /*
-     * Just have the window repositioned and resized
-     */
-    glutPositionWindow( 0, 0 );
+#if TARGET_HOST_UNIX_X11
+    {
+        int x, y;
+        Window w;
+
+        XMoveResizeWindow(
+            fgDisplay.Display,
+            fgStructure.Window->Window.Handle,
+            0, 0,
+            fgDisplay.ScreenWidth,
+            fgDisplay.ScreenHeight
+        );
+        XFlush( fgDisplay.Display );
+
+        XTranslateCoordinates(
+            fgDisplay.Display,
+            fgStructure.Window->Window.Handle,
+            fgDisplay.RootWindow,
+            0, 0, &x, &y, &w
+        );
 
-    glutReshapeWindow(
+        if (x || y)
+        {
+            XMoveWindow(
+                fgDisplay.Display,
+                fgStructure.Window->Window.Handle,
+                -x, -y
+            );
+            XFlush( fgDisplay.Display );
+        }
+    }
+#elif TARGET_HOST_WIN32
+    MoveWindow(
+        fgStructure.Window->Window.Handle,
+        0, 0,
         fgDisplay.ScreenWidth,
-        fgDisplay.ScreenHeight
+        fgDisplay.ScreenHeight,
+        TRUE
     );
+#endif
 }
 
 /*
@@ -1263,12 +1269,3 @@ void FGAPIENTRY glutSetWindowData(void* data)
 }
 
 /*** END OF FILE ***/
-
-
-
-
-
-
-
-
-