Well, a couple of days have gone by, so I assume that items (a) and (b)

in the freeglut_cursor.c file's "Open issues" comment are now satisfactor-
ily closed.

I also partially implemented some error-checking, using my limited
understanding of how Xlib users are supposed to do this.  (No one commented
about the lack of error-checking, pro or con.  Perhaps someone will care to
comment now?)

At present, it just will print out a warning, via fgWarning().  In part
because I'm not sure what is best to do, and in part because failure to
set the cursor type is probably not a fatal problem.


git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@327 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
rkrolib 2003-11-10 00:32:15 +00:00
parent 85e34f0062
commit fb26d91989

View File

@ -47,6 +47,35 @@
/* -- INTERNAL FUNCTIONS --------------------------------------------------- */ /* -- INTERNAL FUNCTIONS --------------------------------------------------- */
#if TARGET_HOST_UNIX_X11
fgGetCursorError( Cursor cursor )
{
int ret = 0;
char buf[ 256 ];
switch( cursor )
{
case BadAlloc:
case BadFont:
case BadMatch:
case BadPixmap:
case BadValue:
XGetErrorText( fgDisplay.Display, cursor, buf, sizeof buf );
fgWarning( "Error in setting cursor:\n %s.", buf );
ret = cursor;
break;
default:
/* no error */
break;
}
return ret;
}
#endif
/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ /* -- INTERFACE FUNCTIONS -------------------------------------------------- */
/* /*
@ -60,20 +89,19 @@ void FGAPIENTRY glutSetCursor( int cursorID )
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
/* /*
* Open issues: * Open issues:
* (X) GLUT_CURSOR_NONE doesn't do what it should. We can probably * (a) Partial error checking. Is that a problem?
* build an empty pixmap for it, though, quite painlessly. * Is fgGetCursorError() correct? Should we abort on errors?
* (X) Are we allocating resources, or causing X to do so? * Should there be a freeglut-wide X error handler? Should
* If yes, we should arrange to deallocate! * we use the X error-handler mechanism?
* (c) No error checking. Is that a problem? * (b) FULL_CROSSHAIR demotes to plain CROSSHAIR. Old GLUT allows
* (d) FULL_CROSSHAIR demotes to plain CROSSHAIR. Old GLUT allows
* for this, but if there is a system that easily supports a full- * for this, but if there is a system that easily supports a full-
* window (or full-screen) crosshair, we might consider it. * window (or full-screen) crosshair, we might consider it.
* (e) Out-of-range cursor-types are ignored. Should we abort? * (c) Out-of-range cursor-types generate warnings. Should we abort?
* Print a warning message?
*/ */
{ {
Cursor cursor; Cursor cursor;
Pixmap no_cursor; /* Used for GLUT_CURSOR_NONE */ Pixmap no_cursor; /* Used for GLUT_CURSOR_NONE */
int error = 0;
#define MAP_CURSOR(a,b) \ #define MAP_CURSOR(a,b) \
case a: \ case a: \
@ -107,6 +135,7 @@ void FGAPIENTRY glutSetCursor( int cursorID )
XC_bottom_right_corner); XC_bottom_right_corner);
MAP_CURSOR( GLUT_CURSOR_BOTTOM_LEFT_CORNER, XC_bottom_left_corner); MAP_CURSOR( GLUT_CURSOR_BOTTOM_LEFT_CORNER, XC_bottom_left_corner);
/* MAP_CURSOR( GLUT_CURSOR_NONE, XC_bogosity); */ /* MAP_CURSOR( GLUT_CURSOR_NONE, XC_bogosity); */
case GLUT_CURSOR_NONE: case GLUT_CURSOR_NONE:
{ {
static unsigned char no_cursor_bits[ 32 ]; static unsigned char no_cursor_bits[ 32 ];
@ -130,10 +159,14 @@ void FGAPIENTRY glutSetCursor( int cursorID )
case GLUT_CURSOR_INHERIT: case GLUT_CURSOR_INHERIT:
break; break;
default: default:
fgWarning( "Unknown cursor type: %d\n", cursorID );
return; return;
} }
error = fgGetCursorError( cursor );
if( GLUT_CURSOR_INHERIT == cursorID ) if( GLUT_CURSOR_INHERIT == cursorID )
XUndefineCursor( fgDisplay.Display, XUndefineCursor( fgDisplay.Display,
fgStructure.Window->Window.Handle ); fgStructure.Window->Window.Handle );