X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_internal.h;h=8182f362fca3461c1297620db1df17f28de89f03;hb=352d4e747f296e49bf4ff00a99cef21525980c38;hp=effb2e0847260295d830aee9523d1f0609ea3862;hpb=10c6a55939634438c5a2624fb1bb9ea86a520285;p=freeglut diff --git a/src/freeglut_internal.h b/src/freeglut_internal.h index effb2e0..8182f36 100644 --- a/src/freeglut_internal.h +++ b/src/freeglut_internal.h @@ -28,13 +28,13 @@ #ifndef FREEGLUT_INTERNAL_H #define FREEGLUT_INTERNAL_H -#ifdef HAVE_CONFIG_H +#if HAVE_CONFIG_H # include "config.h" #endif /* 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. */ @@ -60,6 +60,17 @@ #include #include #include + +/* 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) @@ -73,18 +84,20 @@ #include #include #include -#include -#if TARGET_HOST_UNIX_X11 -#include -# if TIME_WITH_SYS_TIME +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_UNISTD_H +# include +#endif +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H # include -# include # else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif +# include # endif #endif @@ -113,6 +126,8 @@ # define FALSE 0 #endif +#define INVALID_MODIFIERS 0xffffffff + /* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */ /* Freeglut callbacks type definitions */ @@ -242,6 +257,7 @@ struct tagSFG_State 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 */ @@ -321,8 +337,6 @@ struct tagSFG_Context #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 @@ -358,12 +372,20 @@ struct tagSFG_WindowState /* + * 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, @@ -377,36 +399,36 @@ struct tagSFG_WindowState #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}. * @@ -414,15 +436,28 @@ do \ * 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 ); \ - FETCH_WCB( window, cbname ) arg_list; \ + func arg_list; \ } \ } while( 0 ) +#else +#define INVOKE_WCB(window,cbname,arg_list) \ +do \ +{ \ + if( FETCH_WCB( window, cbname ) ) \ + { \ + fgSetWindow( &window ); \ + ((FGCB ## cbname)FETCH_WCB( window, cbname )) arg_list; \ + } \ +} while( 0 ) +#endif /* * The window callbacks the user can supply us with. Should be kept portable. @@ -479,10 +514,10 @@ typedef struct tagSFG_MenuContext SFG_MenuContext; 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 */ @@ -504,7 +539,7 @@ struct tagSFG_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 */ @@ -522,6 +557,8 @@ struct tagSFG_MenuEntry /* * 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 { @@ -530,7 +567,7 @@ 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 */ @@ -559,8 +596,8 @@ struct tagSFG_Structure 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 */ @@ -683,7 +720,7 @@ extern SFG_State fgState; * 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) ) ; \ @@ -749,6 +786,14 @@ 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 * and one to enumerate all of a window's subwindows... @@ -789,11 +834,10 @@ SFG_Menu* fgMenuByID( int menuID ); * 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 @@ -802,12 +846,6 @@ void fgDeactivateSubMenu( SFG_MenuEntry *menuEntry ); */ 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 );