Example #1
0
//=============================================================================================
void eve::sys::set_cursor(eve::sys::Cursor p_cursorType)
{
	// Grab current window
	POINT point;
	::GetCursorPos(&point);
	HWND handle = ::WindowFromPoint(point);

	switch (p_cursorType)
	{
		MAP_CURSOR(cursor_None,				 NULL,			handle);
		MAP_CURSOR(cursor_Inherit,			 IDC_CROSS,		handle);
		MAP_CURSOR(cursor_Arrow,			 IDC_ARROW,		handle);
		MAP_CURSOR(cursor_Info,				 IDC_HELP,		handle);
		MAP_CURSOR(cursor_Wait,				 IDC_WAIT,		handle);
		MAP_CURSOR(cursor_Cross,			 IDC_CROSS,		handle);
		MAP_CURSOR(cursor_Text,				 IDC_IBEAM,		handle);
		MAP_CURSOR(cursor_UpDown,			 IDC_SIZENS,	handle);
		MAP_CURSOR(cursor_LeftRight,		 IDC_SIZEWE,	handle);
		MAP_CURSOR(cursor_CornerTopLeft,	 IDC_SIZENWSE,	handle);
		MAP_CURSOR(cursor_CornerTopRight,	 IDC_SIZENESW,	handle);
		MAP_CURSOR(cursor_CornerBottomLeft,  IDC_SIZENWSE,	handle);
		MAP_CURSOR(cursor_CornerBottomRight, IDC_SIZENESW,	handle);
		MAP_CURSOR(cursor_Cycle,			 IDC_SIZEALL,	handle);

	default:
		break;
	}
}
Example #2
0
static void fghSetCursor ( SFG_Window *window, int cursorID )
{
    /*
     * Joe Krahn is re-writing the following code.
     */
    /* Set the cursor AND change it for this window class. */
#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 );                                   \
            SetClassLongPtr( window->Window.Handle,              \
                          GCLP_HCURSOR, ( LONG )( LONG_PTR )NULL );          \
        break;
#endif

    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_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:
        fgError( "Unknown cursor type: %d", cursorID );
        break;
    }
}
Example #3
0
/*!
    \fn
    \brief    Set the cursor image to be used for the current window
    \ingroup  window
    \param    cursorID   Name of desired cursor.

              For the <i>current window</i>, sets the mouse-cursor to
              one of a set of predefined images.  The GLUT symbolic constant
              IDs are:

               - \a GLUT_CURSOR_RIGHT_ARROW
               - \a GLUT_CURSOR_LEFT_ARROW
               - \a GLUT_CURSOR_INFO
               - \a GLUT_CURSOR_DESTROY
               - \a GLUT_CURSOR_HELP
               - \a GLUT_CURSOR_CYCLE
               - \a GLUT_CURSOR_SPRAY
               - \a GLUT_CURSOR_WAIT
               - \a GLUT_CURSOR_TEXT
               - \a GLUT_CURSOR_CROSSHAIR
               - \a GLUT_CURSOR_UP_DOWN
               - \a GLUT_CURSOR_LEFT_RIGHT
               - \a GLUT_CURSOR_TOP_SIDE
               - \a GLUT_CURSOR_BOTTOM_SIDE
               - \a GLUT_CURSOR_LEFT_SIDE
               - \a GLUT_CURSOR_RIGHT_SIDE
               - \a GLUT_CURSOR_TOP_LEFT_CORNER
               - \a GLUT_CURSOR_TOP_RIGHT_CORNER
               - \a GLUT_CURSOR_BOTTOM_RIGHT_CORNER
               - \a GLUT_CURSOR_BOTTOM_LEFT_CORNER

              Additionally, there are the following special cases:

              \a GLUT_CURSOR_FULL_CROSSHAIR This cursor, where supported,
              draws a crosshair the full width and height of the display.
              It may be mapped by OpenGLUT to the \a GLUT_CURSOR_CROSSHAIR,
              however.

              \a GLUT_CURSOR_NONE Turn the mouse cursor invisibile.

              \a GLUT_CURSOR_INHERIT Take the cursor that the parent
              window provides.


    \note     The X branch of OpenGLUT does not do thorough error checking.
    \note     The X branch of OpenGLUT always converts \a FULL_CROSSHAIR
              to \a CROSSHAIR.
              This is acceptable, but if a host system supports a fullscreen
              crosshair, it would be nice to support that.
    \note     Out of range \a cursorID values generate warnings.
    \note     Has no visible effect if the <i>current window</i> is
              of type \a GLUT_OFFSCREEN .
    \bug      Some \a cursorID values are not yet supported on WIN32.
*/
void OGAPIENTRY glutSetCursor( int cursorID )
{
    int error = 0;
    freeglut_assert_ready;
    freeglut_assert_window;

    if( GL_FALSE == ogStructure.Window->State.IsOffscreen )
    {
#if TARGET_HOST_UNIX_X11
        Cursor cursor = None;
        Pixmap no_cursor = None ;  /* Used for GLUT_CURSOR_NONE */

#define MAP_CURSOR(a,b)                                     \
    case a:                                                 \
        cursor = XCreateFontCursor( ogDisplay.Display, b ); \
        break;

        if( GLUT_CURSOR_FULL_CROSSHAIR == cursorID )
            cursorID = GLUT_CURSOR_CROSSHAIR;

        switch( cursorID )
        {
            MAP_CURSOR( GLUT_CURSOR_RIGHT_ARROW, XC_right_ptr);
            MAP_CURSOR( GLUT_CURSOR_LEFT_ARROW,  XC_left_ptr);
            MAP_CURSOR( GLUT_CURSOR_INFO,        XC_hand1);
            MAP_CURSOR( GLUT_CURSOR_DESTROY,     XC_pirate);
            MAP_CURSOR( GLUT_CURSOR_HELP,        XC_question_arrow);
            MAP_CURSOR( GLUT_CURSOR_CYCLE,       XC_exchange);
            MAP_CURSOR( GLUT_CURSOR_SPRAY,       XC_spraycan);
            MAP_CURSOR( GLUT_CURSOR_WAIT,        XC_watch);
            MAP_CURSOR( GLUT_CURSOR_TEXT,        XC_xterm);
            MAP_CURSOR( GLUT_CURSOR_CROSSHAIR,   XC_crosshair);
            MAP_CURSOR( GLUT_CURSOR_UP_DOWN,     XC_sb_v_double_arrow);
            MAP_CURSOR( GLUT_CURSOR_LEFT_RIGHT,  XC_sb_h_double_arrow);
            MAP_CURSOR( GLUT_CURSOR_TOP_SIDE,    XC_top_side);
            MAP_CURSOR( GLUT_CURSOR_BOTTOM_SIDE, XC_bottom_side);
            MAP_CURSOR( GLUT_CURSOR_LEFT_SIDE,   XC_left_side);
            MAP_CURSOR( GLUT_CURSOR_RIGHT_SIDE,  XC_right_side);
            MAP_CURSOR( GLUT_CURSOR_TOP_LEFT_CORNER,     XC_top_left_corner);
            MAP_CURSOR( GLUT_CURSOR_TOP_RIGHT_CORNER,    XC_top_right_corner);
            MAP_CURSOR( GLUT_CURSOR_BOTTOM_RIGHT_CORNER,
                        XC_bottom_right_corner);
            MAP_CURSOR( GLUT_CURSOR_BOTTOM_LEFT_CORNER, XC_bottom_left_corner);
            /* MAP_CURSOR( GLUT_CURSOR_NONE,        XC_bogosity); */

        case GLUT_CURSOR_NONE:
        {
            /*
             * Note that we *never* change {no_cursor_bits} from anything
             * but all-zeros.  It is our image and mask.  We also apparently
             * need to pick a color for foreground/background---but what
             * one we pick doesn't matter for GLUT_CURSOR_NONE.
             */
            static char no_cursor_bits[ 32 ];
            XColor black;
            no_cursor = XCreatePixmapFromBitmapData( ogDisplay.Display,
                                                     ogDisplay.RootWindow,
                                                     no_cursor_bits,
                                                     16, 16,
                                                     1, 0, 1 );
            XParseColor( ogDisplay.Display,
                         DefaultColormap( ogDisplay.Display,
                                          DefaultScreen( ogDisplay.Display ) ),
                         "black",
                         &black );
            cursor = XCreatePixmapCursor( ogDisplay.Display,
                                          no_cursor, no_cursor,
                                          &black, &black,
                                          0, 0 );
            break;
        }

        case GLUT_CURSOR_INHERIT:
            break;

        default:
            ogWarning( "Unknown cursor type: %d", cursorID );
            return;
        }

        error = ogGetCursorError( cursor );

        if( GLUT_CURSOR_INHERIT == cursorID )
            XUndefineCursor( ogDisplay.Display,
                             ogStructure.Window->Window.Handle );
        else
        {
            XDefineCursor( ogDisplay.Display,
                           ogStructure.Window->Window.Handle, cursor );
            XFreeCursor( ogDisplay.Display, cursor );
            if( GLUT_CURSOR_NONE == cursorID )
                XFreePixmap( ogDisplay.Display, no_cursor );
        }

#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE

    /* This is a temporary solution only... */
    /* Set the cursor AND change it for this window class. */
#       define MAP_CURSOR(a,b)                                   \
        case a:                                                  \
            SetCursor( LoadCursor( NULL, b ) );                  \
            SetClassLong( ogStructure.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( ogStructure.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           );

        default:
            MAP_CURSOR( GLUT_CURSOR_UP_DOWN,     IDC_ARROW     );
        }
#endif
    }
    if( !error )
        ogStructure.Window->State.Cursor = cursorID;
}
Example #4
0
/*
 * Set the cursor image to be used for the current window
 */
void fgSetCursor ( SFG_Window *window, int cursorID )
{
#if TARGET_HOST_POSIX_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 == 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" );
        }
    }

#elif TARGET_HOST_MS_WINDOWS

    /*
     * Joe Krahn is re-writing the following code.
     */
    /* Set the cursor AND change it for this window class. */
#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 );                                   \
            SetClassLongPtr( window->Window.Handle,              \
                          GCLP_HCURSOR, ( LONG )( LONG_PTR )NULL );          \
        break;
#endif

    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_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:
        fgError( "Unknown cursor type: %d", cursorID );
        break;
    }
#endif

    window->State.Cursor = cursorID;
}
Example #5
0
/*
 * Set the cursor image to be used for the current window
 */
void FGAPIENTRY glutSetCursor( int cursorID )
{
    freeglut_assert_ready;  /* XXX WHY do we need the timer active for this? */
    freeglut_assert_window;

#if TARGET_HOST_UNIX_X11
    /*
     * Open issues:
     * (a) Partial error checking.  Is that a problem?
     *     Is fgGetCursorError() correct?  Should we abort on errors?
     *     Should there be a freeglut-wide X error handler?  Should
     *     we use the X error-handler mechanism?
     * (b) 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.
     * (c) Out-of-range cursor-types generate warnings.  Should we abort?
     */
    {
        Cursor cursor = None;
        Pixmap no_cursor = None ;  /* Used for GLUT_CURSOR_NONE */
        int error = 0;

#define MAP_CURSOR(a,b)                                     \
    case a:                                                 \
        cursor = XCreateFontCursor( fgDisplay.Display, b ); \
        break;

        if( GLUT_CURSOR_FULL_CROSSHAIR == cursorID )
            cursorID = GLUT_CURSOR_CROSSHAIR;

        switch( cursorID )
        {
            MAP_CURSOR( GLUT_CURSOR_RIGHT_ARROW, XC_right_ptr);
            MAP_CURSOR( GLUT_CURSOR_LEFT_ARROW,  XC_left_ptr);
            MAP_CURSOR( GLUT_CURSOR_INFO,        XC_hand1);
            MAP_CURSOR( GLUT_CURSOR_DESTROY,     XC_pirate);
            MAP_CURSOR( GLUT_CURSOR_HELP,        XC_question_arrow);
            MAP_CURSOR( GLUT_CURSOR_CYCLE,       XC_exchange);
            MAP_CURSOR( GLUT_CURSOR_SPRAY,       XC_spraycan);
            MAP_CURSOR( GLUT_CURSOR_WAIT,        XC_watch);
            MAP_CURSOR( GLUT_CURSOR_TEXT,        XC_xterm);
            MAP_CURSOR( GLUT_CURSOR_CROSSHAIR,   XC_crosshair);
            MAP_CURSOR( GLUT_CURSOR_UP_DOWN,     XC_sb_v_double_arrow);
            MAP_CURSOR( GLUT_CURSOR_LEFT_RIGHT,  XC_sb_h_double_arrow);
            MAP_CURSOR( GLUT_CURSOR_TOP_SIDE,    XC_top_side);
            MAP_CURSOR( GLUT_CURSOR_BOTTOM_SIDE, XC_bottom_side);
            MAP_CURSOR( GLUT_CURSOR_LEFT_SIDE,   XC_left_side);
            MAP_CURSOR( GLUT_CURSOR_RIGHT_SIDE,  XC_right_side);
            MAP_CURSOR( GLUT_CURSOR_TOP_LEFT_CORNER,     XC_top_left_corner);
            MAP_CURSOR( GLUT_CURSOR_TOP_RIGHT_CORNER,    XC_top_right_corner);
            MAP_CURSOR( GLUT_CURSOR_BOTTOM_RIGHT_CORNER,
                        XC_bottom_right_corner);
            MAP_CURSOR( GLUT_CURSOR_BOTTOM_LEFT_CORNER, XC_bottom_left_corner);
            /* MAP_CURSOR( GLUT_CURSOR_NONE,        XC_bogosity); */

        case GLUT_CURSOR_NONE:
        {
            /*
             * Note that we *never* change {no_cursor_bits} from anything
             * but all-zeros.  It is our image and mask.  We also apparently
             * need to pick a color for foreground/background---but what
             * one we pick doesn't matter for GLUT_CURSOR_NONE.
             */
            static char no_cursor_bits[ 32 ];
            XColor black;
            no_cursor = XCreatePixmapFromBitmapData( fgDisplay.Display,
                                                     fgDisplay.RootWindow,
                                                     no_cursor_bits,
                                                     16, 16,
                                                     1, 0, 1 );
            XParseColor( fgDisplay.Display,
                         DefaultColormap( fgDisplay.Display,
                                          DefaultScreen( fgDisplay.Display ) ),
                         "black",
                         &black );
            cursor = XCreatePixmapCursor( fgDisplay.Display,
                                          no_cursor, no_cursor,
                                          &black, &black,
                                          0, 0 );
            break;
        }

        case GLUT_CURSOR_INHERIT:
            break;

        default:
            fgWarning( "Unknown cursor type: %d\n", cursorID );
            return;
        }

        error = fgGetCursorError( cursor );

        if( GLUT_CURSOR_INHERIT == cursorID )
            XUndefineCursor( fgDisplay.Display,
                             fgStructure.Window->Window.Handle );
        else
        {
            XDefineCursor( fgDisplay.Display,
                           fgStructure.Window->Window.Handle, cursor );
            XFreeCursor( fgDisplay.Display, cursor );
            if( GLUT_CURSOR_NONE == cursorID )
                XFreePixmap( fgDisplay.Display, no_cursor );
        }
    }

#elif TARGET_HOST_WIN32 || TARGET_HOST_WINCE

    /*
     * This is a temporary solution only...
     */
    /* Set the cursor AND change it for this window class. */
#       define MAP_CURSOR(a,b)                                   \
        case a:                                                  \
            SetCursor( LoadCursor( NULL, b ) );                  \
            SetClassLong( fgStructure.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( fgStructure.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           );

    default:
        MAP_CURSOR( GLUT_CURSOR_UP_DOWN,     IDC_ARROW     );
    }
#endif

    fgStructure.Window->State.Cursor = cursorID;
}