comment on timer checking, are timers always sorted by triggertime? Else the code...
[freeglut] / src / x11 / fg_window_x11.c
index 1b90bf5..6f927c2 100644 (file)
@@ -32,6 +32,8 @@
 #include <unistd.h>  /* usleep */
 #include "../fg_internal.h"
 
+extern void fghRedrawWindow(SFG_Window *window);
+
 #ifdef EGL_VERSION_1_0
 #include "egl/fg_window_egl.h"
 #define fghCreateNewContext fghCreateNewContextEGL
@@ -133,6 +135,7 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
     XEvent eventReturnBuffer; /* return buffer required for a call */
     unsigned long mask;
     unsigned int current_DisplayMode = fgState.DisplayMode ;
+    XConfigureEvent fakeEvent = {0};
 
     /* Save the display mode if we are creating a menu window */
     if( window->IsMenu && ( ! fgStructure.MenuContext ) )
@@ -239,6 +242,18 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
         &winAttr
     );
 
+    /* Fake configure event to force viewport setup
+     * even with no window manager.
+     */
+    fakeEvent.type = ConfigureNotify;
+    fakeEvent.display = fgDisplay.pDisplay.Display;
+    fakeEvent.window = window->Window.Handle;
+    fakeEvent.x = x;
+    fakeEvent.y = y;
+    fakeEvent.width = w;
+    fakeEvent.height = h;
+    XPutBackEvent(fgDisplay.pDisplay.Display, (XEvent*)&fakeEvent);
+
     /*
      * The GLX context creation, possibly trying the direct context rendering
      *  or else use the current context if the user has so specified
@@ -357,6 +372,26 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
 
 
 /*
+ * Request a window resize
+ */
+void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height )
+{
+    XResizeWindow( fgDisplay.pDisplay.Display, window->Window.Handle,
+                   width, height );
+    XFlush( fgDisplay.pDisplay.Display ); /* XXX Shouldn't need this */
+}
+
+
+/*
+ * A static helper function to execute display callback for a window
+ */
+void fgPlatformDisplayWindow ( SFG_Window *window )
+{
+        fghRedrawWindow ( window ) ;
+}
+
+
+/*
  * Closes a window, destroying the frame and OpenGL context
  */
 void fgPlatformCloseWindow( SFG_Window* window )
@@ -408,6 +443,8 @@ void fgPlatformGlutIconifyWindow( void )
     XIconifyWindow( fgDisplay.pDisplay.Display, fgStructure.CurrentWindow->Window.Handle,
                     fgDisplay.pDisplay.Screen );
     XFlush( fgDisplay.pDisplay.Display ); /* XXX Shouldn't need this */
+
+    fgStructure.CurrentWindow->State.Visible   = GL_FALSE;
 }
 
 /*