#include "config.h"
#endif
-#include "../include/GL/freeglut.h"
+#include <GL/freeglut.h>
#include "freeglut_internal.h"
#if TARGET_HOST_UNIX_X11
/* -- 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 -------------------------------------------------- */
/*
#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: \
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_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_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 unsigned char no_cursor_bits[ 32 ];
XColor black;
no_cursor = XCreatePixmapFromBitmapData( fgDisplay.Display,
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 );
( 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 ); \
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;
}
/*
#elif TARGET_HOST_WIN32
{
- POINT coords = { x, y };
+ POINT coords;
+ coords.x = x;
+ coords.y = y;
+
/*
* ClientToScreen() translates {coords} for us.
*/