# include "config.h"
#endif
+#include "fg_version.h"
+
/* Freeglut is intended to function under all Unix/X11 and Win32 platforms. */
/* XXX: Don't all MS-Windows compilers (except Cygwin) have _WIN32 defined?
* XXX: If so, remove the first set of defined()'s below.
#elif defined (__ANDROID__)
# define TARGET_HOST_ANDROID 1
+#elif defined (__QNXNTO__) || defined (__PLAYBOOK__)
+# define TARGET_HOST_BLACKBERRY 1
+
#elif defined(__posix__) || defined(__unix__) || defined(__linux__) || defined(__sun)
# define TARGET_HOST_POSIX_X11 1
# define TARGET_HOST_MS_WINDOWS 0
#endif
+#ifndef TARGET_HOST_ANDROID
+# define TARGET_HOST_ANDROID 0
+#endif
+
+#ifndef TARGET_HOST_BLACKBERRY
+# define TARGET_HOST_BLACKBERRY 0
+#endif
+
#ifndef TARGET_HOST_POSIX_X11
# define TARGET_HOST_POSIX_X11 0
#endif
typedef unsigned long fg_time_t;
#endif
-
+#ifndef __fg_unused
+# ifdef __GNUC__
+# define __fg_unused __attribute__((unused))
+# else
+# define __fg_unused
+# endif
+#endif
/* Platform-specific includes */
#if TARGET_HOST_POSIX_X11
#if TARGET_HOST_ANDROID
#include "android/fg_internal_android.h"
#endif
+#if TARGET_HOST_BLACKBERRY
+#include "blackberry/fg_internal_blackberry.h"
+#endif
/* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */
/* Freeglut callbacks type definitions */
typedef void (* FGCBDisplay )( void );
typedef void (* FGCBReshape )( int, int );
+typedef void (* FGCBPosition )( int, int );
typedef void (* FGCBVisibility )( int );
typedef void (* FGCBKeyboard )( unsigned char, int, int );
+typedef void (* FGCBKeyboardUp )( unsigned char, int, int );
typedef void (* FGCBSpecial )( int, int, int );
+typedef void (* FGCBSpecialUp )( int, int, int );
typedef void (* FGCBMouse )( int, int, int, int );
typedef void (* FGCBMouseWheel )( int, int, int, int );
typedef void (* FGCBMotion )( int, int );
typedef void (* FGCBPassive )( int, int );
typedef void (* FGCBEntry )( int );
typedef void (* FGCBWindowStatus )( int );
-typedef void (* FGCBSelect )( int, int, int );
typedef void (* FGCBJoystick )( unsigned int, int, int, int );
-typedef void (* FGCBKeyboardUp )( unsigned char, int, int );
-typedef void (* FGCBSpecialUp )( int, int, int );
typedef void (* FGCBOverlayDisplay)( void );
typedef void (* FGCBSpaceMotion )( int, int, int );
typedef void (* FGCBSpaceRotation )( int, int, int );
typedef void (* FGCBButtonBox )( int, int );
typedef void (* FGCBTabletMotion )( int, int );
typedef void (* FGCBTabletButton )( int, int, int, int );
-typedef void (* FGCBDestroy )( void );
+typedef void (* FGCBDestroy )( void ); /* Used for both window and menu destroy callbacks */
typedef void (* FGCBMultiEntry )( int, int );
typedef void (* FGCBMultiButton )( int, int, int, int, int );
typedef void (* FGCBMultiMotion )( int, int, int );
typedef void (* FGCBMultiPassive )( int, int, int );
+typedef void (* FGCBInitContext)();
+typedef void (* FGCBAppStatus)(int);
+
/* The global callbacks type definitions */
typedef void (* FGCBIdle )( void );
typedef void (* FGCBTimer )( int );
int ActiveMenus; /* Num. of currently active menus */
FGCBMenuState MenuStateCallback; /* Menu callbacks are global */
FGCBMenuStatus MenuStatusCallback;
+ void* MenuFont; /* Font to be used for newly created menus */
SFG_XYUse GameModeSize; /* Game mode screen's dimensions */
int GameModeDepth; /* The pixel depth for game mode */
fgExecutionState ExecState; /* Used for GLUT termination */
char *ProgramName; /* Name of the invoking program */
GLboolean JoysticksInitialised; /* Only initialize if application calls for them */
- int NumActiveJoysticks; /* Number of active joysticks -- if zero, don't poll joysticks */
+ int NumActiveJoysticks; /* Number of active joysticks (callback defined and positive pollrate) -- if zero, don't poll joysticks */
GLboolean InputDevsInitialised; /* Only initialize if application calls for them */
int MouseWheelTicks; /* Number of ticks the mouse wheel has turned */
SFG_PlatformContext pContext; /* The window's FBConfig (X11) or device context (Windows) */
int DoubleBuffered; /* Treat the window as double-buffered */
- GLint attribute_v_coord;
- GLint attribute_v_normal;
+
+ /* When drawing geometry to vertex attribute buffers, user specifies
+ * the attribute indices for vertices, normals and/or texture coords
+ * to freeglut. Those are stored here
+ */
+ GLint attribute_v_coord;
+ GLint attribute_v_normal;
+ GLint attribute_v_texture;
};
+/*
+ * Bitmasks indicating the different kinds of
+ * actions that can be scheduled for a window.
+ */
+#define GLUT_INIT_WORK (1<<0)
+#define GLUT_VISIBILITY_WORK (1<<1)
+#define GLUT_POSITION_WORK (1<<2)
+#define GLUT_SIZE_WORK (1<<3)
+#define GLUT_ZORDER_WORK (1<<4)
+#define GLUT_FULL_SCREEN_WORK (1<<5)
+#define GLUT_DISPLAY_WORK (1<<6)
+
+/*
+ * An enumeration containing the state of the GLUT execution:
+ * initializing, running, or stopping
+ */
+typedef enum
+{
+ DesireHiddenState,
+ DesireIconicState,
+ DesireNormalState
+} fgDesiredVisibility ;
+
+/*
+ * There is considerable confusion about the "right thing to
+ * do" concerning window size and position. GLUT itself is
+ * not consistent between Windows and UNIX/X11; since
+ * platform independence is a virtue for "freeglut", we
+ * decided to break with GLUT's behaviour.
+ *
+ * Under UNIX/X11, it is apparently not possible to get the
+ * window border sizes in order to subtract them off the
+ * window's initial position until some time after the window
+ * has been created. Therefore we decided on the following
+ * behaviour, both under Windows and under UNIX/X11:
+ * - When you create a window with position (x,y) and size
+ * (w,h), the upper left hand corner of the outside of the
+ * window is at (x,y) and the size of the drawable area is
+ * (w,h).
+ * - When you query the size and position of the window--as
+ * is happening here for Windows--"freeglut" will return
+ * the size of the drawable area--the (w,h) that you
+ * specified when you created the window--and the coordinates
+ * of the upper left hand corner of the drawable area, i.e.
+ * of the client rect--which is NOT the (x,y) you specified.
+ */
typedef struct tagSFG_WindowState SFG_WindowState;
-struct tagSFG_WindowState
+struct tagSFG_WindowState /* as per notes above, sizes always refer to the client area (thus without the window decorations) */
{
- /* Note that on Windows, sizes always refer to the client area, thus without the window decorations */
+ /* window state - size, position, look */
+ int Xpos; /* Window's top-left of client area, X-coordinate */
+ int Ypos; /* Window's top-left of client area, Y-coordinate */
int Width; /* Window's width in pixels */
int Height; /* The same about the height */
-
- SFG_PlatformWindowState pWState; /* Window width/height (X11) or rectangle/style (Windows) from before a resize */
-
- GLboolean Redisplay; /* Do we have to redisplay? */
- GLboolean Visible; /* Is the window visible now */
-
- int Cursor; /* The currently selected cursor */
+ GLboolean Visible; /* Is the window visible now? Not using fgVisibilityState as we only care if visible or not */
+ int Cursor; /* The currently selected cursor style */
+ GLboolean IsFullscreen; /* is the window fullscreen? */
+
+ /* FreeGLUT operations are deferred, that is, window moving, resizing,
+ * Z-order changing, making full screen or not do not happen immediately
+ * upon the user's request, but only in the next iteration of the main
+ * loop, before the display callback is called. This allows multiple
+ * reshape, position, etc requests to be combined into one and is
+ * compatible with the way GLUT does things. Callbacks get triggered
+ * based on the feedback/messages/notifications from the window manager.
+ * Below here we define what work should be done, as well as the relevant
+ * parameters for this work.
+ */
+ unsigned int WorkMask; /* work (resize, etc) to be done on the window */
+ int DesiredXpos; /* desired X location */
+ int DesiredYpos; /* desired Y location */
+ int DesiredWidth; /* desired window width */
+ int DesiredHeight; /* desired window height */
+ int DesiredZOrder; /* desired window Z Order position */
+ fgDesiredVisibility DesiredVisibility;/* desired visibility (hidden, iconic, shown/normal) */
+
+ SFG_PlatformWindowState pWState; /* Window width/height (X11) or rectangle/style (Windows) from before a resize, and other stuff only needed on specific platforms */
long JoystickPollRate; /* The joystick polling rate */
fg_time_t JoystickLastPoll; /* When the last poll happened */
int MouseX, MouseY; /* The most recent mouse position */
GLboolean IgnoreKeyRepeat; /* Whether to ignore key repeat. */
- GLboolean KeyRepeating; /* Currently in repeat mode */
-
- GLboolean NeedToResize; /* Do we need to resize the window? */
- GLboolean IsFullscreen; /* is the window fullscreen? */
+ GLboolean VisualizeNormals; /* When drawing objects, draw vectors representing the normals as well? */
};
do \
{ \
if( FETCH_WCB( window, cbname ) != (SFG_Proc)(func) ) \
- (((window).CallBacks[CB_ ## cbname]) = (SFG_Proc)(func)); \
+ (((window).CallBacks[WCB_ ## cbname]) = (SFG_Proc)(func)); \
} while( 0 )
/*
* type.
*/
#define FETCH_WCB(window,cbname) \
- ((window).CallBacks[CB_ ## cbname])
+ ((window).CallBacks[WCB_ ## cbname])
/*
* INVOKE_WCB() is used as:
* 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,
- CB_Reshape,
- CB_Keyboard,
- CB_KeyboardUp,
- CB_Special,
- CB_SpecialUp,
- CB_Mouse,
- CB_MouseWheel,
- CB_Motion,
- CB_Passive,
- CB_Entry,
- CB_Visibility,
- CB_WindowStatus,
- CB_Joystick,
- CB_Destroy,
-
- /* MPX-related */
- CB_MultiEntry,
- CB_MultiButton,
- CB_MultiMotion,
- CB_MultiPassive,
+ WCB_Display,
+ WCB_Reshape,
+ WCB_Position,
+ WCB_Keyboard,
+ WCB_KeyboardUp,
+ WCB_Special,
+ WCB_SpecialUp,
+ WCB_Mouse,
+ WCB_MouseWheel,
+ WCB_Motion,
+ WCB_Passive,
+ WCB_Entry,
+ WCB_Visibility,
+ WCB_WindowStatus,
+ WCB_Joystick,
+ WCB_Destroy,
+
+ /* Multi-Pointer X and touch related */
+ WCB_MultiEntry,
+ WCB_MultiButton,
+ WCB_MultiMotion,
+ WCB_MultiPassive,
+
+ /* Mobile platforms LifeCycle */
+ WCB_InitContext,
+ WCB_AppStatus,
/* Presently ignored */
- CB_Select,
- CB_OverlayDisplay,
- CB_SpaceMotion, /* presently implemented only on UNIX/X11 */
- CB_SpaceRotation, /* presently implemented only on UNIX/X11 */
- CB_SpaceButton, /* presently implemented only on UNIX/X11 */
- CB_Dials,
- CB_ButtonBox,
- CB_TabletMotion,
- CB_TabletButton,
+ WCB_Select,
+ WCB_OverlayDisplay,
+ WCB_SpaceMotion, /* presently implemented only on UNIX/X11 */
+ WCB_SpaceRotation, /* presently implemented only on UNIX/X11 */
+ WCB_SpaceButton, /* presently implemented only on UNIX/X11 */
+ WCB_Dials,
+ WCB_ButtonBox,
+ WCB_TabletMotion,
+ WCB_TabletButton,
/* Always make this the LAST one */
TOTAL_CALLBACKS
FGCBMenu Callback; /* The menu callback */
FGCBDestroy Destroy; /* Destruction callback */
GLboolean IsActive; /* Is the menu selected? */
+ void* Font; /* Font to be used for displaying this menu */
int Width; /* Menu box width in pixels */
int Height; /* Menu box height in pixels */
int X, Y; /* Menu box raster position */
SFG_Window* GameModeWindow; /* The game mode window */
- int WindowID; /* The new current window ID */
- int MenuID; /* The new current menu ID */
+ int WindowID; /* The window ID for the next window to be created */
+ int MenuID; /* The menu ID for the next menu to be created */
};
/*
GLboolean found; /* Used to terminate search */
void* data; /* Custom data pointer */
};
-typedef void (* FGCBenumerator )( SFG_Window *, SFG_Enumerator * );
+typedef void (* FGCBWindowEnumerator )( SFG_Window *, SFG_Enumerator * );
+typedef void (* FGCBMenuEnumerator )( SFG_Menu *, SFG_Enumerator * );
/* The bitmap font structure */
typedef struct tagSFG_Font SFG_Font;
* and userData is the a custom user-supplied pointer. Functions
* are defined and exported from freeglut_structure.c file.
*/
-void fgEnumWindows( FGCBenumerator enumCallback, SFG_Enumerator* enumerator );
-void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback,
+void fgEnumWindows( FGCBWindowEnumerator enumCallback, SFG_Enumerator* enumerator );
+void fgEnumSubWindows( SFG_Window* window, FGCBWindowEnumerator enumCallback,
SFG_Enumerator* enumerator );
/*
SFG_Menu* fgMenuByID( int menuID );
/*
+ * Returns active menu, if any. Assumption: only one menu active throughout application at any one time.
+ * This is easier than fgWindowByXXX as all menus are placed in one doubly linked list...
+ */
+SFG_Menu* fgGetActiveMenu( );
+
+/*
* The menu activation and deactivation the code. This is the meat
* of the menu user interface handling code...
*/