/* XXX Update these for each release! */
#define VERSION_MAJOR 2
-#define VERSION_MINOR 2
+#define VERSION_MINOR 4
#define VERSION_PATCH 0
/* Freeglut is meant to be available under all Unix/X11 and Win32 platforms. */
#include <windowsx.h>
#include <mmsystem.h>
#include <TCHAR.H>
+
+/* TODO: MinGW is lacking a prototype, this should better be handled via autoconf! */
+#ifndef ChangeDisplaySettingsEx
+LONG WINAPI ChangeDisplaySettingsExA(LPCSTR,LPDEVMODEA,HWND,DWORD,LPVOID);
+LONG WINAPI ChangeDisplaySettingsExW(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID);
+#ifdef UNICODE
+#define ChangeDisplaySettingsEx ChangeDisplaySettingsExW
+#else
+#define ChangeDisplaySettingsEx ChangeDisplaySettingsExA
+#endif
+#endif
#endif
#if defined(_MSC_VER)
# define FALSE 0
#endif
+#define INVALID_MODIFIERS 0xffffffff
+
/* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */
/* Freeglut callbacks type definitions */
fgExecutionState ExecState; /* Used for GLUT termination */
char *ProgramName; /* Name of the invoking program */
GLboolean JoysticksInitialised; /* Only initialize if application calls for them */
+ GLboolean InputDevsInitialised; /* Only initialize if application calls for them */
};
/* The structure used by display initialization in freeglut_init.c */
#if TARGET_HOST_UNIX_X11
XVisualInfo* VisualInfo; /* The window's visual information */
- Pixmap Pixmap; /* Used for offscreen rendering */
- /* GLXPixmap GLXPixMap; */ /* Used for offscreen rendering */
#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
HDC Device; /* The window's device context */
#endif
/*
+ * A generic function pointer. We should really use the GLUTproc type
+ * defined in freeglut_ext.h, but if we include that header in this file
+ * a bunch of other stuff (font-related) blows up!
+ */
+typedef void (*SFG_Proc)();
+
+
+/*
* SET_WCB() is used as:
*
- * SET_WCB( window, Visibility, func );
+ * SET_WCB( window, cbname, func );
*
* ...where {window} is the freeglut window to set the callback,
- * {Visibility} is the window-specific callback to set,
+ * {cbname} is the window-specific callback to set,
* {func} is a function-pointer.
*
* Originally, {FETCH_WCB( ... ) = func} was rather sloppily used,
#define SET_WCB(window,cbname,func) \
do \
{ \
- if( FETCH_WCB( window, cbname ) != func ) \
- (((window).CallBacks[CB_ ## cbname]) = (void *) func); \
-} while( 0 ) \
+ if( FETCH_WCB( window, cbname ) != (SFG_Proc)(func) ) \
+ (((window).CallBacks[CB_ ## cbname]) = (SFG_Proc)(func)); \
+} while( 0 )
/*
* FETCH_WCB() is used as:
*
- * FETCH_WCB( window, Visibility );
+ * FETCH_WCB( window, cbname );
*
* ...where {window} is the freeglut window to fetch the callback from,
- * {Visibility} is the window-specific callback to fetch.
+ * {cbname} is the window-specific callback to fetch.
*
* The result is correctly type-cast to the callback function pointer
* type.
*/
#define FETCH_WCB(window,cbname) \
- ((FGCB ## cbname)((window).CallBacks[CB_ ## cbname]))
+ ((window).CallBacks[CB_ ## cbname])
/*
* INVOKE_WCB() is used as:
*
- * INVOKE_WCB( window, Visibility, ( status ) );
+ * INVOKE_WCB( window, cbname, ( arg_list ) );
*
* ...where {window} is the freeglut window,
- * {Visibility} is the window-specific callback,
- * {(status)} is the parameter list.
+ * {cbname} is the window-specific callback to be invoked,
+ * {(arg_list)} is the parameter list.
*
* The callback is invoked as:
*
- * callback( status );
+ * callback( arg_list );
*
* ...so the parentheses are REQUIRED in the {arg_list}.
*
* current window.
*
*/
+#if TARGET_HOST_WIN32
+#define INVOKE_WCB(window,cbname,arg_list) \
+do \
+{ \
+ if( FETCH_WCB( window, cbname ) ) \
+ { \
+ FGCB ## cbname func = (FGCB ## cbname)(FETCH_WCB( window, cbname )); \
+ fgSetWindow( &window ); \
+ func arg_list; \
+ } \
+} while( 0 )
+#else
#define INVOKE_WCB(window,cbname,arg_list) \
do \
{ \
if( FETCH_WCB( window, cbname ) ) \
{ \
fgSetWindow( &window ); \
- FETCH_WCB( window, cbname ) arg_list; \
+ ((FGCB ## cbname)FETCH_WCB( window, cbname )) arg_list; \
} \
} while( 0 )
+#endif
/*
* The window callbacks the user can supply us with. Should be kept portable.
struct tagSFG_MenuContext
{
#if TARGET_HOST_UNIX_X11
- XVisualInfo* VisualInfo; /* The window's visual information */
+ XVisualInfo* MVisualInfo; /* The window's visual information */
#endif
- SFG_WindowContextType Context; /* The menu window's WGL context */
+ SFG_WindowContextType MContext; /* The menu window's WGL context */
};
/* This structure describes a menu */
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 */
+ SFG_Window *ParentWindow; /* Window in which the menu is invoked */
};
/* This is a menu entry */
/*
* A window, making part of freeglut windows hierarchy.
* Should be kept portable.
+ *
+ * NOTE that ActiveMenu is set to menu itself if the window is a menu.
*/
struct tagSFG_Window
{
SFG_Context Window; /* Window and OpenGL context */
SFG_WindowState State; /* The window state */
- void *CallBacks[ TOTAL_CALLBACKS ]; /* Array of window callbacks */
+ SFG_Proc CallBacks[ TOTAL_CALLBACKS ]; /* Array of window callbacks */
void *UserData ; /* For use by user */
SFG_Menu* Menu[ FREEGLUT_MAX_MENUS ]; /* Menus appended to window */
SFG_List Menus; /* The global menus list */
SFG_List WindowsToDestroy;
- SFG_Window* Window; /* The currently active win. */
- SFG_Menu* Menu; /* Same, but menu... */
+ SFG_Window* CurrentWindow; /* The currently set window */
+ SFG_Menu* CurrentMenu; /* Same, but menu... */
SFG_MenuContext* MenuContext; /* OpenGL rendering context for menus */
* window set, respectively:
*/
#define FREEGLUT_EXIT_IF_NO_WINDOW( string ) \
- if ( ! fgStructure.Window ) \
+ if ( ! fgStructure.CurrentWindow ) \
{ \
fgError ( " ERROR: Function <%s> called" \
" with no current window defined.", (string) ) ; \
void fgJoystickClose( void );
void fgJoystickPollWindow( SFG_Window* window );
-/* More joystick functions. Should these go into the API? */
-int glutJoystickGetNumAxes( int ident );
-int glutJoystickGetNumButtons( int ident );
-int glutJoystickNotWorking( int ident );
+/* InputDevice Initialisation and Closure */
+int fgInputDeviceDetect( void );
+void fgInitialiseInputDevices( void );
+void fgInputDeviceClose( void );
+
+/* Setting the cursor for a given window */
+void fgSetCursor ( SFG_Window *window, int cursorID );
/*
* Helper function to enumerate through all registered windows
* The menu activation and deactivation the code. This is the meat
* of the menu user interface handling code...
*/
-void fgActivateMenu( SFG_Window* window, int button );
+void fgUpdateMenuHighlight ( SFG_Menu *menu );
GLboolean fgCheckActiveMenu ( SFG_Window *window, int button, GLboolean pressed,
int mouse_x, int mouse_y );
void fgDeactivateMenu( SFG_Window *window );
-void fgDeactivateSubMenu( SFG_MenuEntry *menuEntry );
/*
* This function gets called just before the buffers swap, so that
*/
void fgDisplayMenu( void );
-/*
- * Display the mouse cursor using OpenGL calls. The function
- * is defined in freeglut_cursor.c file.
- */
-void fgDisplayCursor( void );
-
/* Elapsed time as per glutGet(GLUT_ELAPSED_TIME). */
long fgElapsedTime( void );