Added all missing GLUT cursor types for X11.

(Type NONE is not properly supported, yet.)

Corrected behavior for the several old types:
 * Wrong glyphs.
 * Reversed glyphs (left/right confusion!)

There are some remaining imperfections, but it's a lot closer to
GLUT comformity, now.


git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@226 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
rkrolib 2003-10-12 09:36:54 +00:00
parent 0f0b50c51c
commit 1d59d1a43c

View File

@ -75,6 +75,13 @@ void FGAPIENTRY glutSetCursor( int cursorID )
freeglut_assert_ready; freeglut_assert_window; freeglut_assert_ready; freeglut_assert_window;
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
/*
* Open issues:
* (a) GLUT_CURSOR_NONE doesn't do what it should.
* (b) Are we allocating resources, or causing X to do so?
* If yes, we should arrange to deallocate!
* (c) No error checking. Is that a problem?
*/
{ {
Cursor cursor; Cursor cursor;
@ -82,28 +89,43 @@ void FGAPIENTRY glutSetCursor( int cursorID )
* For now we'll limit ourselves to the X cursor fonts... * For now we'll limit ourselves to the X cursor fonts...
*/ */
#define MAP_CURSOR(a,b) case a: cursor = XCreateFontCursor( fgDisplay.Display, b ); break; #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 ) switch( cursorID )
{ {
MAP_CURSOR( GLUT_CURSOR_RIGHT_ARROW, XC_left_ptr ); MAP_CURSOR( GLUT_CURSOR_RIGHT_ARROW, XC_right_ptr);
MAP_CURSOR( GLUT_CURSOR_LEFT_ARROW, XC_right_ptr ); MAP_CURSOR( GLUT_CURSOR_LEFT_ARROW, XC_left_ptr);
MAP_CURSOR( GLUT_CURSOR_INFO, XC_question_arrow ); MAP_CURSOR( GLUT_CURSOR_INFO, XC_hand1);
MAP_CURSOR( GLUT_CURSOR_DESTROY, XC_target ); MAP_CURSOR( GLUT_CURSOR_DESTROY, XC_pirate);
MAP_CURSOR( GLUT_CURSOR_HELP, XC_question_arrow); MAP_CURSOR( GLUT_CURSOR_HELP, XC_question_arrow);
MAP_CURSOR( GLUT_CURSOR_CYCLE, XC_circle ); MAP_CURSOR( GLUT_CURSOR_CYCLE, XC_exchange);
MAP_CURSOR( GLUT_CURSOR_SPRAY, XC_spraycan); MAP_CURSOR( GLUT_CURSOR_SPRAY, XC_spraycan);
MAP_CURSOR( GLUT_CURSOR_WAIT, XC_watch); MAP_CURSOR( GLUT_CURSOR_WAIT, XC_watch);
MAP_CURSOR( GLUT_CURSOR_TEXT, XC_draft_large ); MAP_CURSOR( GLUT_CURSOR_TEXT, XC_xterm);
MAP_CURSOR( GLUT_CURSOR_CROSSHAIR, XC_crosshair); MAP_CURSOR( GLUT_CURSOR_CROSSHAIR, XC_crosshair);
MAP_CURSOR( GLUT_CURSOR_NONE, XC_trek ); 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_INHERIT:
break;
default: default:
MAP_CURSOR( GLUT_CURSOR_UP_DOWN, XC_arrow ); return;
} }
/* /*
* Define a window's cursor now * Define a window's cursor now
*/ */
if( GLUT_CURSOR_INHERIT == cursorID )
XUndefineCursor( fgDisplay.Display, fgStructure.Window->Window.Handle );
else
XDefineCursor( fgDisplay.Display, fgStructure.Window->Window.Handle, cursor ); XDefineCursor( fgDisplay.Display, fgStructure.Window->Window.Handle, cursor );
} }