X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2FCommon%2Ffreeglut_cursor.c;h=3b144f364cdd056e1acfc66e393af5f073a7aaac;hb=5a3e5c7b7749ca1b3de57591c90d6424d1dd4b86;hp=1eddf87c8750c951133b6f1e4df2441a9ef27741;hpb=4e6742a8c1090137a36512d72271c160bd509e1f;p=freeglut diff --git a/src/Common/freeglut_cursor.c b/src/Common/freeglut_cursor.c index 1eddf87..3b144f3 100644 --- a/src/Common/freeglut_cursor.c +++ b/src/Common/freeglut_cursor.c @@ -39,136 +39,15 @@ /* -- PRIVATE FUNCTIONS --------------------------------------------------- */ -extern void fghSetCursor ( SFG_Window *window, int cursorID ); -extern void fghWarpPointer ( int x, int y ); +extern void fgPlatformSetCursor ( SFG_Window *window, int cursorID ); +extern void fgPlatformWarpPointer ( int x, int y ); -#if TARGET_HOST_POSIX_X11 || TARGET_HOST_MAC_OSX || TARGET_HOST_SOLARIS - #include - -/* - * A factory method for an empty cursor - */ -static Cursor getEmptyCursor( void ) -{ - static Cursor cursorNone = None; - if( cursorNone == None ) { - char cursorNoneBits[ 32 ]; - XColor dontCare; - Pixmap cursorNonePixmap; - memset( cursorNoneBits, 0, sizeof( cursorNoneBits ) ); - memset( &dontCare, 0, sizeof( dontCare ) ); - cursorNonePixmap = XCreateBitmapFromData ( fgDisplay.Display, - fgDisplay.RootWindow, - cursorNoneBits, 16, 16 ); - if( cursorNonePixmap != None ) { - cursorNone = XCreatePixmapCursor( fgDisplay.Display, - cursorNonePixmap, cursorNonePixmap, - &dontCare, &dontCare, 0, 0 ); - XFreePixmap( fgDisplay.Display, cursorNonePixmap ); - } - } - return cursorNone; -} - -typedef struct tag_cursorCacheEntry cursorCacheEntry; -struct tag_cursorCacheEntry { - unsigned int cursorShape; /* an XC_foo value */ - Cursor cachedCursor; /* None if the corresponding cursor has - not been created yet */ -}; - -/* - * Note: The arrangement of the table below depends on the fact that - * the "normal" GLUT_CURSOR_* values start a 0 and are consecutive. - */ -static cursorCacheEntry cursorCache[] = { - { XC_arrow, None }, /* GLUT_CURSOR_RIGHT_ARROW */ - { XC_top_left_arrow, None }, /* GLUT_CURSOR_LEFT_ARROW */ - { XC_hand1, None }, /* GLUT_CURSOR_INFO */ - { XC_pirate, None }, /* GLUT_CURSOR_DESTROY */ - { XC_question_arrow, None }, /* GLUT_CURSOR_HELP */ - { XC_exchange, None }, /* GLUT_CURSOR_CYCLE */ - { XC_spraycan, None }, /* GLUT_CURSOR_SPRAY */ - { XC_watch, None }, /* GLUT_CURSOR_WAIT */ - { XC_xterm, None }, /* GLUT_CURSOR_TEXT */ - { XC_crosshair, None }, /* GLUT_CURSOR_CROSSHAIR */ - { XC_sb_v_double_arrow, None }, /* GLUT_CURSOR_UP_DOWN */ - { XC_sb_h_double_arrow, None }, /* GLUT_CURSOR_LEFT_RIGHT */ - { XC_top_side, None }, /* GLUT_CURSOR_TOP_SIDE */ - { XC_bottom_side, None }, /* GLUT_CURSOR_BOTTOM_SIDE */ - { XC_left_side, None }, /* GLUT_CURSOR_LEFT_SIDE */ - { XC_right_side, None }, /* GLUT_CURSOR_RIGHT_SIDE */ - { XC_top_left_corner, None }, /* GLUT_CURSOR_TOP_LEFT_CORNER */ - { XC_top_right_corner, None }, /* GLUT_CURSOR_TOP_RIGHT_CORNER */ - { XC_bottom_right_corner, None }, /* GLUT_CURSOR_BOTTOM_RIGHT_CORNER */ - { XC_bottom_left_corner, None } /* GLUT_CURSOR_BOTTOM_LEFT_CORNER */ -}; - -static void fghSetCursor ( SFG_Window *window, int cursorID ) -{ - Cursor cursor; - /* - * XXX 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. - */ - int cursorIDToUse = - ( cursorID == GLUT_CURSOR_FULL_CROSSHAIR ) ? GLUT_CURSOR_CROSSHAIR : cursorID; - - if( ( cursorIDToUse >= 0 ) && - ( cursorIDToUse < sizeof( cursorCache ) / sizeof( cursorCache[0] ) ) ) { - cursorCacheEntry *entry = &cursorCache[ cursorIDToUse ]; - if( entry->cachedCursor == None ) { - entry->cachedCursor = - XCreateFontCursor( fgDisplay.Display, entry->cursorShape ); - } - cursor = entry->cachedCursor; - } else { - switch( cursorIDToUse ) - { - case GLUT_CURSOR_NONE: - cursor = getEmptyCursor( ); - break; - - case GLUT_CURSOR_INHERIT: - cursor = None; - break; - - default: - fgError( "Unknown cursor type: %d", cursorIDToUse ); - return; - } - } - - if ( cursorIDToUse == GLUT_CURSOR_INHERIT ) { - XUndefineCursor( fgDisplay.Display, window->Window.Handle ); - } else if ( cursor != None ) { - XDefineCursor( fgDisplay.Display, window->Window.Handle, cursor ); - } else if ( cursorIDToUse != GLUT_CURSOR_NONE ) { - fgError( "Failed to create cursor" ); - } -} - - -static void fghWarpPointer ( int x, int y ) -{ - XWarpPointer( - fgDisplay.Display, - None, - fgStructure.CurrentWindow->Window.Handle, - 0, 0, 0, 0, - x, y - ); - /* Make the warp visible immediately. */ - XFlush( fgDisplay.Display ); -} -#endif /* -- INTERNAL FUNCTIONS ---------------------------------------------------- */ void fgSetCursor ( SFG_Window *window, int cursorID ) { - fghSetCursor ( window, cursorID ); + fgPlatformSetCursor ( window, cursorID ); } @@ -182,7 +61,7 @@ void FGAPIENTRY glutSetCursor( int cursorID ) FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetCursor" ); FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetCursor" ); - fghSetCursor ( fgStructure.CurrentWindow, cursorID ); + fgPlatformSetCursor ( fgStructure.CurrentWindow, cursorID ); fgStructure.CurrentWindow->State.Cursor = cursorID; } @@ -194,7 +73,7 @@ void FGAPIENTRY glutWarpPointer( int x, int y ) FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWarpPointer" ); FREEGLUT_EXIT_IF_NO_WINDOW ( "glutWarpPointer" ); - fghWarpPointer ( x, y ); + fgPlatformWarpPointer ( x, y ); } /*** END OF FILE ***/