#include <GL/freeglut.h>
#include "freeglut_internal.h"
-#if TARGET_HOST_UNIX_X11
- #include <X11/cursorfont.h>
-#endif
-
/*
* TODO BEFORE THE STABLE RELEASE:
* glutSetCursor() -- Win32 mappings are incomplete.
* apart from the windowing system version.
*/
-/* -- INTERNAL FUNCTIONS --------------------------------------------------- */
+/* -- PRIVATE FUNCTIONS --------------------------------------------------- */
+
+#if TARGET_HOST_POSIX_X11 || TARGET_HOST_MAC_OSX || TARGET_HOST_SOLARIS
+ #include <X11/cursorfont.h>
-#if TARGET_HOST_UNIX_X11
/*
* A factory method for an empty cursor
*/
{ XC_bottom_right_corner, None }, /* GLUT_CURSOR_BOTTOM_RIGHT_CORNER */
{ XC_bottom_left_corner, None } /* GLUT_CURSOR_BOTTOM_LEFT_CORNER */
};
-#endif
-
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
-/*
- * Set the cursor image to be used for the current window
- */
-void FGAPIENTRY glutSetCursor( int cursorID )
+static void fghSetCursor ( SFG_Window *window, int cursorID )
{
- FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetCursor" );
- FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetCursor" );
+ Cursor cursor;
+ /*
+ * XXX FULL_CROSSHAIR demotes to plain CROSSHAIR. Old GLUT allows
+ * for this, but if there is a system that easily supports a full-
+ * window (or full-screen) crosshair, we might consider it.
+ */
+ int cursorIDToUse =
+ ( cursorID == GLUT_CURSOR_FULL_CROSSHAIR ) ? GLUT_CURSOR_CROSSHAIR : cursorID;
-#if TARGET_HOST_UNIX_X11
- {
- Cursor cursor;
- /*
- * XXX FULL_CROSSHAIR demotes to plain CROSSHAIR. Old GLUT allows
- * for this, but if there is a system that easily supports a full-
- * window (or full-screen) crosshair, we might consider it.
- */
- int cursorIDToUse =
- ( cursorID == GLUT_CURSOR_FULL_CROSSHAIR ) ? GLUT_CURSOR_CROSSHAIR : cursorID;
-
- if( ( cursorIDToUse >= 0 ) &&
- ( cursorIDToUse < sizeof( cursorCache ) / sizeof( cursorCache[0] ) ) ) {
- cursorCacheEntry *entry = &cursorCache[ cursorIDToUse ];
- if( entry->cachedCursor == None ) {
- entry->cachedCursor =
- XCreateFontCursor( fgDisplay.Display, entry->cursorShape );
- }
- cursor = entry->cachedCursor;
- } else {
- switch( cursorIDToUse )
- {
- case GLUT_CURSOR_NONE:
- cursor = getEmptyCursor( );
- break;
-
- case GLUT_CURSOR_INHERIT:
- cursor = None;
- break;
-
- default:
- fgError( "Unknown cursor type: %d", cursorIDToUse );
- return;
- }
+ if( ( cursorIDToUse >= 0 ) &&
+ ( cursorIDToUse < sizeof( cursorCache ) / sizeof( cursorCache[0] ) ) ) {
+ cursorCacheEntry *entry = &cursorCache[ cursorIDToUse ];
+ if( entry->cachedCursor == None ) {
+ entry->cachedCursor =
+ XCreateFontCursor( fgDisplay.Display, entry->cursorShape );
}
+ cursor = entry->cachedCursor;
+ } else {
+ switch( cursorIDToUse )
+ {
+ case GLUT_CURSOR_NONE:
+ cursor = getEmptyCursor( );
+ break;
+
+ case GLUT_CURSOR_INHERIT:
+ cursor = None;
+ break;
- if ( ( cursorIDToUse != GLUT_CURSOR_NONE ) && ( cursor == None ) ) {
- fgError( "Failed to create cursor" );
+ default:
+ fgError( "Unknown cursor type: %d", cursorIDToUse );
+ return;
}
- XDefineCursor( fgDisplay.Display,
- fgStructure.CurrentWindow->Window.Handle, cursor );
}
-#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
+ if ( cursorIDToUse == GLUT_CURSOR_INHERIT ) {
+ XUndefineCursor( fgDisplay.Display, window->Window.Handle );
+ } else if ( cursor != None ) {
+ XDefineCursor( fgDisplay.Display, window->Window.Handle, cursor );
+ } else if ( cursorIDToUse != GLUT_CURSOR_NONE ) {
+ fgError( "Failed to create cursor" );
+ }
+}
+
+
+static void fghWarpPointer ( int x, int y )
+{
+ XWarpPointer(
+ fgDisplay.Display,
+ None,
+ fgStructure.CurrentWindow->Window.Handle,
+ 0, 0, 0, 0,
+ x, y
+ );
+ /* Make the warp visible immediately. */
+ XFlush( fgDisplay.Display );
+}
+#endif
+
+#if TARGET_HOST_MS_WINDOWS
+static void fghSetCursor ( SFG_Window *window, int cursorID )
+{
/*
- * This is a temporary solution only...
+ * Joe Krahn is re-writing the following code.
*/
/* Set the cursor AND change it for this window class. */
-# define MAP_CURSOR(a,b) \
- case a: \
- SetCursor( LoadCursor( NULL, b ) ); \
- SetClassLong( fgStructure.CurrentWindow->Window.Handle, \
- GCL_HCURSOR, \
- ( LONG )LoadCursor( NULL, b ) ); \
+#if !defined(__MINGW64__) && _MSC_VER <= 1200
+# define MAP_CURSOR(a,b) \
+ case a: \
+ SetCursor( LoadCursor( NULL, b ) ); \
+ SetClassLong( window->Window.Handle, \
+ GCL_HCURSOR, \
+ ( LONG )LoadCursor( NULL, b ) ); \
+ break;
+ /* Nuke the cursor AND change it for this window class. */
+# define ZAP_CURSOR(a,b) \
+ case a: \
+ SetCursor( NULL ); \
+ SetClassLong( window->Window.Handle, \
+ GCL_HCURSOR, ( LONG )NULL ); \
+ break;
+#else
+# define MAP_CURSOR(a,b) \
+ case a: \
+ SetCursor( LoadCursor( NULL, b ) ); \
+ SetClassLongPtr( window->Window.Handle, \
+ GCLP_HCURSOR, \
+ ( LONG )( LONG_PTR )LoadCursor( NULL, b ) ); \
break;
-
/* Nuke the cursor AND change it for this window class. */
-# define ZAP_CURSOR(a,b) \
- case a: \
- SetCursor( NULL ); \
- SetClassLong( fgStructure.CurrentWindow->Window.Handle, \
- GCL_HCURSOR, ( LONG )NULL ); \
+# define ZAP_CURSOR(a,b) \
+ case a: \
+ SetCursor( NULL ); \
+ SetClassLongPtr( window->Window.Handle, \
+ GCLP_HCURSOR, ( LONG )( LONG_PTR )NULL ); \
break;
+#endif
switch( cursorID )
{
fgError( "Unknown cursor type: %d", cursorID );
break;
}
+}
+
+
+static void fghWarpPointer ( int x, int y )
+{
+ POINT coords;
+ coords.x = x;
+ coords.y = y;
+
+ /* ClientToScreen() translates {coords} for us. */
+ ClientToScreen( fgStructure.CurrentWindow->Window.Handle, &coords );
+ SetCursorPos( coords.x, coords.y );
+}
#endif
+
+/* -- INTERNAL FUNCTIONS ---------------------------------------------------- */
+void fgSetCursor ( SFG_Window *window, int cursorID )
+{
+ fghSetCursor ( window, cursorID );
+}
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Set the cursor image to be used for the current window
+ */
+void FGAPIENTRY glutSetCursor( int cursorID )
+{
+ FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetCursor" );
+ FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetCursor" );
+
+ fghSetCursor ( fgStructure.CurrentWindow, cursorID );
fgStructure.CurrentWindow->State.Cursor = cursorID;
}
FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWarpPointer" );
FREEGLUT_EXIT_IF_NO_WINDOW ( "glutWarpPointer" );
-#if TARGET_HOST_UNIX_X11
-
- XWarpPointer(
- fgDisplay.Display,
- None,
- fgStructure.CurrentWindow->Window.Handle,
- 0, 0, 0, 0,
- x, y
- );
- /* Make the warp visible immediately. */
- XFlush( fgDisplay.Display );
-
-#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
-
- {
- POINT coords;
- coords.x = x;
- coords.y = y;
-
- /* ClientToScreen() translates {coords} for us. */
- ClientToScreen( fgStructure.CurrentWindow->Window.Handle, &coords );
- SetCursorPos( coords.x, coords.y );
- }
-
-#endif
+ fghWarpPointer ( x, y );
}
/*** END OF FILE ***/