+
+/* Step through the work list */
+void fgPlatformProcessWork(SFG_Window *window)
+{
+ unsigned int workMask = window->State.WorkMask;
+ /* Now clear it so that any callback generated by the actions below can set work again */
+ window->State.WorkMask = 0;
+
+ /* This is before the first display callback: call a few callbacks to inform user of window size, position, etc
+ * we know this is before the first display callback of a window as for all windows GLUT_INIT_WORK is set when
+ * they are opened, and work is done before displaying in the mainloop.
+ */
+ if (workMask & GLUT_INIT_WORK)
+ {
+ /* Notify windowStatus/visibility, position and size get notified on window creation with message handlers above
+ * XXX CHECK: do the messages happen too early like on windows, so client code cannot have registered
+ * a callback yet and the message is thus never received by client?
+ */
+
+ /* Call init context callback */
+ INVOKE_WCB( *window, InitContext, ());
+
+ /* Lastly, check if we have a display callback, error out if not
+ * This is the right place to do it, as the redisplay will be
+ * next right after we exit this function, so there is no more
+ * opportunity for the user to register a callback for this window.
+ */
+ if (!FETCH_WCB(*window, Display))
+ fgError ( "ERROR: No display callback registered for window %d\n", window->ID );
+ }
+
+ if (workMask & GLUT_FULL_SCREEN_WORK)
+ fgPlatformFullScreenToggle( window );
+ if (workMask & GLUT_POSITION_WORK)
+ fgPlatformPositionWindow( window, window->State.DesiredXpos, window->State.DesiredYpos );
+ if (workMask & GLUT_SIZE_WORK)
+ fgPlatformReshapeWindow ( window, window->State.DesiredWidth, window->State.DesiredHeight );
+ if (workMask & GLUT_ZORDER_WORK)
+ {
+ if (window->State.DesiredZOrder < 0)
+ fgPlatformPushWindow( window );
+ else
+ fgPlatformPopWindow( window );
+ }
+
+ if (workMask & GLUT_VISIBILITY_WORK)
+ {
+ /* Visibility status of window gets updated in the window message handlers above
+ * XXX: is this really the case? check
+ */
+ SFG_Window *win = window;
+ switch (window->State.DesiredVisibility)
+ {
+ case DesireHiddenState:
+ fgPlatformHideWindow( window );
+ break;
+ case DesireIconicState:
+ /* Call on top-level window */
+ while (win->Parent)
+ win = win->Parent;
+ fgPlatformIconifyWindow( win );
+ break;
+ case DesireNormalState:
+ fgPlatformShowWindow( window );
+ break;
+ }
+ }
+}
+