Cleanup pass after committing callback conversion (from structure to
authorRichard Rauch <rkr@olib.org>
Thu, 6 Nov 2003 23:29:55 +0000 (23:29 +0000)
committerRichard Rauch <rkr@olib.org>
Thu, 6 Nov 2003 23:29:55 +0000 (23:29 +0000)
array-of-pointers).  Mostly deleted commented-out struct-based code.
Also added some XXX comments that I though should be pondered.  (My
own pair of eyes, and one brain cell, were not sufficient at this time
to decide what to do for those ponderables.  (^&)

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

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

index dfabb90..f34fe1b 100644 (file)
@@ -42,7 +42,6 @@
     if( fgStructure.Window == NULL ) \
         return;                      \
     FETCH_WCB( ( *( fgStructure.Window ) ), a ) = callback;
-    /* fgStructure.Window->Callbacks.a = callback; */
 
 /*
  * Sets the Display callback for the current window
@@ -123,18 +122,12 @@ static void fghVisibility( int status )
     freeglut_return_if_fail( fgStructure.Window );
     vis = FETCH_WCB( ( *( fgStructure.Window ) ), Visibility );
     freeglut_return_if_fail( vis );
-    /* Callbacks.Visibility ); */
 
     if( status == GLUT_HIDDEN  || status == GLUT_FULLY_COVERED )
         glut_status = GLUT_NOT_VISIBLE;
     else
         glut_status = GLUT_VISIBLE;
     vis( glut_status );
-    /*
-        fgStructure.Window->Callbacks.Visibility( GLUT_NOT_VISIBLE );
-    else
-        fgStructure.Window->Callbacks.Visibility( GLUT_VISIBLE );
-    */
 }
 
 void FGAPIENTRY glutVisibilityFunc( void (* callback)( int ) )
index fda0423..9cfe936 100644 (file)
@@ -212,43 +212,43 @@ typedef enum {
 typedef struct tagSFG_State SFG_State;
 struct tagSFG_State
 {
-    SFG_XYUse        Position;             /* The default windows' position     */
-    SFG_XYUse        Size;                 /* The default windows' size         */
-    unsigned int     DisplayMode;          /* The display mode for new windows  */
+    SFG_XYUse        Position;             /* The default windows' position  */
+    SFG_XYUse        Size;                 /* The default windows' size      */
+    unsigned int     DisplayMode;          /* Display mode for new windows   */
 
-    GLboolean        ForceDirectContext;   /* Should we force direct contexts?  */
-    GLboolean        TryDirectContext;     /* What about giving a try to?       */
+    GLboolean        ForceDirectContext;   /* Force direct rendering?        */
+    GLboolean        TryDirectContext;     /* What about giving a try to?    */
 
-    GLboolean        ForceIconic;          /* All new top windows are iconified */
-    GLboolean        UseCurrentContext;    /* New windows use current window's rendering context */
+    GLboolean        ForceIconic;          /* New top windows are iconified  */
+    GLboolean        UseCurrentContext;    /* New windows share with current */
 
-    GLboolean        GLDebugSwitch;        /* OpenGL state debugging switch     */
-    GLboolean        XSyncSwitch;          /* X11 sync protocol switch          */
+    GLboolean        GLDebugSwitch;        /* OpenGL state debugging switch  */
+    GLboolean        XSyncSwitch;          /* X11 sync protocol switch       */
 
-    GLboolean        IgnoreKeyRepeat;      /* Whether to ignore key repeat...   */
+    GLboolean        IgnoreKeyRepeat;      /* Whether to ignore key repeat.  */
 
-    GLuint           FPSInterval;          /* Interval between FPS printfs      */
-    GLuint           SwapCount;            /* Count of glutSwapBuffer calls     */
-    GLuint           SwapTime;             /* Time of last SwapBuffers          */
+    GLuint           FPSInterval;          /* Interval between FPS printfs   */
+    GLuint           SwapCount;            /* Count of glutSwapBuffer calls  */
+    GLuint           SwapTime;             /* Time of last SwapBuffers       */
 
-    SFG_Time         Time;                 /* The time that glutInit was called */
-    SFG_List         Timers;               /* The freeglut timer hooks          */
+    SFG_Time         Time;                 /* Time that glutInit was called  */
+    SFG_List         Timers;               /* The freeglut timer hooks       */
 
-    FGCBIdle         IdleCallback;         /* The global idle callback          */
+    FGCBIdle         IdleCallback;         /* The global idle callback       */
 
-    GLboolean        BuildingAMenu;        /* True if we are presently making a menu */
-    int              ActiveMenus;          /* Number of currently active menus  */
-    FGCBMenuState    MenuStateCallback;    /* Menu callbacks are global         */
+    GLboolean        BuildingAMenu;        /* Are we presently making a menu */
+    int              ActiveMenus;          /* Num. of currently active menus */
+    FGCBMenuState    MenuStateCallback;    /* Menu callbacks are global      */
     FGCBMenuStatus   MenuStatusCallback;
 
-    SFG_XYUse        GameModeSize;         /* The game mode screen's dimensions */
-    int              GameModeDepth;        /* The pixel depth for game mode     */
-    int              GameModeRefresh;      /* The refresh rate for game mode    */
+    SFG_XYUse        GameModeSize;         /* Game mode screen's dimensions  */
+    int              GameModeDepth;        /* The pixel depth for game mode  */
+    int              GameModeRefresh;      /* The refresh rate for game mode */
 
-    int              ActionOnWindowClose ; /* Action when user clicks "x" on window header bar */
+    int              ActionOnWindowClose; /* Action when user closes window  */
 
-    fgExecutionState ExecState ;           /* Current state of the GLUT execution */
-    char            *ProgramName ;         /* Name of the program invoking the "freeglut" library" */
+    fgExecutionState ExecState;           /* Used for GLUT termination       */
+    char            *ProgramName;         /* Name of the invoking program    */
 };
 
 /*
@@ -312,18 +312,18 @@ typedef struct tagSFG_Context SFG_Context;
 struct tagSFG_Context
 {
 #if TARGET_HOST_UNIX_X11
-    Window          Handle;             /* The window's handle                 */
-    GLXContext      Context;            /* The OpenGL context                  */
-    XVisualInfo*    VisualInfo;         /* The window's visual information     */
+    Window          Handle;          /* The window's handle                 */
+    GLXContext      Context;         /* The OpenGL context                  */
+    XVisualInfo*    VisualInfo;      /* The window's visual information     */
 
 #elif TARGET_HOST_WIN32
-    HWND            Handle;             /* The window's handle                 */
-    HDC             Device;             /* The window's device context         */
-    HGLRC           Context;            /* The window's WGL context            */
+    HWND            Handle;          /* The window's handle                 */
+    HDC             Device;          /* The window's device context         */
+    HGLRC           Context;         /* The window's WGL context            */
 
 #endif
 
-    int             DoubleBuffered;     /* Treat the window as double-buffered */
+    int             DoubleBuffered;  /* Treat the window as double-buffered */
 };
 
 /*
@@ -353,45 +353,19 @@ struct tagSFG_WindowState
 #endif
 };
 
+
 /*
- * The window callbacks the user can supply us with. Should be kept portable.
+ * FETCH_WCB() is used as:
+ *
+ *     FETCH_WCB( window, Visibility );
+ *
+ * ...where {window} is the freeglut window to fetch the callback from,
+ *          {Visibility} is the window-specific callback to fetch.
+ *
+ * The result is correctly type-cast to the callback function pointer
+ * type.  (This is accomlished by abutting the callback name to a
+ * common prefix, using ANSI C token-pasting.)
  */
-typedef struct tagSFG_WindowCallbacks SFG_WindowCallbacks;
-struct tagSFG_WindowCallbacks
-{
-    /*
-     * Following callbacks are fully supported right now
-     * and are ready to be tested for GLUT conformance:
-     */
-    FGCBDisplay         Display;
-    FGCBReshape         Reshape;
-    FGCBKeyboard        Keyboard;
-    FGCBKeyboardUp      KeyboardUp;
-    FGCBSpecial         Special;
-    FGCBSpecialUp       SpecialUp;
-    FGCBMouse           Mouse;
-    FGCBMouseWheel      MouseWheel;
-    FGCBMotion          Motion;
-    FGCBPassive         Passive;
-    FGCBEntry           Entry;
-    FGCBVisibility      Visibility;
-    FGCBWindowStatus    WindowStatus;
-    FGCBJoystick        Joystick;
-    FGCBDestroy         Destroy;
-
-    /*
-     * Those callbacks are being ignored for the moment
-     */
-    FGCBSelect          Select;
-    FGCBOverlayDisplay  OverlayDisplay;
-    FGCBSpaceMotion     SpaceMotion;
-    FGCBSpaceRotation   SpaceRotation;
-    FGCBSpaceButton     SpaceButton;
-    FGCBDials           Dials;
-    FGCBButtonBox       ButtonBox;
-    FGCBTabletMotion    TabletMotion;
-    FGCBTabletButton    TabletButton;
-};
 #define FETCH_WCB(window,cbname) \
     ((FGCB ## cbname)((window).CallBacks[CB_ ## cbname]))
 
@@ -422,6 +396,23 @@ struct tagSFG_WindowCallbacks
         FETCH_WCB( window, cbname ) arg_list; \
     }                                         \
 }
+
+/*
+ * The window callbacks the user can supply us with. Should be kept portable.
+ *
+ * This enumeration provides the freeglut CallBack numbers.
+ * The symbolic constants are indices into a window's array of
+ * function callbacks.  The names are formed by splicing a common
+ * prefix onto the callback's base name.  (This was originally
+ * done so that an early stage of development could live side-by-
+ * side with the old callback code.  The old callback code used
+ * the bare callback's name as a structure member, so I used a
+ * prefix for the array index name.)
+ *
+ * XXX For consistancy, perhaps the prefix should match the
+ * XXX FETCH* and INVOKE* macro suffices.  I.e., WCB_, rather than
+ * XXX CB_.
+ */
 enum
 {
     CB_Display,
@@ -463,10 +454,10 @@ typedef struct tagSFG_MenuContext SFG_MenuContext;
 struct tagSFG_MenuContext
 {
 #if TARGET_HOST_UNIX_X11
-    GLXContext          Context;                /* The menu OpenGL context   */
-    XVisualInfo*        VisualInfo;             /* The window's visual information */
+    GLXContext          Context;          /* The menu OpenGL context         */
+    XVisualInfo*        VisualInfo;       /* The window's visual information */
 #elif TARGET_HOST_WIN32
-    HGLRC               Context;                /* The menu window's WGL context    */
+    HGLRC               Context;          /* The menu window's WGL context   */
 #endif
 
 };
@@ -480,19 +471,19 @@ typedef struct tagSFG_Menu SFG_Menu;
 struct tagSFG_Menu
 {
     SFG_Node            Node;
-    void               *UserData ;              /* A. Donev:  User data passed back at callback */
-    int                 ID;                     /* The global menu ID        */
-    SFG_List            Entries;                /* The menu entries list     */
-    FGCBMenu            Callback;               /* The menu callback         */
-    FGCBDestroy         Destroy;                /* A. Donev:  Destruction callback         */
-    GLboolean           IsActive;               /* Is the menu selected?     */
-    int                 Width;                  /* Menu box width in pixels  */
-    int                 Height;                 /* Menu box height in pixels */
-    int                 X, Y;                   /* Menu box raster position  */
-
-    SFG_MenuEntry      *ActiveEntry ;           /* Currently active entry in the menu */
-    SFG_Window         *Window ;                /* OpenGL window for menu    */
-    SFG_Window         *ParentWindow ;          /* OpenGL window in which the menu is defined */
+    void               *UserData;     /* User data passed back at callback   */
+    int                 ID;           /* The global menu ID                  */
+    SFG_List            Entries;      /* The menu entries list               */
+    FGCBMenu            Callback;     /* The menu callback                   */
+    FGCBDestroy         Destroy;      /* Destruction callback                */
+    GLboolean           IsActive;     /* Is the menu selected?               */
+    int                 Width;        /* Menu box width in pixels            */
+    int                 Height;       /* Menu box height in pixels           */
+    int                 X, Y;         /* Menu box raster position            */
+
+    SFG_MenuEntry      *ActiveEntry;  /* Currently active entry in the menu  */
+    SFG_Window         *Window;       /* Window for menu                     */
+    SFG_Window         *ParentWindow; /* Window in which the menu is defined */
 };
 
 /*
@@ -510,7 +501,8 @@ struct tagSFG_MenuEntry
 };
 
 /*
- * A window, making part of freeglut windows hierarchy. Should be kept portable.
+ * A window, making part of freeglut windows hierarchy.
+ * Should be kept portable.
  */
 struct tagSFG_Window
 {
@@ -519,9 +511,8 @@ struct tagSFG_Window
 
     SFG_Context         Window;                 /* Window and OpenGL context */
     SFG_WindowState     State;                  /* The window state          */
-/*  SFG_WindowCallbacks Callbacks;              /* The window callbacks      */
     void         *CallBacks[ TOTAL_CALLBACKS ]; /* Array of window callbacks */
-    void               *UserData ;              /* A. Donev:  A pointer to user data used in rendering */
+    void               *UserData ;              /* For use by user           */
 
     SFG_Menu*       Menu[ FREEGLUT_MAX_MENUS ]; /* Menus appended to window  */
     SFG_Menu*       ActiveMenu;                 /* The window's active menu  */
@@ -539,10 +530,10 @@ struct tagSFG_Window
 typedef struct tagSFG_WindowList SFG_WindowList ;
 struct tagSFG_WindowList
 {
-  SFG_Window *window ;
-  GLboolean needToClose ;
-  SFG_WindowList *next ;
-} ;
+    SFG_Window *window ;
+    GLboolean needToClose ;
+    SFG_WindowList *next ;
+};
 
 /*
  * This holds information about all the windows, menus etc.
@@ -550,18 +541,18 @@ struct tagSFG_WindowList
 typedef struct tagSFG_Structure SFG_Structure;
 struct tagSFG_Structure
 {
-    SFG_List            Windows;                /* The global windows list   */
-    SFG_List            Menus;                  /* The global menus list     */
+    SFG_List        Windows;      /* The global windows list            */
+    SFG_List        Menus;        /* The global menus list              */
 
-    SFG_Window*         Window;                 /* The currently active win. */
-    SFG_Menu*           Menu;                   /* Same, but menu...         */
+    SFG_Window*     Window;       /* The currently active win.          */
+    SFG_Menu*       Menu;         /* Same, but menu...                  */
 
-    SFG_MenuContext*    MenuContext;            /* OpenGL rendering context for menus */
+    SFG_MenuContext* MenuContext; /* OpenGL rendering context for menus */
 
-    SFG_Window*         GameMode;               /* The game mode window      */
+    SFG_Window*      GameMode;    /* The game mode window               */
 
-    int                 WindowID;               /* The new current window ID */
-    int                 MenuID;                 /* The new current menu ID   */
+    int              WindowID;    /* The new current window ID          */
+    int              MenuID;      /* The new current menu ID            */
 };
 
 /*
@@ -584,12 +575,12 @@ typedef void (* FGCBenumerator  )( SFG_Window *, SFG_Enumerator * );
 typedef struct tagSFG_Font SFG_Font;
 struct tagSFG_Font
 {
-    char*           Name;                       /* The source font name      */
-    int             Quantity;                   /* Number of chars in font   */
-    int             Height;                     /* Height of the characters  */
-    const GLubyte** Characters;                 /* The characters mapping    */
+    char*           Name;         /* The source font name             */
+    int             Quantity;     /* Number of chars in font          */
+    int             Height;       /* Height of the characters         */
+    const GLubyte** Characters;   /* The characters mapping           */
 
-    float           xorig, yorig ;              /* The origin of the character relative to the draw location */
+    float           xorig, yorig; /* Relative origin of the character */
 };
 
 /*
@@ -656,15 +647,19 @@ extern SFG_State fgState;
  * Following definitions are somewhat similiar to GLib's,
  * but do not generate any log messages:
  */
-#define  freeglut_return_if_fail( expr )            if( !(expr) ) return;
-#define  freeglut_return_val_if_fail( expr, val )   if( !(expr) ) return( val );
+#define  freeglut_return_if_fail( expr ) \
+    if( !(expr) )                        \
+        return;
+#define  freeglut_return_val_if_fail( expr, val ) \
+    if( !(expr) )                                 \
+        return( val );
 
 /*
  * A call to those macros assures us that there is a current
  * window and menu set, respectively:
  */
-#define  freeglut_assert_window                     assert( fgStructure.Window != NULL );
-#define  freeglut_assert_menu                       assert( fgStructure.Menu != NULL );
+#define  freeglut_assert_window assert( fgStructure.Window != NULL );
+#define  freeglut_assert_menu   assert( fgStructure.Menu != NULL );
 
 /*
  * The initialize and deinitialize functions get called on glutInit()
@@ -694,20 +689,26 @@ XVisualInfo* fgChooseVisual( void );
  * The window procedure for Win32 events handling
  */
 #if TARGET_HOST_WIN32
-LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
-GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly, unsigned char layer_type );
+LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg,
+                               WPARAM wParam, LPARAM lParam );
+GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
+                              unsigned char layer_type );
 #endif
 
 /*
  * Window creation, opening, closing and destruction.
  * Defined in freeglut_structure.c, freeglut_window.c.
  */
-SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title, int x, int y, int w, int h, GLboolean gameMode );
+SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title,
+                            int x, int y, int w, int h, GLboolean gameMode );
 void        fgSetWindow ( SFG_Window *window ) ;
-void        fgOpenWindow( SFG_Window* window, const char* title, int x, int y, int w, int h, GLboolean gameMode, int isSubWindow );
+void        fgOpenWindow( SFG_Window* window, const char* title,
+                          int x, int y, int w, int h, GLboolean gameMode,
+                          int isSubWindow );
 void        fgCloseWindow( SFG_Window* window );
-void        fgAddToWindowDestroyList ( SFG_Window* window, GLboolean needToClose ) ;
-void        fgCloseWindows () ;
+void        fgAddToWindowDestroyList ( SFG_Window* window,
+                                       GLboolean needToClose ) ;
+void        fgCloseWindows ();
 void        fgDestroyWindow( SFG_Window* window, GLboolean needToClose );
 
 /*
@@ -736,7 +737,8 @@ void        fgJoystickPollWindow( SFG_Window* window );
  * are defined and exported from freeglut_structure.c file.
  */
 void fgEnumWindows( FGCBenumerator enumCallback, SFG_Enumerator* enumerator );
-void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback, SFG_Enumerator* enumerator );
+void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback,
+                       SFG_Enumerator* enumerator );
 
 /*
  * fgWindowByHandle returns a (SFG_Window *) value pointing to the
@@ -746,7 +748,6 @@ void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback, SFG_Enum
 #if TARGET_HOST_UNIX_X11
     SFG_Window* fgWindowByHandle( Window hWindow );
 #elif TARGET_HOST_WIN32
-
     SFG_Window* fgWindowByHandle( HWND hWindow );
 #endif
 
@@ -768,8 +769,8 @@ SFG_Menu* fgMenuByID( int menuID );
  * of the menu user interface handling code...
  */
 void fgActivateMenu( SFG_Window* window, int button );
-void fgExecuteMenuCallback( SFG_Menu* menu ) ;
-GLboolean fgCheckActiveMenu ( SFG_Window *window, SFG_Menu *menu ) ;
+void fgExecuteMenuCallback( SFG_Menu* menu );
+GLboolean fgCheckActiveMenu ( SFG_Window *window, SFG_Menu *menu );
 void fgDeactivateMenu( SFG_Window *window );
 void fgDeactivateSubMenu( SFG_MenuEntry *menuEntry );
 
index 3982d4b..f4bd177 100644 (file)
@@ -83,12 +83,27 @@ static void fghRedrawWindowByHandle
 {
     SFG_Window* window = fgWindowByHandle( handle );
     freeglut_return_if_fail( window != NULL );
+
+    /*
+     * XXX Other than clearing the Redisplay flag or not,
+     * XXX we may as well rely on the INVOK_WCB() doing this
+     * XXX pointer-check.
+     * XXX
+     * XXX If we do not invoke the display because the pointer
+     * XXX is not defined (should never happen, really), then
+     * XXX we may enter an infinite busy-loop trying to update
+     * XXX the window.  Similarly, if we skip because the window
+     * XXX is not visible.  However, if the window becomes visible
+     * XXX at a later time, the window should get its callback
+     * XXX invoked.  I would recommend removing the first check,
+     * XXX and making the second check only affect whether the
+     * XXX callback is invoked---but always clear the flag, if
+     * XXX the {window} pointer is defined.
+     */
     freeglut_return_if_fail( FETCH_WCB( *window, Display ) );
     freeglut_return_if_fail( window->State.Visible == TRUE );
 
-    /* fgSetWindow( window ); */
     window->State.Redisplay = FALSE;
-    /* window->Callbacks.Display( ); */
     INVOKE_WCB( *window, Display, ( ) );
 }
 
@@ -109,13 +124,6 @@ static void fghReshapeWindowByHandle
     SFG_Window* window = fgWindowByHandle( handle );
     freeglut_return_if_fail( window != NULL );
 
-    /*
-     * fgSetWindow( window );
-     * if( window->Callbacks.Reshape != NULL )
-     *     window->Callbacks.Reshape( width, height );
-     * else
-     *     glViewport( 0, 0, width, height );
-     */
     if( !( FETCH_WCB( *window, Reshape ) ) )
     {
         fgSetWindow( window );
@@ -143,15 +151,22 @@ static void fghReshapeWindowByHandle
 static void fghcbDisplayWindow( SFG_Window *window, SFG_Enumerator *enumerator )
 {
 #if TARGET_HOST_UNIX_X11
+    /*
+     * XXX Do we need/want to check the callback pointer here?
+     * XXX INVOKE_WCB() will check for us.  Arguably, the
+     * XXX Redisplay status flag should be cleared regardless
+     * XXX of any concern but that {window} is a valid pointer
+     * XXX (which this function is assuming anyway).
+     * XXX Especially since old GLUT wouldn't even enter its main
+     * XXX loop if you didn't have a display callback defined...
+     */
     if( ( FETCH_WCB( *window, Display ) ) &&
         ( window->State.Redisplay == TRUE ) &&
         ( window->State.Visible == TRUE ) )
     {
         SFG_Window *current_window = fgStructure.Window ;
 
-        /* fgSetWindow( window ); */
         window->State.Redisplay = FALSE;
-        /* window->Callbacks.Display( ); */
         INVOKE_WCB( *window, Display, ( ) );
         fgSetWindow( current_window );
     }
@@ -174,6 +189,9 @@ static void fghcbDisplayWindow( SFG_Window *window, SFG_Enumerator *enumerator )
         fgSetWindow ( current_window );
     }
 
+    /*
+     * XXX See above comment about the Redisplay flag...
+     */
     if( ( FETCH_WCB( *window, Display ) ) &&
         ( window->State.Redisplay == TRUE ) &&
         ( window->State.Visible == TRUE ) )
@@ -604,13 +622,6 @@ void FGAPIENTRY glutMainLoopEvent( void )
         {
             GETWINDOW( xcrossing );
             GETMOUSE( xcrossing );
-            /*
-             * if( window->Callbacks.Entry )
-             * {
-             *     fgSetWindow( window ) ;
-             *     window->Callbacks.Entry( GLUT_ENTERED );
-             * }
-             */
             INVOKE_WCB( *window, Entry, ( GLUT_ENTERED ) );
         }
         break;
@@ -619,13 +630,6 @@ void FGAPIENTRY glutMainLoopEvent( void )
         {
             GETWINDOW( xcrossing );
             GETMOUSE( xcrossing );
-            /*
-             * if( window->Callbacks.Entry )
-             * {
-             *     fgSetWindow( window ) ;
-             *     window->Callbacks.Entry( GLUT_LEFT );
-             * }
-             */
             INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) );
         }
         break;
@@ -660,33 +664,13 @@ void FGAPIENTRY glutMainLoopEvent( void )
                 (event.xmotion.state & Button4Mask) ||
                 (event.xmotion.state & Button5Mask) )
             {
-                /*
-                 * A mouse button was pressed during the movement...
-                 * Is there a motion callback hooked to the window?
-                 */
-                /*
-                 * if( window->Callbacks.Motion )
-                 * {
-                 *     fgSetWindow ( window ) ;
-                 *     window->Callbacks.Motion( event.xmotion.x,
-                 *                               event.xmotion.y );
-                 * }
-                 */
                 INVOKE_WCB( *window, Motion, ( event.xmotion.x,
-                                             event.xmotion.y ) );
+                                               event.xmotion.y ) );
             }
             else
             {
-                /*
-                 * if( window->Callbacks.Passive )
-                 * {
-                 *     fgSetWindow( window );
-                 *     window->Callbacks.Passive( event.xmotion.x,
-                 *                                event.xmotion.y );
-                 * }
-                 */
                 INVOKE_WCB( *window, Passive, ( event.xmotion.x,
-                                              event.xmotion.y ) );
+                                                event.xmotion.y ) );
             }
         }
         break;
@@ -717,6 +701,10 @@ void FGAPIENTRY glutMainLoopEvent( void )
             button = event.xbutton.button - 1;
 
             /*
+             * XXX This comment is replicated in the WIN32 section and
+             * XXX maybe also in the menu code.  Can we move the info
+             * XXX to one central place and *reference* it from here?
+             *
              * Do not execute the application's mouse callback if a menu
              * is hooked to this button.  In that case an appropriate
              * private call should be generated.
@@ -803,8 +791,6 @@ void FGAPIENTRY glutMainLoopEvent( void )
                 ! FETCH_WCB( *window, MouseWheel ) )
                 break;
 
-            /* fgSetWindow( window ); */
-
             /*
              * XXX Why don't we use {window}?  Other code here does...
              */
@@ -817,15 +803,6 @@ void FGAPIENTRY glutMainLoopEvent( void )
              */
             if( ( button < 4 ) || ( ! FETCH_WCB( *window, MouseWheel ) ) )
             {
-                /*
-                 * if( window->Callbacks.Mouse )
-                 *    fgStructure.Window->Callbacks.Mouse(
-                 *        button,
-                 *        pressed ? GLUT_DOWN : GLUT_UP,
-                 *        event.xbutton.x,
-                 *        event.xbutton.y
-                 *    );
-                 */
                 INVOKE_WCB( *window, Mouse, ( button,
                                               pressed ? GLUT_DOWN : GLUT_UP,
                                               event.xbutton.x,
@@ -846,15 +823,6 @@ void FGAPIENTRY glutMainLoopEvent( void )
                 int wheel_number = (button - 4) / 2;
                 int direction = (button & 1)*2 - 1;
                 
-                /*
-                 * if( pressed )
-                 *    fgStructure.Window->Callbacks.MouseWheel(
-                 *        wheel_number,
-                 *        direction,
-                 *        event.xbutton.x,
-                 *        event.xbutton.y
-                 *    );
-                 */
                 if( pressed )
                     INVOKE_WCB( *window, MouseWheel, ( wheel_number,
                                                        direction,
@@ -1034,10 +1002,6 @@ void FGAPIENTRY glutMainLoop( void )
         {
             SFG_Window *current_window = fgStructure.Window ;
 
-            /*
-             * fgSetWindow( window );
-             * window->Callbacks.Visibility ( window->State.Visible ) ;
-             */
             INVOKE_WCB( *window, Visibility, ( window->State.Visible ) );
             fgSetWindow( current_window );
         }
@@ -1308,27 +1272,11 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
             ( wParam & MK_MBUTTON ) ||
             ( wParam & MK_RBUTTON ) )
         {
-            /*
-             * if( window->Callbacks.Motion )
-             * {
-             *      fgSetWindow( window );
-             *      window->Callbacks.Motion( window->State.MouseX,
-             *                                window->State.MouseY );
-             * }
-             */
             INVOKE_WCB( *window, Motion, ( window->State.MouseX,
                                            window->State.MouseY ) );
         }
         else
         {
-            /*
-             * if( window->Callbacks.Passive )
-             * {
-             *      fgSetWindow( window );
-             *      window->Callbacks.Passive( window->State.MouseX,
-             *                                 window->State.MouseY );
-             * }
-             */
             INVOKE_WCB( *window, Passive, ( window->State.MouseX,
                                             window->State.MouseY ) );
         }
@@ -1457,14 +1405,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
               window->State.MouseY
             )
         );
-        /*
-         * window->Callbacks.Mouse(
-         *     button,
-         *     pressed == TRUE ? GLUT_DOWN : GLUT_UP,
-         *     window->State.MouseX,
-         *     window->State.MouseY
-         * );
-         */
 
         fgStructure.Window->State.Modifiers = 0xffffffff;
     }
@@ -1511,15 +1451,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
                             )
                 );
             }
-            /*
-             * if( window->Callbacks.MouseWheel )
-             *     window->Callbacks.MouseWheel(
-             *         wheel_number,
-             *         direction,
-             *         window->State.MouseX,
-             *         window->State.MouseY
-             *     );
-             */
             else  /* No mouse wheel, call the mouse button callback twice */
             {
                 /*
@@ -1537,17 +1468,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
                             ( button, GLUT_UP,
                               window->State.MouseX, window->State.MouseX )
                 );
-                
-                /*
-                 * window->Callbacks.Mouse( button, GLUT_DOWN,
-                 *                          window->State.MouseX,
-                 *                          window->State.MouseY
-                 * );
-                 * window->Callbacks.Mouse( button, GLUT_UP,
-                 *                          window->State.MouseX,
-                 *                          window->State.MouseY
-                 * );
-                 */
             }
 
         fgStructure.Window->State.Modifiers = 0xffffffff;
@@ -1608,29 +1528,15 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
             /*
              * The delete key should be treated as an ASCII keypress:
              */
-            /*
-             * if( window->Callbacks.Keyboard )
-             * {
-             *     fgSetWindow( window );
-             *     window->Callbacks.Keyboard( 127, window->State.MouseX,
-             *                                 window->State.MouseY );
-             * }
-             */
             INVOKE_WCB( *window, Keyboard,
                         ( 127, window->State.MouseX, window->State.MouseY )
             );
         }
 
-        /* if( ( keypress != -1 ) && window->Callbacks.Special )
-         * {
-         *     fgSetWindow( window );
-         *     window->Callbacks.Special( keypress, window->State.MouseX,
-         *                                window->State.MouseY );
-         * }
-         */
         if( keypress != -1 )
             INVOKE_WCB( *window, Special,
-                        ( keypress, window->State.MouseX, window->State.MouseY )
+                        ( keypress,
+                          window->State.MouseX, window->State.MouseY )
             );
 
         window->State.Modifiers = 0xffffffff;
@@ -1688,13 +1594,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
               /*
                * The delete key should be treated as an ASCII keypress:
                */
-              /* if( window->Callbacks.KeyboardUp )
-               * {
-               *     fgSetWindow( window );
-               *     window->Callbacks.KeyboardUp( 127, window->State.MouseX,
-               *                                   window->State.MouseY );
-               * }
-               */
               INVOKE_WCB( *window, KeyboardUp,
                           ( 127, window->State.MouseX, window->State.MouseY )
               );
@@ -1710,15 +1609,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
             if( ToAscii( wParam, 0, state, code, 0 ) == 1 )
                 wParam=code[ 0 ];
 
-            /*
-             * if( window->Callbacks.KeyboardUp )
-             * {
-             *     fgSetWindow( window );
-             *     window->Callbacks.KeyboardUp( (char)wParam,
-             *                                   window->State.MouseX,
-             *                                   window->State.MouseY );
-             * }
-             */
             INVOKE_WCB( *window, KeyboardUp,
                         ( (char)wParam,
                           window->State.MouseX, window->State.MouseY )
@@ -1726,14 +1616,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
         }
         }
 
-        /*
-         * if( (keypress != -1) && window->Callbacks.SpecialUp )
-         * {
-         *     fgSetWindow( window );
-         *     window->Callbacks.SpecialUp( keypress, window->State.MouseX,
-         *                                  window->State.MouseY );
-         * }
-         */
         if( keypress != -1 )
             INVOKE_WCB( *window, SpecialUp,
                         ( keypress,
@@ -1750,12 +1632,15 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
         if( fgState.IgnoreKeyRepeat && (lParam & KF_REPEAT) )
             break;
 
+        /*
+         * XXX INVOKE_WCB() takes care of the callback-pointer check.
+         * XXX We could just uncoditionally find/trash the Modifiers
+         * XXX and get rid of the "if( ... ) {" and "}".  Unconditinal
+         * XXX code is simpler code.  (^&
+         */
         if( FETCH_WCB( *window, Keyboard ) )
         {
-            /* fgSetWindow( window ); */
             window->State.Modifiers = fgGetWin32Modifiers( );
-            /* window->Callbacks.Keyboard( (char)wParam, window->State.MouseX,
-               window->State.MouseY ); */
             INVOKE_WCB( *window, Keyboard,
                         ( (char)wParam,
                           window->State.MouseX, window->State.MouseY )
@@ -1767,13 +1652,6 @@ LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
 
     case WM_CAPTURECHANGED:
         /* User has finished resizing the window, force a redraw */
-        /*
-         * if( window->Callbacks.Display )
-         * {
-         *     fgSetWindow( window );
-         *     window->Callbacks.Display( );
-         * }
-         */
         INVOKE_WCB( *window, Display, ( ) );
 
         /*lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ) ; */
index bc88a50..8708d2b 100644 (file)
@@ -266,11 +266,14 @@ void fgDestroyWindow( SFG_Window* window, GLboolean needToClose )
     while ( (subWindow = (SFG_Window *)window->Children.First) != NULL )
         fgDestroyWindow( subWindow, needToClose );
 
+    /*
+     * XXX Since INVOKE_WCB() tests the function pointer, why not make
+     * XXX this unconditional?  Overhead is close to nil, and it would
+     * XXX clarify the code by omitting a conditional test.
+     */
     if ( FETCH_WCB( *window, Destroy ) )
     {
       SFG_Window *activeWindow = fgStructure.Window ;
-      /* fgSetWindow ( window ) ; */
-      /* window->Callbacks.Destroy () ; */
       INVOKE_WCB( *window, Destroy, ( ) );
       fgSetWindow ( activeWindow ) ;
     }