# 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
+# if defined(FREEGLUT_WAYLAND)
+# define TARGET_HOST_POSIX_WAYLAND 1
+# else
+# define TARGET_HOST_POSIX_X11 1
+# endif
#elif defined(__APPLE__)
/* This is a placeholder until we get native OSX support ironed out -- JFF 11/18/09 */
#endif
#ifndef TARGET_HOST_MS_WINDOWS
-# define TARGET_HOST_MS_WINDOWS 0
+# 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_WAYLAND
+# define TARGET_HOST_POSIX_WAYLAND 0
#endif
#ifndef TARGET_HOST_POSIX_X11
-# define TARGET_HOST_POSIX_X11 0
+# define TARGET_HOST_POSIX_X11 0
#endif
#ifndef TARGET_HOST_MAC_OSX
-# define TARGET_HOST_MAC_OSX 0
+# define TARGET_HOST_MAC_OSX 0
#endif
#ifndef TARGET_HOST_SOLARIS
-# define TARGET_HOST_SOLARIS 0
+# define TARGET_HOST_SOLARIS 0
#endif
/* -- FIXED CONFIGURATION LIMITS ------------------------------------------- */
-#define FREEGLUT_MAX_MENUS 3
+#define FREEGLUT_MAX_MENUS 3
/* These files should be available on every platform. */
#include <stdio.h>
#endif
/* Platform-specific includes */
+#if TARGET_HOST_POSIX_WAYLAND
+#include "wayland/fg_internal_wl.h"
+#endif
#if TARGET_HOST_POSIX_X11
#include "x11/fg_internal_x11.h"
#endif
#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 (* FGCBMultiPassive )( int, int, int );
typedef void (* FGCBInitContext)();
-typedef void (* FGCBPause)();
-typedef void (* FGCBResume)();
+typedef void (* FGCBAppStatus)(int);
/* The global callbacks type definitions */
typedef void (* FGCBIdle )( void );
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 */
GLboolean SkipStaleMotion; /* skip stale motion events */
+ GLboolean StrokeFontDrawJoinDots;/* Draw dots between line segments of stroke fonts? */
+ GLboolean AllowNegativeWindowPosition; /* GLUT, by default, doesn't allow negative window positions. Enable it? */
+
int MajorVersion; /* Major OpenGL context version */
int MinorVersion; /* Minor OpenGL context version */
int ContextFlags; /* OpenGL context flags */
FGWarning WarningFunc; /* User defined warning handler */
};
-/* The structure used by display initialization in freeglut_init.c */
+/* The structure used by display initialization in fg_init.c */
typedef struct tagSFG_Display SFG_Display;
struct tagSFG_Display
{
/*
* A window and its OpenGL context. The contents of this structure
- * are highly dependant on the target operating system we aim at...
+ * are highly dependent on the target operating system we aim at...
*/
typedef struct tagSFG_Context SFG_Context;
struct tagSFG_Context
SFG_PlatformContext pContext; /* The window's FBConfig (X11) or device context (Windows) */
int DoubleBuffered; /* Treat the window as double-buffered */
+
+ /* 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 NeedToInitContext; /* are OpenGL context/resources loaded? */
GLboolean VisualizeNormals; /* When drawing objects, draw vectors representing the normals as well? */
};
{
WCB_Display,
WCB_Reshape,
+ WCB_Position,
WCB_Keyboard,
WCB_KeyboardUp,
WCB_Special,
/* Mobile platforms LifeCycle */
WCB_InitContext,
- WCB_Pause,
- WCB_Resume,
+ WCB_AppStatus,
/* Presently ignored */
WCB_Select,
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 */
};
/*
/* -- JOYSTICK-SPECIFIC STRUCTURES AND TYPES ------------------------------- */
/*
- * Initial defines from "js.h" starting around line 33 with the existing "freeglut_joystick.c"
+ * Initial defines from "js.h" starting around line 33 with the existing "fg_joystick.c"
* interspersed
*/
}
/*
- * Following definitions are somewhat similiar to GLib's,
+ * Following definitions are somewhat similar to GLib's,
* but do not generate any log messages:
*/
#define freeglut_return_if_fail( expr ) \
/*
* Window creation, opening, closing and destruction.
* Also CallBack clearing/initialization.
- * Defined in freeglut_structure.c, freeglut_window.c.
+ * Defined in fg_structure.c, fg_window.c.
*/
SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title,
GLboolean positionUse, int x, int y,
void fgCloseWindows ();
void fgDestroyWindow( SFG_Window* window );
-/* Menu creation and destruction. Defined in freeglut_structure.c */
+/* Menu creation and destruction. Defined in fg_structure.c */
SFG_Menu* fgCreateMenu( FGCBMenu menuCallback );
void fgDestroyMenu( SFG_Menu* menu );
-/* Joystick device management functions, defined in freeglut_joystick.c */
+/* Joystick device management functions, defined in fg_joystick.c */
int fgJoystickDetect( void );
void fgInitialiseJoysticks( void );
void fgJoystickClose( void );
void fgInitialiseInputDevices( void );
void fgInputDeviceClose( void );
-/* spaceball device functions, defined in freeglut_spaceball.c */
+/* spaceball device functions, defined in fg_spaceball.c */
void fgInitialiseSpaceball( void );
void fgSpaceballClose( void );
void fgSpaceballSetWindow( SFG_Window *window );
*
* where window is the enumerated (sub)window pointer (SFG_Window *),
* and userData is the a custom user-supplied pointer. Functions
- * are defined and exported from freeglut_structure.c file.
+ * are defined and exported from fg_structure.c file.
*/
void fgEnumWindows( FGCBWindowEnumerator enumCallback, SFG_Enumerator* enumerator );
void fgEnumSubWindows( SFG_Window* window, FGCBWindowEnumerator enumCallback,
/*
* fgWindowByHandle returns a (SFG_Window *) value pointing to the
* first window in the queue matching the specified window handle.
- * The function is defined in freeglut_structure.c file.
+ * The function is defined in fg_structure.c file.
*/
SFG_Window* fgWindowByHandle( SFG_WindowHandleType hWindow );
/*
- * This function is similiar to the previous one, except it is
+ * This function is similar to the previous one, except it is
* looking for a specified (sub)window identifier. The function
- * is defined in freeglut_structure.c file.
+ * is defined in fg_structure.c file.
*/
SFG_Window* fgWindowByID( int windowID );
/*
* This function gets called just before the buffers swap, so that
* freeglut can display the pull-down menus via OpenGL. The function
- * is defined in freeglut_menu.c file.
+ * is defined in fg_menu.c file.
*/
void fgDisplayMenu( void );