1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/mac/carbon/cursor.cpp 
   3 // Purpose:     wxCursor class 
   4 // Author:      Stefan Csomor 
   8 // Copyright:   (c) Stefan Csomor 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 #include "wx/wxprec.h" 
  14 #include "wx/cursor.h" 
  22 #include "wx/xpmdecod.h" 
  24 #include "wx/mac/private.h" 
  27 IMPLEMENT_DYNAMIC_CLASS(wxCursor
, wxBitmap
) 
  30 class WXDLLEXPORT wxCursorRefData
: public wxBitmapRefData
 
  32     DECLARE_NO_COPY_CLASS(wxCursorRefData
) 
  34     friend class WXDLLEXPORT wxBitmap
; 
  35     friend class WXDLLEXPORT wxCursor
; 
  39     virtual ~wxCursorRefData(); 
  49 #define M_CURSORDATA wx_static_cast(wxCursorRefData*, m_refData) 
  51 const short kwxCursorBullseye 
= 0; 
  52 const short kwxCursorBlank 
= 1; 
  53 const short kwxCursorPencil 
= 2; 
  54 const short kwxCursorMagnifier 
= 3; 
  55 const short kwxCursorNoEntry 
= 4; 
  56 const short kwxCursorPaintBrush 
= 5; 
  57 const short kwxCursorPointRight 
= 6; 
  58 const short kwxCursorPointLeft 
= 7; 
  59 const short kwxCursorQuestionArrow 
= 8; 
  60 const short kwxCursorRightArrow 
= 9; 
  61 const short kwxCursorSizeNS 
= 10; 
  62 const short kwxCursorSize 
= 11; 
  63 const short kwxCursorSizeNESW 
= 12; 
  64 const short kwxCursorSizeNWSE 
= 13; 
  65 const short kwxCursorRoller 
= 14; 
  66 const short kwxCursorLast 
= kwxCursorRoller
; 
  68 Cursor gMacCursors
[kwxCursorLast
+1] = 
  72 {0x0000, 0x03E0, 0x0630, 0x0808, 0x1004, 0x31C6, 0x2362, 0x2222, 
  73 0x2362, 0x31C6, 0x1004, 0x0808, 0x0630, 0x03E0, 0x0000, 0x0000}, 
  74 {0x0000, 0x03E0, 0x07F0, 0x0FF8, 0x1FFC, 0x3FFE, 0x3FFE, 0x3FFE, 
  75 0x3FFE, 0x3FFE, 0x1FFC, 0x0FF8, 0x07F0, 0x03E0, 0x0000, 0x0000}, 
  80 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
  81 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, 
  82 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
  83 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, 
  88 {0x00F0, 0x0088, 0x0108, 0x0190, 0x0270, 0x0220, 0x0440, 0x0440, 
  89 0x0880, 0x0880, 0x1100, 0x1E00, 0x1C00, 0x1800, 0x1000, 0x0000}, 
  90 {0x00F0, 0x00F8, 0x01F8, 0x01F0, 0x03F0, 0x03E0, 0x07C0, 0x07C0, 
  91 0x0F80, 0x0F80, 0x1F00, 0x1E00, 0x1C00, 0x1800, 0x1000, 0x0000}, 
  96 {0x0000, 0x1E00, 0x2100, 0x4080, 0x4080, 0x4080, 0x4080, 0x2180, 
  97 0x1FC0, 0x00E0, 0x0070, 0x0038, 0x001C, 0x000E, 0x0006, 0x0000}, 
  98 {0x3F00, 0x7F80, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0x7FC0, 
  99 0x3FE0, 0x1FF0, 0x00F8, 0x007C, 0x003E, 0x001F, 0x000F, 0x0007}, 
 104 {0x0000, 0x07E0, 0x1FF0, 0x3838, 0x3C0C, 0x6E0E, 0x6706, 0x6386, 
 105 0x61C6, 0x60E6, 0x7076, 0x303C, 0x1C1C, 0x0FF8, 0x07E0, 0x0000}, 
 106 {0x0540, 0x0FF0, 0x3FF8, 0x3C3C, 0x7E0E, 0xFF0F, 0x6F86, 0xE7C7, 
 107 0x63E6, 0xE1F7, 0x70FE, 0x707E, 0x3C3C, 0x1FFC, 0x0FF0, 0x0540}, 
 112 {0x0000, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0FE0, 
 113 0x1FF0, 0x1FF0, 0x0000, 0x1FF0, 0x1FF0, 0x1550, 0x1550, 0x1550}, 
 114 {0x07C0, 0x07C0, 0x07C0, 0x07C0, 0x07C0, 0x07C0, 0x0FE0, 0x1FF0, 
 115 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8}, 
 120 {0x00C0, 0x0140, 0x0640, 0x08C0, 0x3180, 0x47FE, 0x8001, 0x8001, 
 121 0x81FE, 0x8040, 0x01C0, 0x0040, 0x03C0, 0xC080, 0x3F80, 0x0000}, 
 122 {0x00C0, 0x01C0, 0x07C0, 0x0FC0, 0x3F80, 0x7FFE, 0xFFFF, 0xFFFF, 
 123 0xFFFE, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0xFF80, 0x3F80, 0x0000}, 
 128 {0x0100, 0x0280, 0x0260, 0x0310, 0x018C, 0x7FE3, 0x8000, 0x8000, 
 129 0x7F80, 0x0200, 0x0380, 0x0200, 0x03C0, 0x0107, 0x01F8, 0x0000}, 
 130 {0x0100, 0x0380, 0x03E0, 0x03F0, 0x01FC, 0x7FFF, 0xFFFF, 0xFFFF, 
 131 0xFFFF, 0x03FF, 0x03FF, 0x03FF, 0x03FF, 0x01FF, 0x01F8, 0x0000}, 
 136 {0x0000, 0x4078, 0x60FC, 0x71CE, 0x7986, 0x7C06, 0x7E0E, 0x7F1C, 
 137 0x7FB8, 0x7C30, 0x6C30, 0x4600, 0x0630, 0x0330, 0x0300, 0x0000}, 
 138 {0xC078, 0xE0FC, 0xF1FE, 0xFBFF, 0xFFCF, 0xFF8F, 0xFF1F, 0xFFBE, 
 139 0xFFFC, 0xFE78, 0xFF78, 0xEFF8, 0xCFF8, 0x87F8, 0x07F8, 0x0300}, 
 144 {0x0000, 0x0002, 0x0006, 0x000E, 0x001E, 0x003E, 0x007E, 0x00FE, 
 145 0x01FE, 0x003E, 0x0036, 0x0062, 0x0060, 0x00C0, 0x00C0, 0x0000}, 
 146 {0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 
 147 0x03FF, 0x07FF, 0x007F, 0x00F7, 0x00F3, 0x01E1, 0x01E0, 0x01C0}, 
 152 {0x0000, 0x0080, 0x01C0, 0x03E0, 0x0080, 0x0080, 0x0080, 0x1FFC, 
 153 0x1FFC, 0x0080, 0x0080, 0x0080, 0x03E0, 0x01C0, 0x0080, 0x0000}, 
 154 {0x0080, 0x01C0, 0x03E0, 0x07F0, 0x0FF8, 0x01C0, 0x3FFE, 0x3FFE, 
 155 0x3FFE, 0x3FFE, 0x01C0, 0x0FF8, 0x07F0, 0x03E0, 0x01C0, 0x0080}, 
 160 {0x0000, 0x0080, 0x01C0, 0x03E0, 0x0080, 0x0888, 0x188C, 0x3FFE, 
 161 0x188C, 0x0888, 0x0080, 0x03E0, 0x01C0, 0x0080, 0x0000, 0x0000}, 
 162 {0x0080, 0x01C0, 0x03E0, 0x07F0, 0x0BE8, 0x1DDC, 0x3FFE, 0x7FFF, 
 163 0x3FFE, 0x1DDC, 0x0BE8, 0x07F0, 0x03E0, 0x01C0, 0x0080, 0x0000}, 
 168 {0x0000, 0x001E, 0x000E, 0x060E, 0x0712, 0x03A0, 0x01C0, 0x00E0, 
 169 0x0170, 0x1238, 0x1C18, 0x1C00, 0x1E00, 0x0000, 0x0000, 0x0000}, 
 170 {0x007F, 0x003F, 0x0E1F, 0x0F0F, 0x0F97, 0x07E3, 0x03E1, 0x21F0, 
 171 0x31F8, 0x3A7C, 0x3C3C, 0x3E1C, 0x3F00, 0x3F80, 0x0000, 0x0000}, 
 176 {0x0000, 0x7800, 0x7000, 0x7060, 0x48E0, 0x05C0, 0x0380, 0x0700, 
 177 0x0E80, 0x1C48, 0x1838, 0x0038, 0x0078, 0x0000, 0x0000, 0x0000}, 
 178 {0xFE00, 0xFC00, 0xF870, 0xF0F0, 0xE9F0, 0xC7E0, 0x87C0, 0x0F84, 
 179 0x1F8C, 0x3E5C, 0x3C3C, 0x387C, 0x00FC, 0x01FC, 0x0000, 0x0000}, 
 184 {0x0006, 0x000E, 0x001C, 0x0018, 0x0020, 0x0040, 0x00F8, 0x0004, 
 185 0x1FF4, 0x200C, 0x2AA8, 0x1FF0, 0x1F80, 0x3800, 0x6000, 0x8000}, 
 186 {0x000F, 0x001F, 0x003E, 0x007C, 0x0070, 0x00E0, 0x01FC, 0x3FF6, 
 187 0x7FF6, 0x7FFE, 0x7FFC, 0x7FF8, 0x3FF0, 0x7FC0, 0xF800, 0xE000}, 
 193 wxCursor    gMacCurrentCursor 
; 
 195 CursHandle 
wxGetStockCursor( int number 
) 
 197     wxASSERT_MSG( number 
>= 0 && number 
<=kwxCursorLast 
, wxT("invalid stock cursor id") ) ; 
 198     CursHandle c 
= (CursHandle
) NewHandle( sizeof(Cursor
) ) ; 
 199     memcpy( *c
, &gMacCursors
[number
], sizeof(Cursor
) ) ; 
 201 #ifndef WORDS_BIGENDIAN 
 202     short *sptr 
= (short*) *c 
; 
 203     for ( int i 
= 0 ; i 
< 2 * 16 /* image and mask */ ; ++i
, ++sptr 
) 
 205         *sptr 
= CFSwapInt16( *sptr 
) ; 
 211 wxCursorRefData::wxCursorRefData() 
 216     m_disposeHandle 
= false; 
 217     m_releaseHandle 
= false; 
 218     m_isColorCursor 
= false; 
 222 wxCursorRefData::~wxCursorRefData() 
 224     if ( m_isColorCursor 
) 
 227                ::DisposeCCursor( (CCrsrHandle
) m_hCursor 
) ; 
 230     else if ( m_disposeHandle 
) 
 232         ::DisposeHandle( (Handle 
) m_hCursor 
) ; 
 234     else if ( m_releaseHandle 
) 
 236         // we don't release the resource since it may already 
 245 wxCursor::wxCursor(const char WXUNUSED(bits
)[], int WXUNUSED(width
), int WXUNUSED(height
), 
 246     int WXUNUSED(hotSpotX
), int WXUNUSED(hotSpotY
), const char WXUNUSED(maskBits
)[]) 
 250 wxCursor::wxCursor( const wxImage 
&image 
) 
 253     CreateFromImage( image 
) ; 
 257 wxCursor::wxCursor(const char **bits
) 
 259     (void) CreateFromXpm(bits
); 
 262 wxCursor::wxCursor(char **bits
) 
 264     (void) CreateFromXpm((const char **)bits
); 
 267 bool wxCursor::CreateFromXpm(const char **bits
) 
 270     wxCHECK_MSG( bits 
!= NULL
, false, wxT("invalid cursor data") ); 
 271     wxXPMDecoder decoder
; 
 272     wxImage img 
= decoder
.ReadData(bits
); 
 273     wxCHECK_MSG( img
.Ok(), false, wxT("invalid cursor data") ); 
 274     CreateFromImage( img 
) ; 
 281 WXHCURSOR 
wxCursor::GetHCURSOR() const 
 283     return (M_CURSORDATA 
? M_CURSORDATA
->m_hCursor 
: 0); 
 286 bool wxCursor::IsOk() const 
 288     return (m_refData 
!= NULL 
&& ( M_CURSORDATA
->m_hCursor 
!= NULL 
|| M_CURSORDATA
->m_themeCursor 
!= -1 ) ) ; 
 291 short GetCTabIndex( CTabHandle colors 
, RGBColor 
*col 
) 
 294     unsigned long bestdiff 
= 0xFFFF ; 
 296     for ( int i 
= 0 ; i 
< (**colors
).ctSize 
; ++i 
) 
 298         unsigned long diff 
= abs(col
->red 
-  (**colors
).ctTable
[i
].rgb
.red 
) + 
 299             abs(col
->green 
-  (**colors
).ctTable
[i
].rgb
.green 
) + 
 300             abs(col
->blue 
-  (**colors
).ctTable
[i
].rgb
.blue 
) ; 
 302         if ( diff 
< bestdiff 
) 
 305             retval 
= (**colors
).ctTable
[i
].value 
; 
 314 void wxCursor::CreateFromImage(const wxImage 
& image
) 
 316     m_refData 
= new wxCursorRefData
; 
 322     int hotSpotX 
= image
.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X
); 
 323     int hotSpotY 
= image
.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y
); 
 324     int image_w 
= image
.GetWidth(); 
 325     int image_h 
= image
.GetHeight(); 
 327     wxASSERT_MSG( hotSpotX 
>= 0 && hotSpotX 
< image_w 
&& 
 328                   hotSpotY 
>= 0 && hotSpotY 
< image_h
, 
 329                   wxT("invalid cursor hot spot coordinates") ); 
 331     wxImage 
image16(image
); // final image of correct size 
 333     // if image is too small then place it in the center, resize it if too big 
 334     if ((w 
> image_w
) && (h 
> image_h
)) 
 336         wxPoint 
offset((w 
- image_w
) / 2, (h 
- image_h
) / 2); 
 337         hotSpotX 
= hotSpotX 
+ offset
.x
; 
 338         hotSpotY 
= hotSpotY 
+ offset
.y
; 
 340         image16 
= image
.Size(wxSize(w
, h
), offset
); 
 342     else if ((w 
!= image_w
) || (h 
!= image_h
)) 
 344         hotSpotX 
= int(hotSpotX 
* double(w
) / double(image_w
)); 
 345         hotSpotY 
= int(hotSpotY 
* double(h
) / double(image_h
)); 
 347         image16 
= image
.Scale(w
, h
); 
 350     unsigned char * rgbBits 
= image16
.GetData(); 
 351     bool bHasMask 
= image16
.HasMask() ; 
 353     PixMapHandle pm 
= (PixMapHandle
) NewHandleClear( sizeof(PixMap
) )  ; 
 355     short bytesPerPixel 
= 1 ; 
 357     Rect bounds 
= { 0 , 0 , extent 
, extent 
} ; 
 358     CCrsrHandle ch 
= (CCrsrHandle
) NewHandleClear( sizeof(CCrsr
) ) ; 
 359     CTabHandle newColors 
= GetCTable( 8 ) ; 
 360     HandToHand( (Handle 
*) &newColors 
); 
 362     // set the values to the indices 
 363     for ( int i 
= 0 ; i 
< (**newColors
).ctSize 
; ++i 
) 
 365         (**newColors
).ctTable
[i
].value 
= i 
; 
 369     (**ch
).crsrType 
= 0x8001; // color cursors 
 371     short bytesPerRow 
= bytesPerPixel 
* extent
; 
 374     (**pm
).rowBytes 
= bytesPerRow 
| 0x8000; 
 375     (**pm
).bounds 
= bounds
; 
 376     (**pm
).pmVersion 
= 0; 
 379     (**pm
).hRes 
= 0x00480000; // 72 DPI default res 
 380     (**pm
).vRes 
= 0x00480000; // 72 DPI default res 
 381     (**pm
).pixelSize 
= depth
; 
 382     (**pm
).pixelType 
= 0; 
 384     (**pm
).cmpSize 
= depth
; 
 385     (**pm
).pmTable 
= newColors
; 
 387     (**ch
).crsrData 
= NewHandleClear( extent 
* bytesPerRow 
) ; 
 388     (**ch
).crsrXData 
= NULL 
; 
 389     (**ch
).crsrXValid 
= 0; 
 390     (**ch
).crsrXHandle 
= NULL
; 
 392     (**ch
).crsrHotSpot
.h 
= hotSpotX 
; 
 393     (**ch
).crsrHotSpot
.v 
= hotSpotY 
; 
 394     (**ch
).crsrXTable 
= 0 ; 
 395     (**ch
).crsrID 
= GetCTSeed() ; 
 397     memset( (**ch
).crsr1Data  
, 0 , sizeof( Bits16 
) ) ; 
 398     memset( (**ch
).crsrMask 
, 0 , sizeof( Bits16 
) ) ; 
 400     unsigned char mr 
= image16
.GetMaskRed() ; 
 401     unsigned char mg 
= image16
.GetMaskGreen() ; 
 402     unsigned char mb 
= image16
.GetMaskBlue() ; 
 404     for ( int y 
= 0 ; y 
< h 
; ++y 
) 
 406         short rowbits 
= 0, maskbits 
= 0 ; 
 408         for ( int x 
= 0 ; x 
< w 
; ++x 
) 
 410             long pos 
= (y 
* w 
+ x
) * 3; 
 412             unsigned char r 
= rgbBits
[pos
] ; 
 413             unsigned char g 
= rgbBits
[pos 
+ 1] ; 
 414             unsigned char b 
= rgbBits
[pos 
+ 2] ; 
 415             RGBColor col 
= { 0xFFFF, 0xFFFF, 0xFFFF } ; 
 417             if ( bHasMask 
&& r 
== mr 
&& g 
== mg 
&& b 
== mb 
) 
 419                 // masked area, does not appear anywhere 
 423                 if ( (int)r 
+ (int)g 
+ (int)b 
< 0x0200 ) 
 424                     rowbits 
|= ( 1 << (15 - x
) ) ; 
 426                 maskbits 
|= ( 1 << (15 - x
) ) ; 
 428                 col 
= *((RGBColor
*) wxColor( r 
, g 
, b 
).GetPixel()) ; 
 431             *((*(**ch
).crsrData
) + y 
* bytesPerRow 
+ x
) = 
 432                 GetCTabIndex( newColors 
, &col
) ; 
 434 #ifdef WORDS_BIGENDIAN 
 435         (**ch
).crsr1Data
[y
] = rowbits 
; 
 436         (**ch
).crsrMask
[y
] = maskbits 
; 
 438         (**ch
).crsr1Data
[y
] = CFSwapInt16(rowbits
) ; 
 439         (**ch
).crsrMask
[y
] = CFSwapInt16(maskbits
) ; 
 444         memcpy( (**ch
).crsrMask 
, (**ch
).crsr1Data 
, sizeof( Bits16
) ) ; 
 446     HUnlock( (Handle
)ch 
) ; 
 447     M_CURSORDATA
->m_hCursor 
= ch 
; 
 448     M_CURSORDATA
->m_isColorCursor 
= true ; 
 455 wxCursor::wxCursor(const wxString
& cursor_file
, long flags
, int hotSpotX
, int hotSpotY
) 
 457     m_refData 
= new wxCursorRefData
; 
 458     if ( flags 
== wxBITMAP_TYPE_MACCURSOR_RESOURCE 
) 
 462         wxMacStringToPascal( cursor_file 
, theName 
) ; 
 464         Handle resHandle 
= ::GetNamedResource( 'crsr' , theName 
) ; 
 470             GetResInfo( resHandle 
, &theId 
, &theType 
, theName 
) ; 
 471             ReleaseResource( resHandle 
) ; 
 473             M_CURSORDATA
->m_hCursor 
= GetCCursor( theId 
) ; 
 474             if ( M_CURSORDATA
->m_hCursor 
) 
 475                 M_CURSORDATA
->m_isColorCursor 
= true ; 
 479             Handle resHandle 
= ::GetNamedResource( 'CURS' , theName 
) ; 
 485                 GetResInfo( resHandle 
, &theId 
, &theType 
, theName 
) ; 
 486                 ReleaseResource( resHandle 
) ; 
 488                 M_CURSORDATA
->m_hCursor 
= GetCursor( theId 
) ; 
 489                 if ( M_CURSORDATA
->m_hCursor 
) 
 490                     M_CURSORDATA
->m_releaseHandle 
= true ; 
 499         image
.LoadFile( cursor_file
, flags 
) ; 
 502             image
.SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_X
, hotSpotX 
) ; 
 503             image
.SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_Y
, hotSpotY 
) ; 
 504             m_refData
->DecRef() ; 
 506             CreateFromImage( image 
) ; 
 512 // Cursors by stock number 
 513 wxCursor::wxCursor(int cursor_type
) 
 515     m_refData 
= new wxCursorRefData
; 
 519     case wxCURSOR_COPY_ARROW
: 
 520         M_CURSORDATA
->m_themeCursor 
= kThemeCopyArrowCursor
; 
 524         M_CURSORDATA
->m_themeCursor 
= kThemeWatchCursor
; 
 528         M_CURSORDATA
->m_themeCursor 
= kThemeIBeamCursor
; 
 532         M_CURSORDATA
->m_themeCursor 
= kThemeCrossCursor
; 
 535     case wxCURSOR_SIZENWSE
: 
 536         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorSizeNWSE
); 
 539     case wxCURSOR_SIZENESW
: 
 540         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorSizeNESW
); 
 543     case wxCURSOR_SIZEWE
: 
 544         M_CURSORDATA
->m_themeCursor 
= kThemeResizeLeftRightCursor
; 
 547     case wxCURSOR_SIZENS
: 
 548         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorSizeNS
); 
 551     case wxCURSOR_SIZING
: 
 552         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorSize
); 
 556         M_CURSORDATA
->m_themeCursor 
= kThemePointingHandCursor
; 
 559     case wxCURSOR_BULLSEYE
: 
 560         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorBullseye
); 
 563     case wxCURSOR_PENCIL
: 
 564         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorPencil
); 
 567     case wxCURSOR_MAGNIFIER
: 
 568         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorMagnifier
); 
 571     case wxCURSOR_NO_ENTRY
: 
 572         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorNoEntry
); 
 576         M_CURSORDATA
->m_themeCursor 
= kThemeWatchCursor
; 
 579     case wxCURSOR_PAINT_BRUSH
: 
 580         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorPaintBrush
); 
 583     case wxCURSOR_POINT_LEFT
: 
 584         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorPointLeft
); 
 587     case wxCURSOR_POINT_RIGHT
: 
 588         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorPointRight
); 
 591     case wxCURSOR_QUESTION_ARROW
: 
 592         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorQuestionArrow
); 
 596         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorBlank
); 
 599     case wxCURSOR_RIGHT_ARROW
: 
 600         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorRightArrow
); 
 603     case wxCURSOR_SPRAYCAN
: 
 604         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorRoller
); 
 609     case wxCURSOR_LEFT_BUTTON
: 
 610     case wxCURSOR_RIGHT_BUTTON
: 
 611     case wxCURSOR_MIDDLE_BUTTON
: 
 613         M_CURSORDATA
->m_themeCursor 
= kThemeArrowCursor
; 
 617     if ( M_CURSORDATA
->m_themeCursor 
== -1 ) 
 618         M_CURSORDATA
->m_releaseHandle 
= true; 
 621 void wxCursor::MacInstall() const 
 623     gMacCurrentCursor 
= *this ; 
 624     if ( m_refData 
&& M_CURSORDATA
->m_themeCursor 
!= -1 ) 
 626         SetThemeCursor( M_CURSORDATA
->m_themeCursor 
) ; 
 628     else if ( m_refData 
&& M_CURSORDATA
->m_hCursor 
) 
 631        if ( M_CURSORDATA
->m_isColorCursor 
) 
 632             ::SetCCursor( (CCrsrHandle
) M_CURSORDATA
->m_hCursor 
) ; 
 634             ::SetCursor( * (CursHandle
) M_CURSORDATA
->m_hCursor 
) ; 
 639         SetThemeCursor( kThemeArrowCursor 
) ; 
 643 wxCursor::~wxCursor() 
 647 // Global cursor setting 
 648 void wxSetCursor(const wxCursor
& cursor
) 
 650     cursor
.MacInstall() ;