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 */
};
/*
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 */
};
/*
#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]))
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,
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
};
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 */
};
/*
};
/*
- * 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
{
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 */
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.
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 */
};
/*
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 */
};
/*
* 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()
* 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 );
/*
* 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
#if TARGET_HOST_UNIX_X11
SFG_Window* fgWindowByHandle( Window hWindow );
#elif TARGET_HOST_WIN32
-
SFG_Window* fgWindowByHandle( HWND hWindow );
#endif
* 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 );
{
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, ( ) );
}
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 );
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 );
}
fgSetWindow ( current_window );
}
+ /*
+ * XXX See above comment about the Redisplay flag...
+ */
if( ( FETCH_WCB( *window, Display ) ) &&
( window->State.Redisplay == TRUE ) &&
( window->State.Visible == TRUE ) )
{
GETWINDOW( xcrossing );
GETMOUSE( xcrossing );
- /*
- * if( window->Callbacks.Entry )
- * {
- * fgSetWindow( window ) ;
- * window->Callbacks.Entry( GLUT_ENTERED );
- * }
- */
INVOKE_WCB( *window, Entry, ( GLUT_ENTERED ) );
}
break;
{
GETWINDOW( xcrossing );
GETMOUSE( xcrossing );
- /*
- * if( window->Callbacks.Entry )
- * {
- * fgSetWindow( window ) ;
- * window->Callbacks.Entry( GLUT_LEFT );
- * }
- */
INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) );
}
break;
(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;
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.
! FETCH_WCB( *window, MouseWheel ) )
break;
- /* fgSetWindow( window ); */
-
/*
* XXX Why don't we use {window}? Other code here does...
*/
*/
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,
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,
{
SFG_Window *current_window = fgStructure.Window ;
- /*
- * fgSetWindow( window );
- * window->Callbacks.Visibility ( window->State.Visible ) ;
- */
INVOKE_WCB( *window, Visibility, ( window->State.Visible ) );
fgSetWindow( current_window );
}
( 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 ) );
}
window->State.MouseY
)
);
- /*
- * window->Callbacks.Mouse(
- * button,
- * pressed == TRUE ? GLUT_DOWN : GLUT_UP,
- * window->State.MouseX,
- * window->State.MouseY
- * );
- */
fgStructure.Window->State.Modifiers = 0xffffffff;
}
)
);
}
- /*
- * 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 */
{
/*
( 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;
/*
* 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;
/*
* 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 )
);
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 )
}
}
- /*
- * 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,
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 )
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 ) ; */