Updating the ChangeLog and TODO files in preparation for the upcoming release
[freeglut] / src / freeglut_cursor.c
index db033ed..d32ba5c 100644 (file)
@@ -41,8 +41,9 @@
  * apart from the windowing system version.
  */
 
-/* -- INTERNAL FUNCTIONS --------------------------------------------------- */
+/* -- PRIVATE FUNCTIONS --------------------------------------------------- */
 
+#if TARGET_HOST_UNIX_X11
 /*
  * A factory method for an empty cursor
  */
@@ -101,17 +102,15 @@ static cursorCacheEntry cursorCache[] = {
     { XC_bottom_right_corner, None }, /* GLUT_CURSOR_BOTTOM_RIGHT_CORNER */
     { XC_bottom_left_corner,  None }  /* GLUT_CURSOR_BOTTOM_LEFT_CORNER */
 };
+#endif
 
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+/* -- INTERNAL FUNCTIONS ---------------------------------------------------- */
 
 /*
  * Set the cursor image to be used for the current window
  */
-void FGAPIENTRY glutSetCursor( int cursorID )
+void fgSetCursor ( SFG_Window *window, int cursorID )
 {
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetCursor" );
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetCursor" );
-
 #if TARGET_HOST_UNIX_X11
     {
         Cursor cursor;
@@ -152,7 +151,7 @@ void FGAPIENTRY glutSetCursor( int cursorID )
             fgError( "Failed to create cursor" );
         }
         XDefineCursor( fgDisplay.Display,
-                       fgStructure.Window->Window.Handle, cursor );
+                       window->Window.Handle, cursor );
     }
 
 #elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE
@@ -164,7 +163,7 @@ void FGAPIENTRY glutSetCursor( int cursorID )
 #       define MAP_CURSOR(a,b)                                   \
         case a:                                                  \
             SetCursor( LoadCursor( NULL, b ) );                  \
-            SetClassLong( fgStructure.Window->Window.Handle,     \
+            SetClassLong( window->Window.Handle,                 \
                           GCL_HCURSOR,                           \
                           ( LONG )LoadCursor( NULL, b ) );       \
         break;
@@ -173,31 +172,56 @@ void FGAPIENTRY glutSetCursor( int cursorID )
 #       define ZAP_CURSOR(a,b)                                   \
         case a:                                                  \
             SetCursor( NULL );                                   \
-            SetClassLong( fgStructure.Window->Window.Handle,     \
+            SetClassLong( window->Window.Handle,                 \
                           GCL_HCURSOR, ( LONG )NULL );           \
         break;
 
     switch( cursorID )
     {
-        MAP_CURSOR( GLUT_CURSOR_RIGHT_ARROW, IDC_ARROW     );
-        MAP_CURSOR( GLUT_CURSOR_LEFT_ARROW,  IDC_ARROW     );
-        MAP_CURSOR( GLUT_CURSOR_INFO,        IDC_HELP      );
-        MAP_CURSOR( GLUT_CURSOR_DESTROY,     IDC_CROSS     );
-        MAP_CURSOR( GLUT_CURSOR_HELP,        IDC_HELP      );
-        MAP_CURSOR( GLUT_CURSOR_CYCLE,       IDC_SIZEALL   );
-        MAP_CURSOR( GLUT_CURSOR_SPRAY,       IDC_CROSS     );
-        MAP_CURSOR( GLUT_CURSOR_WAIT,        IDC_WAIT      );
-        MAP_CURSOR( GLUT_CURSOR_TEXT,        IDC_UPARROW   );
-        MAP_CURSOR( GLUT_CURSOR_CROSSHAIR,   IDC_CROSS     );
-        /* MAP_CURSOR( GLUT_CURSOR_NONE,        IDC_NO        ); */
-        ZAP_CURSOR( GLUT_CURSOR_NONE,        NULL           );
+        MAP_CURSOR( GLUT_CURSOR_RIGHT_ARROW,         IDC_ARROW     );
+        MAP_CURSOR( GLUT_CURSOR_LEFT_ARROW,          IDC_ARROW     );
+        MAP_CURSOR( GLUT_CURSOR_INFO,                IDC_HELP      );
+        MAP_CURSOR( GLUT_CURSOR_DESTROY,             IDC_CROSS     );
+        MAP_CURSOR( GLUT_CURSOR_HELP,                IDC_HELP      );
+        MAP_CURSOR( GLUT_CURSOR_CYCLE,               IDC_SIZEALL   );
+        MAP_CURSOR( GLUT_CURSOR_SPRAY,               IDC_CROSS     );
+        MAP_CURSOR( GLUT_CURSOR_WAIT,                IDC_WAIT      );
+        MAP_CURSOR( GLUT_CURSOR_TEXT,                IDC_IBEAM     );
+        MAP_CURSOR( GLUT_CURSOR_CROSSHAIR,           IDC_CROSS     );
+        MAP_CURSOR( GLUT_CURSOR_UP_DOWN,             IDC_SIZENS    );
+        MAP_CURSOR( GLUT_CURSOR_LEFT_RIGHT,          IDC_SIZEWE    );
+        MAP_CURSOR( GLUT_CURSOR_TOP_SIDE,            IDC_ARROW     ); /* XXX ToDo */
+        MAP_CURSOR( GLUT_CURSOR_BOTTOM_SIDE,         IDC_ARROW     ); /* XXX ToDo */
+        MAP_CURSOR( GLUT_CURSOR_LEFT_SIDE,           IDC_ARROW     ); /* XXX ToDo */
+        MAP_CURSOR( GLUT_CURSOR_RIGHT_SIDE,          IDC_ARROW     ); /* XXX ToDo */
+        MAP_CURSOR( GLUT_CURSOR_TOP_LEFT_CORNER,     IDC_SIZENWSE  );
+        MAP_CURSOR( GLUT_CURSOR_TOP_RIGHT_CORNER,    IDC_SIZENESW  );
+        MAP_CURSOR( GLUT_CURSOR_BOTTOM_RIGHT_CORNER, IDC_SIZENWSE  );
+        MAP_CURSOR( GLUT_CURSOR_BOTTOM_LEFT_CORNER,  IDC_SIZENESW  );
+        MAP_CURSOR( GLUT_CURSOR_INHERIT,             IDC_ARROW     ); /* XXX ToDo */
+        ZAP_CURSOR( GLUT_CURSOR_NONE,                NULL          );
+        MAP_CURSOR( GLUT_CURSOR_FULL_CROSSHAIR,      IDC_CROSS     ); /* XXX ToDo */
 
     default:
-        MAP_CURSOR( GLUT_CURSOR_UP_DOWN,     IDC_ARROW     );
+        fgError( "Unknown cursor type: %d", cursorID );
+        break;
     }
 #endif
 
-    fgStructure.Window->State.Cursor = cursorID;
+    window->State.Cursor = 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" );
+
+    fgSetCursor ( fgStructure.CurrentWindow, cursorID );
 }
 
 /*
@@ -213,7 +237,7 @@ void FGAPIENTRY glutWarpPointer( int x, int y )
     XWarpPointer(
         fgDisplay.Display,
         None,
-        fgStructure.Window->Window.Handle,
+        fgStructure.CurrentWindow->Window.Handle,
         0, 0, 0, 0,
         x, y
     );
@@ -228,7 +252,7 @@ void FGAPIENTRY glutWarpPointer( int x, int y )
         coords.y = y;
 
         /* ClientToScreen() translates {coords} for us. */
-        ClientToScreen( fgStructure.Window->Window.Handle, &coords );
+        ClientToScreen( fgStructure.CurrentWindow->Window.Handle, &coords );
         SetCursorPos( coords.x, coords.y );
     }