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:
parent
85e34f0062
commit
fb26d91989
@ -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 );
|
||||||
|
Reference in New Issue
Block a user