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:
parent
aeeabeff93
commit
d8f572533b
@ -55,26 +55,31 @@
|
||||
*/
|
||||
void FGAPIENTRY glutSetCursor( int cursorID )
|
||||
{
|
||||
freeglut_assert_ready;
|
||||
freeglut_assert_window;
|
||||
freeglut_assert_ready; /* XXX WHY do we need the timer active for this? */
|
||||
freeglut_assert_window;
|
||||
|
||||
#if TARGET_HOST_UNIX_X11
|
||||
/*
|
||||
* Open issues:
|
||||
* (a) GLUT_CURSOR_NONE doesn't do what it should. We can probably
|
||||
* build an empty pixmap for it, though, quite painlessly.
|
||||
* (b) 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
|
||||
* 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?
|
||||
*/
|
||||
/*
|
||||
* Open issues:
|
||||
* (a) GLUT_CURSOR_NONE doesn't do what it should. We can probably
|
||||
* build an empty pixmap for it, though, quite painlessly.
|
||||
* (b) 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
|
||||
* 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?
|
||||
*/
|
||||
{
|
||||
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 )
|
||||
cursorID = GLUT_CURSOR_CROSSHAIR;
|
||||
|
||||
@ -108,23 +113,33 @@ void FGAPIENTRY glutSetCursor( int cursorID )
|
||||
}
|
||||
|
||||
if( GLUT_CURSOR_INHERIT == cursorID )
|
||||
XUndefineCursor( fgDisplay.Display, fgStructure.Window->Window.Handle );
|
||||
XUndefineCursor( fgDisplay.Display,
|
||||
fgStructure.Window->Window.Handle );
|
||||
else
|
||||
XDefineCursor( fgDisplay.Display, fgStructure.Window->Window.Handle, cursor );
|
||||
XDefineCursor( fgDisplay.Display,
|
||||
fgStructure.Window->Window.Handle, cursor );
|
||||
}
|
||||
|
||||
#elif TARGET_HOST_WIN32
|
||||
|
||||
/*
|
||||
* This is a temporary solution only...
|
||||
*/
|
||||
/* Set the cursor AND change it for this window class. */
|
||||
# define MAP_CURSOR(a,b) case a: SetCursor( LoadCursor( NULL, b ) ); \
|
||||
SetClassLong(fgStructure.Window->Window.Handle,GCL_HCURSOR,(LONG)LoadCursor(NULL,b)); \
|
||||
/*
|
||||
* This is a temporary solution only...
|
||||
*/
|
||||
/* Set the cursor AND change it for this window class. */
|
||||
# define MAP_CURSOR(a,b) \
|
||||
case a: \
|
||||
SetCursor( LoadCursor( NULL, b ) ); \
|
||||
SetClassLong( fgStructure.Window->Window.Handle, \
|
||||
GCL_HCURSOR, \
|
||||
( LONG )LoadCursor( NULL, b ) ); \
|
||||
break;
|
||||
|
||||
/* Nuke the cursor AND change it for this window class. */
|
||||
# define ZAP_CURSOR(a,b) case a: SetCursor( NULL ); \
|
||||
SetClassLong(fgStructure.Window->Window.Handle,GCL_HCURSOR,(LONG)NULL); \
|
||||
# define ZAP_CURSOR(a,b) \
|
||||
case a: \
|
||||
SetCursor( NULL ); \
|
||||
SetClassLong( fgStructure.Window->Window.Handle, \
|
||||
GCL_HCURSOR, ( LONG )NULL ); \
|
||||
break;
|
||||
|
||||
switch( cursorID )
|
||||
@ -133,13 +148,13 @@ void FGAPIENTRY glutSetCursor( int cursorID )
|
||||
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_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_WAIT, IDC_WAIT );
|
||||
MAP_CURSOR( GLUT_CURSOR_TEXT, IDC_UPARROW );
|
||||
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 );
|
||||
|
||||
default:
|
||||
@ -155,30 +170,30 @@ void FGAPIENTRY glutSetCursor( int cursorID )
|
||||
*/
|
||||
void FGAPIENTRY glutWarpPointer( int x, int y )
|
||||
{
|
||||
freeglut_assert_ready;
|
||||
freeglut_assert_window;
|
||||
freeglut_assert_ready; /* XXX WHY do we need the timer active for this? */
|
||||
freeglut_assert_window;
|
||||
|
||||
#if TARGET_HOST_UNIX_X11
|
||||
|
||||
XWarpPointer(
|
||||
XWarpPointer(
|
||||
fgDisplay.Display,
|
||||
None,
|
||||
fgStructure.Window->Window.Handle,
|
||||
0, 0, 0, 0,
|
||||
x, y
|
||||
);
|
||||
XFlush( fgDisplay.Display );
|
||||
);
|
||||
XFlush( fgDisplay.Display ); /* XXX Is this really necessary? */
|
||||
|
||||
#elif TARGET_HOST_WIN32
|
||||
|
||||
{
|
||||
POINT coords = { x, y };
|
||||
/*
|
||||
* ClientToScreen() translates {coords} for us.
|
||||
*/
|
||||
ClientToScreen( fgStructure.Window->Window.Handle, &coords );
|
||||
SetCursorPos( coords.x, coords.y );
|
||||
}
|
||||
{
|
||||
POINT coords = { x, y };
|
||||
/*
|
||||
* ClientToScreen() translates {coords} for us.
|
||||
*/
|
||||
ClientToScreen( fgStructure.Window->Window.Handle, &coords );
|
||||
SetCursorPos( coords.x, coords.y );
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
Reference in New Issue
Block a user