Wrote SET_WCB() to set a window callback. This lets us out of using
authorRichard Rauch <rkr@olib.org>
Fri, 19 Dec 2003 00:54:27 +0000 (00:54 +0000)
committerRichard Rauch <rkr@olib.org>
Fri, 19 Dec 2003 00:54:27 +0000 (00:54 +0000)
the FETCH_WCB() as an lvalue (which it shouldn't, since the value of
the FETCH is cast to the correct function-pointer type).

git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@410 7f0cb862-5218-0410-a997-914c9d46530a

src/freeglut_callbacks.c
src/freeglut_internal.h
src/freeglut_structure.c

index 00d7ba1..7f2e23b 100644 (file)
@@ -41,7 +41,7 @@
 #define SET_CALLBACK(a)              \
     if( fgStructure.Window == NULL ) \
         return;                      \
-    FETCH_WCB( ( *( fgStructure.Window ) ), a ) = callback;
+    SET_WCB( ( *( fgStructure.Window ) ), a, callback );
 
 /*
  * Sets the Display callback for the current window
index 7ffb4b6..9044853 100644 (file)
@@ -373,6 +373,38 @@ struct tagSFG_WindowState
 
 
 /*
+ * SET_WCB() is used as:
+ *
+ *     SET_WCB( window, Visibility, func );
+ *
+ * ...where {window} is the freeglut window to set the callback,
+ *          {Visibility} is the window-specific callback to set,
+ *          {func} is a function-pointer.
+ *
+ * Originally, {FETCH_WCB( ... ) = func} was rather sloppily used,
+ * but this can cause warnings because the FETCH_WCB() macro type-
+ * casts its result, and a type-cast value shouldn't be an lvalue.
+ *
+ * XXX Note that there is no type-checking to make sure that {func} is
+ * XXX a suitable type.  We could add a safety-check of the form:
+ * XXX
+ * XXX     if( FETCH_WCB( ... ) != func )
+ * XXX         ...
+ * XXX
+ * XXX ...is this desired?
+ *
+ * XXX The {if( FETCH_WCB( ... ) != func )} test is to do type-checking
+ * XXX and for no other reason.  Since it's hidden in the macro, the
+ * XXX ugliness is felt to be rather benign.
+ */
+#define SET_WCB(window,cbname,func)                   \
+do                                                    \
+{                                                     \
+    if( FETCH_WCB( window, cbname ) != func )         \
+        (((window).CallBacks[CB_ ## cbname]) = func); \
+} while( 0 )                                          \
+
+/*
  * FETCH_WCB() is used as:
  *
  *     FETCH_WCB( window, Visibility );
index 2c5f1fe..b4834a7 100644 (file)
@@ -201,7 +201,7 @@ void fgAddToWindowDestroyList( SFG_Window* window )
     {
         void *destroy = FETCH_WCB( *window, Destroy );
         fgClearCallBacks( window );
-        FETCH_WCB( *window, Destroy ) = destroy;
+        SET_WCB( *window, Destroy, destroy );
     }
 }