Fixed x11 and Wayland not using INVOKE_WCB
[freeglut] / src / x11 / fg_main_x11.c
index 7af570f..80fd2c8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * freeglut_main_x11.c
+ * fg_main_x11.c
  *
  * The X11-specific windows message processing methods.
  *
 
 #include <GL/freeglut.h>
 #include "../fg_internal.h"
-#ifdef HAVE_ERRNO_H
-#    include <errno.h>
-#endif
+#include <errno.h>
 #include <stdarg.h>
-#ifdef  HAVE_VFPRINTF
-#    define VFPRINTF(s,f,a) vfprintf((s),(f),(a))
-#elif defined(HAVE__DOPRNT)
-#    define VFPRINTF(s,f,a) _doprnt((f),(a),(s))
-#else
-#    define VFPRINTF(s,f,a)
-#endif
 
 
 /*
@@ -125,10 +116,8 @@ void fgPlatformSleepForEvents( fg_time_t msec )
         wait.tv_usec = (msec % 1000) * 1000;
         err = select( socket+1, &fdset, NULL, NULL, &wait );
 
-#ifdef HAVE_ERRNO_H
         if( ( -1 == err ) && ( errno != EINTR ) )
             fgWarning ( "freeglut select() error: %d", errno );
-#endif
     }
 }
 
@@ -698,7 +687,7 @@ void fgPlatformProcessSingleEvent ( void )
             if( event.xexpose.count == 0 )
             {
                 GETWINDOW( xexpose );
-                window->State.Redisplay = GL_TRUE;
+                window->State.WorkMask |= GLUT_DISPLAY_WORK;
             }
             break;
 
@@ -901,8 +890,10 @@ void fgPlatformProcessSingleEvent ( void )
         case KeyRelease:
         case KeyPress:
         {
-            FGCBKeyboard keyboard_cb;
-            FGCBSpecial special_cb;
+            FGCBKeyboardUC keyboard_cb;
+            FGCBSpecialUC special_cb;
+            FGCBUserData keyboard_ud;
+            FGCBUserData special_ud;
 
             GETWINDOW( xkey );
             GETMOUSE( xkey );
@@ -943,13 +934,17 @@ void fgPlatformProcessSingleEvent ( void )
 
             if( event.type == KeyPress )
             {
-                keyboard_cb = (FGCBKeyboard)( FETCH_WCB( *window, Keyboard ));
-                special_cb  = (FGCBSpecial) ( FETCH_WCB( *window, Special  ));
+                keyboard_cb = (FGCBKeyboardUC)( FETCH_WCB( *window, Keyboard ));
+                special_cb  = (FGCBSpecialUC) ( FETCH_WCB( *window, Special  ));
+                keyboard_ud = FETCH_USER_DATA_WCB( *window, Keyboard );
+                special_ud  = FETCH_USER_DATA_WCB( *window, Special  );
             }
             else
             {
-                keyboard_cb = (FGCBKeyboard)( FETCH_WCB( *window, KeyboardUp ));
-                special_cb  = (FGCBSpecial) ( FETCH_WCB( *window, SpecialUp  ));
+                keyboard_cb = (FGCBKeyboardUC)( FETCH_WCB( *window, KeyboardUp ));
+                special_cb  = (FGCBSpecialUC) ( FETCH_WCB( *window, SpecialUp  ));
+                keyboard_ud = FETCH_USER_DATA_WCB( *window, KeyboardUp );
+                special_ud  = FETCH_USER_DATA_WCB( *window, SpecialUp  );
             }
 
             /* Is there a keyboard/special callback hooked for this window? */
@@ -974,7 +969,8 @@ void fgPlatformProcessSingleEvent ( void )
                         fgSetWindow( window );
                         fgState.Modifiers = fgPlatformGetModifiers( event.xkey.state );
                         keyboard_cb( asciiCode[ 0 ],
-                                     event.xkey.x, event.xkey.y
+                                     event.xkey.x, event.xkey.y,
+                                     keyboard_ud
                         );
                         fgState.Modifiers = INVALID_MODIFIERS;
                     }
@@ -1042,7 +1038,7 @@ void fgPlatformProcessSingleEvent ( void )
                     {
                         fgSetWindow( window );
                         fgState.Modifiers = fgPlatformGetModifiers( event.xkey.state );
-                        special_cb( special, event.xkey.x, event.xkey.y );
+                        special_cb( special, event.xkey.x, event.xkey.y, special_ud );
                         fgState.Modifiers = INVALID_MODIFIERS;
                     }
                 }
@@ -1078,36 +1074,19 @@ void fgPlatformMainLoopPreliminaryWork ( void )
 }
 
 
-/* Step through the work list */
-void fgPlatformProcessWork(SFG_Window *window)
+/* deal with work list items */
+void fgPlatformInitWork(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.
+    /* 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?
+     * -> this is a no-op
      */
-    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 );
-    }
+     return;
+}
 
+void fgPlatformPosResZordWork(SFG_Window* window, unsigned int workMask)
+{
     if (workMask & GLUT_FULL_SCREEN_WORK)
         fgPlatformFullScreenToggle( window );
     if (workMask & GLUT_POSITION_WORK)
@@ -1121,28 +1100,28 @@ void fgPlatformProcessWork(SFG_Window *window)
         else
             fgPlatformPopWindow( window );
     }
+}
 
-    if (workMask & GLUT_VISIBILITY_WORK)
+void fgPlatformVisibilityWork(SFG_Window* window)
+{
+    /* 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)
     {
-        /* 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;
-        }
+    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;
     }
 }