Further normalized the style of the cursor code.

git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@309 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
rkrolib 2003-11-07 06:25:20 +00:00
parent aeeabeff93
commit d8f572533b

View File

@ -55,26 +55,31 @@
*/ */
void FGAPIENTRY glutSetCursor( int cursorID ) void FGAPIENTRY glutSetCursor( int cursorID )
{ {
freeglut_assert_ready; freeglut_assert_ready; /* XXX WHY do we need the timer active for this? */
freeglut_assert_window; freeglut_assert_window;
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
/* /*
* Open issues: * Open issues:
* (a) GLUT_CURSOR_NONE doesn't do what it should. We can probably * (a) GLUT_CURSOR_NONE doesn't do what it should. We can probably
* build an empty pixmap for it, though, quite painlessly. * build an empty pixmap for it, though, quite painlessly.
* (b) Are we allocating resources, or causing X to do so? * (b) Are we allocating resources, or causing X to do so?
* If yes, we should arrange to deallocate! * If yes, we should arrange to deallocate!
* (c) No error checking. Is that a problem? * (c) No error checking. Is that a problem?
* (d) 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? * (e) Out-of-range cursor-types are ignored. Should we abort?
* Print a warning message? * Print a warning message?
*/ */
{ {
Cursor cursor; Cursor cursor;
#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 ) if( GLUT_CURSOR_FULL_CROSSHAIR == cursorID )
cursorID = GLUT_CURSOR_CROSSHAIR; cursorID = GLUT_CURSOR_CROSSHAIR;
@ -108,23 +113,33 @@ void FGAPIENTRY glutSetCursor( int cursorID )
} }
if( GLUT_CURSOR_INHERIT == cursorID ) if( GLUT_CURSOR_INHERIT == cursorID )
XUndefineCursor( fgDisplay.Display, fgStructure.Window->Window.Handle ); XUndefineCursor( fgDisplay.Display,
fgStructure.Window->Window.Handle );
else else
XDefineCursor( fgDisplay.Display, fgStructure.Window->Window.Handle, cursor ); XDefineCursor( fgDisplay.Display,
fgStructure.Window->Window.Handle, cursor );
} }
#elif TARGET_HOST_WIN32 #elif TARGET_HOST_WIN32
/* /*
* This is a temporary solution only... * This is a temporary solution only...
*/ */
/* Set the cursor AND change it for this window class. */ /* Set the cursor AND change it for this window class. */
# define MAP_CURSOR(a,b) case a: SetCursor( LoadCursor( NULL, b ) ); \ # define MAP_CURSOR(a,b) \
SetClassLong(fgStructure.Window->Window.Handle,GCL_HCURSOR,(LONG)LoadCursor(NULL,b)); \ case a: \
SetCursor( LoadCursor( NULL, b ) ); \
SetClassLong( fgStructure.Window->Window.Handle, \
GCL_HCURSOR, \
( LONG )LoadCursor( NULL, b ) ); \
break; 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 ); \ # define ZAP_CURSOR(a,b) \
SetClassLong(fgStructure.Window->Window.Handle,GCL_HCURSOR,(LONG)NULL); \ case a: \
SetCursor( NULL ); \
SetClassLong( fgStructure.Window->Window.Handle, \
GCL_HCURSOR, ( LONG )NULL ); \
break; break;
switch( cursorID ) switch( cursorID )
@ -133,13 +148,13 @@ void FGAPIENTRY glutSetCursor( int cursorID )
MAP_CURSOR( GLUT_CURSOR_LEFT_ARROW, IDC_ARROW ); MAP_CURSOR( GLUT_CURSOR_LEFT_ARROW, IDC_ARROW );
MAP_CURSOR( GLUT_CURSOR_INFO, IDC_HELP ); MAP_CURSOR( GLUT_CURSOR_INFO, IDC_HELP );
MAP_CURSOR( GLUT_CURSOR_DESTROY, IDC_CROSS ); MAP_CURSOR( GLUT_CURSOR_DESTROY, IDC_CROSS );
MAP_CURSOR( GLUT_CURSOR_HELP, IDC_HELP ); MAP_CURSOR( GLUT_CURSOR_HELP, IDC_HELP );
MAP_CURSOR( GLUT_CURSOR_CYCLE, IDC_SIZEALL ); MAP_CURSOR( GLUT_CURSOR_CYCLE, IDC_SIZEALL );
MAP_CURSOR( GLUT_CURSOR_SPRAY, IDC_CROSS ); MAP_CURSOR( GLUT_CURSOR_SPRAY, IDC_CROSS );
MAP_CURSOR( GLUT_CURSOR_WAIT, IDC_WAIT ); MAP_CURSOR( GLUT_CURSOR_WAIT, IDC_WAIT );
MAP_CURSOR( GLUT_CURSOR_TEXT, IDC_UPARROW ); MAP_CURSOR( GLUT_CURSOR_TEXT, IDC_UPARROW );
MAP_CURSOR( GLUT_CURSOR_CROSSHAIR, IDC_CROSS ); MAP_CURSOR( GLUT_CURSOR_CROSSHAIR, IDC_CROSS );
/* MAP_CURSOR( GLUT_CURSOR_NONE, IDC_NO ); */ /* MAP_CURSOR( GLUT_CURSOR_NONE, IDC_NO ); */
ZAP_CURSOR( GLUT_CURSOR_NONE, NULL ); ZAP_CURSOR( GLUT_CURSOR_NONE, NULL );
default: default:
@ -155,30 +170,30 @@ void FGAPIENTRY glutSetCursor( int cursorID )
*/ */
void FGAPIENTRY glutWarpPointer( int x, int y ) void FGAPIENTRY glutWarpPointer( int x, int y )
{ {
freeglut_assert_ready; freeglut_assert_ready; /* XXX WHY do we need the timer active for this? */
freeglut_assert_window; freeglut_assert_window;
#if TARGET_HOST_UNIX_X11 #if TARGET_HOST_UNIX_X11
XWarpPointer( XWarpPointer(
fgDisplay.Display, fgDisplay.Display,
None, None,
fgStructure.Window->Window.Handle, fgStructure.Window->Window.Handle,
0, 0, 0, 0, 0, 0, 0, 0,
x, y x, y
); );
XFlush( fgDisplay.Display ); XFlush( fgDisplay.Display ); /* XXX Is this really necessary? */
#elif TARGET_HOST_WIN32 #elif TARGET_HOST_WIN32
{ {
POINT coords = { x, y }; POINT coords = { x, y };
/* /*
* ClientToScreen() translates {coords} for us. * ClientToScreen() translates {coords} for us.
*/ */
ClientToScreen( fgStructure.Window->Window.Handle, &coords ); ClientToScreen( fgStructure.Window->Window.Handle, &coords );
SetCursorPos( coords.x, coords.y ); SetCursorPos( coords.x, coords.y );
} }
#endif #endif
} }