-/*\r
- * freeglut_cursor.c\r
- *\r
- * The mouse cursor related stuff.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Thu Dec 16 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-/*\r
- * TODO BEFORE THE STABLE RELEASE:\r
- * glutSetCursor() -- Win32 mappings are incomplete.\r
- *\r
- * It would be good to use custom mouse cursor shapes, and introduce\r
- * an option to display them using glBitmap() and/or texture mapping,\r
- * apart from the windowing system version.\r
- */\r
-\r
-/* -- PRIVATE FUNCTIONS --------------------------------------------------- */\r
-\r
-extern void fgPlatformSetCursor ( SFG_Window *window, int cursorID );\r
-extern void fgPlatformWarpPointer ( int x, int y );\r
-\r
-#if TARGET_HOST_POSIX_X11 || TARGET_HOST_MAC_OSX || TARGET_HOST_SOLARIS\r
- #include <X11/cursorfont.h>\r
-\r
-/*\r
- * A factory method for an empty cursor\r
- */\r
-static Cursor getEmptyCursor( void )\r
-{\r
- static Cursor cursorNone = None;\r
- if( cursorNone == None ) {\r
- char cursorNoneBits[ 32 ];\r
- XColor dontCare;\r
- Pixmap cursorNonePixmap;\r
- memset( cursorNoneBits, 0, sizeof( cursorNoneBits ) );\r
- memset( &dontCare, 0, sizeof( dontCare ) );\r
- cursorNonePixmap = XCreateBitmapFromData ( fgDisplay.Display,\r
- fgDisplay.RootWindow,\r
- cursorNoneBits, 16, 16 );\r
- if( cursorNonePixmap != None ) {\r
- cursorNone = XCreatePixmapCursor( fgDisplay.Display,\r
- cursorNonePixmap, cursorNonePixmap,\r
- &dontCare, &dontCare, 0, 0 );\r
- XFreePixmap( fgDisplay.Display, cursorNonePixmap );\r
- }\r
- }\r
- return cursorNone;\r
-}\r
-\r
-typedef struct tag_cursorCacheEntry cursorCacheEntry;\r
-struct tag_cursorCacheEntry {\r
- unsigned int cursorShape; /* an XC_foo value */\r
- Cursor cachedCursor; /* None if the corresponding cursor has\r
- not been created yet */\r
-};\r
-\r
-/*\r
- * Note: The arrangement of the table below depends on the fact that\r
- * the "normal" GLUT_CURSOR_* values start a 0 and are consecutive.\r
- */ \r
-static cursorCacheEntry cursorCache[] = {\r
- { XC_arrow, None }, /* GLUT_CURSOR_RIGHT_ARROW */\r
- { XC_top_left_arrow, None }, /* GLUT_CURSOR_LEFT_ARROW */\r
- { XC_hand1, None }, /* GLUT_CURSOR_INFO */\r
- { XC_pirate, None }, /* GLUT_CURSOR_DESTROY */\r
- { XC_question_arrow, None }, /* GLUT_CURSOR_HELP */\r
- { XC_exchange, None }, /* GLUT_CURSOR_CYCLE */\r
- { XC_spraycan, None }, /* GLUT_CURSOR_SPRAY */\r
- { XC_watch, None }, /* GLUT_CURSOR_WAIT */\r
- { XC_xterm, None }, /* GLUT_CURSOR_TEXT */\r
- { XC_crosshair, None }, /* GLUT_CURSOR_CROSSHAIR */\r
- { XC_sb_v_double_arrow, None }, /* GLUT_CURSOR_UP_DOWN */\r
- { XC_sb_h_double_arrow, None }, /* GLUT_CURSOR_LEFT_RIGHT */\r
- { XC_top_side, None }, /* GLUT_CURSOR_TOP_SIDE */\r
- { XC_bottom_side, None }, /* GLUT_CURSOR_BOTTOM_SIDE */\r
- { XC_left_side, None }, /* GLUT_CURSOR_LEFT_SIDE */\r
- { XC_right_side, None }, /* GLUT_CURSOR_RIGHT_SIDE */\r
- { XC_top_left_corner, None }, /* GLUT_CURSOR_TOP_LEFT_CORNER */\r
- { XC_top_right_corner, None }, /* GLUT_CURSOR_TOP_RIGHT_CORNER */\r
- { XC_bottom_right_corner, None }, /* GLUT_CURSOR_BOTTOM_RIGHT_CORNER */\r
- { XC_bottom_left_corner, None } /* GLUT_CURSOR_BOTTOM_LEFT_CORNER */\r
-};\r
-\r
-static void fgPlatformSetCursor ( SFG_Window *window, int cursorID )\r
-{\r
- Cursor cursor;\r
- /*\r
- * XXX FULL_CROSSHAIR demotes to plain CROSSHAIR. Old GLUT allows\r
- * for this, but if there is a system that easily supports a full-\r
- * window (or full-screen) crosshair, we might consider it.\r
- */\r
- int cursorIDToUse =\r
- ( cursorID == GLUT_CURSOR_FULL_CROSSHAIR ) ? GLUT_CURSOR_CROSSHAIR : cursorID;\r
-\r
- if( ( cursorIDToUse >= 0 ) &&\r
- ( cursorIDToUse < sizeof( cursorCache ) / sizeof( cursorCache[0] ) ) ) {\r
- cursorCacheEntry *entry = &cursorCache[ cursorIDToUse ];\r
- if( entry->cachedCursor == None ) {\r
- entry->cachedCursor =\r
- XCreateFontCursor( fgDisplay.Display, entry->cursorShape );\r
- }\r
- cursor = entry->cachedCursor;\r
- } else {\r
- switch( cursorIDToUse )\r
- {\r
- case GLUT_CURSOR_NONE:\r
- cursor = getEmptyCursor( );\r
- break;\r
-\r
- case GLUT_CURSOR_INHERIT:\r
- cursor = None;\r
- break;\r
-\r
- default:\r
- fgError( "Unknown cursor type: %d", cursorIDToUse );\r
- return;\r
- }\r
- }\r
-\r
- if ( cursorIDToUse == GLUT_CURSOR_INHERIT ) {\r
- XUndefineCursor( fgDisplay.Display, window->Window.Handle );\r
- } else if ( cursor != None ) {\r
- XDefineCursor( fgDisplay.Display, window->Window.Handle, cursor );\r
- } else if ( cursorIDToUse != GLUT_CURSOR_NONE ) {\r
- fgError( "Failed to create cursor" );\r
- }\r
-}\r
-\r
-\r
-static void fgPlatformWarpPointer ( int x, int y )\r
-{\r
- XWarpPointer(\r
- fgDisplay.Display,\r
- None,\r
- fgStructure.CurrentWindow->Window.Handle,\r
- 0, 0, 0, 0,\r
- x, y\r
- );\r
- /* Make the warp visible immediately. */\r
- XFlush( fgDisplay.Display );\r
-}\r
-#endif\r
-\r
-\r
-/* -- INTERNAL FUNCTIONS ---------------------------------------------------- */\r
-void fgSetCursor ( SFG_Window *window, int cursorID )\r
-{\r
- fgPlatformSetCursor ( window, cursorID );\r
-}\r
-\r
-\r
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */\r
-\r
-/*\r
- * Set the cursor image to be used for the current window\r
- */\r
-void FGAPIENTRY glutSetCursor( int cursorID )\r
-{\r
- FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetCursor" );\r
- FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetCursor" );\r
-\r
- fgPlatformSetCursor ( fgStructure.CurrentWindow, cursorID );\r
- fgStructure.CurrentWindow->State.Cursor = cursorID;\r
-}\r
-\r
-/*\r
- * Moves the mouse pointer to given window coordinates\r
- */\r
-void FGAPIENTRY glutWarpPointer( int x, int y )\r
-{\r
- FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWarpPointer" );\r
- FREEGLUT_EXIT_IF_NO_WINDOW ( "glutWarpPointer" );\r
-\r
- fgPlatformWarpPointer ( x, y );\r
-}\r
-\r
-/*** END OF FILE ***/\r
+/*
+ * freeglut_cursor.c
+ *
+ * The mouse cursor related stuff.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Thu Dec 16 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+/*
+ * TODO BEFORE THE STABLE RELEASE:
+ * glutSetCursor() -- Win32 mappings are incomplete.
+ *
+ * It would be good to use custom mouse cursor shapes, and introduce
+ * an option to display them using glBitmap() and/or texture mapping,
+ * apart from the windowing system version.
+ */
+
+/* -- PRIVATE FUNCTIONS --------------------------------------------------- */
+
+extern void fgPlatformSetCursor ( SFG_Window *window, int cursorID );
+extern void fgPlatformWarpPointer ( int x, int y );
+
+
+
+/* -- INTERNAL FUNCTIONS ---------------------------------------------------- */
+void fgSetCursor ( SFG_Window *window, int cursorID )
+{
+ fgPlatformSetCursor ( 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" );
+
+ fgPlatformSetCursor ( fgStructure.CurrentWindow, cursorID );
+ fgStructure.CurrentWindow->State.Cursor = cursorID;
+}
+
+/*
+ * Moves the mouse pointer to given window coordinates
+ */
+void FGAPIENTRY glutWarpPointer( int x, int y )
+{
+ FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWarpPointer" );
+ FREEGLUT_EXIT_IF_NO_WINDOW ( "glutWarpPointer" );
+
+ fgPlatformWarpPointer ( x, y );
+}
+
+/*** END OF FILE ***/