//============================================================================================= 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; } }
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; } }
/*! \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; }
/* * 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; }
/* * 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; }