Splitting the X11-specific "freeglut_cursor.c" code into its own file
authorJohn F. Fay <johnffay@nettally.com>
Sun, 5 Feb 2012 14:04:48 +0000 (14:04 +0000)
committerJohn F. Fay <johnffay@nettally.com>
Sun, 5 Feb 2012 14:04:48 +0000 (14:04 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1067 7f0cb862-5218-0410-a997-914c9d46530a

src/Common/freeglut_cursor.c
src/x11/freeglut_cursor_x11.c

index 140c0ea..3b144f3 100644 (file)
 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.pDisplay.Display,\r
-                                                   fgDisplay.pDisplay.RootWindow,\r
-                                                   cursorNoneBits, 16, 16 );\r
-        if( cursorNonePixmap != None ) {\r
-            cursorNone = XCreatePixmapCursor( fgDisplay.pDisplay.Display,\r
-                                              cursorNonePixmap, cursorNonePixmap,\r
-                                              &dontCare, &dontCare, 0, 0 );\r
-            XFreePixmap( fgDisplay.pDisplay.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
-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.pDisplay.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.pDisplay.Display, window->Window.Handle );\r
-    } else if ( cursor != None ) {\r
-        XDefineCursor( fgDisplay.pDisplay.Display, window->Window.Handle, cursor );\r
-    } else if ( cursorIDToUse != GLUT_CURSOR_NONE ) {\r
-        fgError( "Failed to create cursor" );\r
-    }\r
-}\r
-\r
-\r
-void fgPlatformWarpPointer ( int x, int y )\r
-{\r
-    XWarpPointer(\r
-        fgDisplay.pDisplay.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.pDisplay.Display );\r
-}\r
-#endif\r
 \r
 \r
 /* -- INTERNAL FUNCTIONS ---------------------------------------------------- */\r
index e69de29..420ec78 100644 (file)
@@ -0,0 +1,151 @@
+/*\r
+ * freeglut_cursor_x11.c\r
+ *\r
+ * The Windows-specific mouse cursor related stuff.\r
+ *\r
+ * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.\r
+ * Written by John F. Fay, <fayjf@sourceforge.net>\r
+ * Creation date: Sun Feb 5, 2012\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 "../Common/freeglut_internal.h"\r
+\r
+/* This code is for Posix/X11, Solaris, and OSX */\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.pDisplay.Display,\r
+                                                   fgDisplay.pDisplay.RootWindow,\r
+                                                   cursorNoneBits, 16, 16 );\r
+        if( cursorNonePixmap != None ) {\r
+            cursorNone = XCreatePixmapCursor( fgDisplay.pDisplay.Display,\r
+                                              cursorNonePixmap, cursorNonePixmap,\r
+                                              &dontCare, &dontCare, 0, 0 );\r
+            XFreePixmap( fgDisplay.pDisplay.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
+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.pDisplay.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.pDisplay.Display, window->Window.Handle );\r
+    } else if ( cursor != None ) {\r
+        XDefineCursor( fgDisplay.pDisplay.Display, window->Window.Handle, cursor );\r
+    } else if ( cursorIDToUse != GLUT_CURSOR_NONE ) {\r
+        fgError( "Failed to create cursor" );\r
+    }\r
+}\r
+\r
+\r
+void fgPlatformWarpPointer ( int x, int y )\r
+{\r
+    XWarpPointer(\r
+        fgDisplay.pDisplay.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.pDisplay.Display );\r
+}\r
+\r