X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffreeglut_cursor.c;h=23839a5d51b31487576d20f0424242e90acb5cfd;hb=65e03872c287ab34ae76bd1831a3786d5e986b72;hp=0d6d1efbf176a6ec33ed135f604cc8215b70ab4d;hpb=ef6d30a645edad1c28b821ca7e6c6796f555ce23;p=freeglut diff --git a/src/freeglut_cursor.c b/src/freeglut_cursor.c index 0d6d1ef..23839a5 100644 --- a/src/freeglut_cursor.c +++ b/src/freeglut_cursor.c @@ -29,7 +29,7 @@ #include "config.h" #endif -#include "../include/GL/freeglut.h" +#include #include "freeglut_internal.h" #if TARGET_HOST_UNIX_X11 @@ -47,6 +47,35 @@ /* -- INTERNAL FUNCTIONS --------------------------------------------------- */ +#if TARGET_HOST_UNIX_X11 + +int 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 -------------------------------------------------- */ /* @@ -60,20 +89,19 @@ void FGAPIENTRY glutSetCursor( int cursorID ) #if TARGET_HOST_UNIX_X11 /* * Open issues: - * (X) GLUT_CURSOR_NONE doesn't do what it should. We can probably - * build an empty pixmap for it, though, quite painlessly. - * (X) 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? - * (d) FULL_CROSSHAIR demotes to plain CROSSHAIR. Old GLUT allows + * (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. - * (e) Out-of-range cursor-types are ignored. Should we abort? - * Print a warning message? + * (c) Out-of-range cursor-types generate warnings. Should we abort? */ { - Cursor cursor; - Pixmap no_cursor; /* Used for GLUT_CURSOR_NONE */ + Cursor cursor = None; + Pixmap no_cursor = None ; /* Used for GLUT_CURSOR_NONE */ + int error = 0; #define MAP_CURSOR(a,b) \ case a: \ @@ -107,8 +135,15 @@ void FGAPIENTRY glutSetCursor( int cursorID ) 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 unsigned char no_cursor_bits[ 32 ]; XColor black; no_cursor = XCreatePixmapFromBitmapData( fgDisplay.Display, @@ -130,10 +165,14 @@ void FGAPIENTRY glutSetCursor( int cursorID ) 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 ); @@ -161,7 +200,7 @@ void FGAPIENTRY glutSetCursor( int cursorID ) ( LONG )LoadCursor( NULL, b ) ); \ break; - /* Nuke the cursor AND change it for this window class. */ + /* Nuke the cursor AND change it for this window class. */ # define ZAP_CURSOR(a,b) \ case a: \ SetCursor( NULL ); \ @@ -169,27 +208,27 @@ void FGAPIENTRY glutSetCursor( int cursorID ) 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 ); - } + 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; + fgStructure.Window->State.Cursor = cursorID; } /* @@ -214,7 +253,10 @@ void FGAPIENTRY glutWarpPointer( int x, int y ) #elif TARGET_HOST_WIN32 { - POINT coords = { x, y }; + POINT coords; + coords.x = x; + coords.y = y; + /* * ClientToScreen() translates {coords} for us. */