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
, wxGDIObject
) 
  30 class WXDLLEXPORT wxCursorRefData
: public wxGDIRefData
 
  34     wxCursorRefData(const wxCursorRefData
& cursor
); 
  35     virtual ~wxCursorRefData(); 
  37     virtual bool IsOk() const 
  39         if ( m_hCursor 
!= NULL 
) 
  42         if ( m_themeCursor 
!= -1 ) 
  51     WX_NSCursor m_hCursor
; 
  60     friend class wxCursor
; 
  62     DECLARE_NO_ASSIGN_CLASS(wxCursorRefData
) 
  65 #define M_CURSORDATA wx_static_cast(wxCursorRefData*, m_refData) 
  67 ClassicCursor gMacCursors
[kwxCursorLast
+1] = 
  71 {0x0000, 0x03E0, 0x0630, 0x0808, 0x1004, 0x31C6, 0x2362, 0x2222, 
  72 0x2362, 0x31C6, 0x1004, 0x0808, 0x0630, 0x03E0, 0x0000, 0x0000}, 
  73 {0x0000, 0x03E0, 0x07F0, 0x0FF8, 0x1FFC, 0x3FFE, 0x3FFE, 0x3FFE, 
  74 0x3FFE, 0x3FFE, 0x1FFC, 0x0FF8, 0x07F0, 0x03E0, 0x0000, 0x0000}, 
  79 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 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}, 
  87 {0x00F0, 0x0088, 0x0108, 0x0190, 0x0270, 0x0220, 0x0440, 0x0440, 
  88 0x0880, 0x0880, 0x1100, 0x1E00, 0x1C00, 0x1800, 0x1000, 0x0000}, 
  89 {0x00F0, 0x00F8, 0x01F8, 0x01F0, 0x03F0, 0x03E0, 0x07C0, 0x07C0, 
  90 0x0F80, 0x0F80, 0x1F00, 0x1E00, 0x1C00, 0x1800, 0x1000, 0x0000}, 
  95 {0x0000, 0x1E00, 0x2100, 0x4080, 0x4080, 0x4080, 0x4080, 0x2180, 
  96 0x1FC0, 0x00E0, 0x0070, 0x0038, 0x001C, 0x000E, 0x0006, 0x0000}, 
  97 {0x3F00, 0x7F80, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0x7FC0, 
  98 0x3FE0, 0x1FF0, 0x00F8, 0x007C, 0x003E, 0x001F, 0x000F, 0x0007}, 
 103 {0x0000, 0x07E0, 0x1FF0, 0x3838, 0x3C0C, 0x6E0E, 0x6706, 0x6386, 
 104 0x61C6, 0x60E6, 0x7076, 0x303C, 0x1C1C, 0x0FF8, 0x07E0, 0x0000}, 
 105 {0x0540, 0x0FF0, 0x3FF8, 0x3C3C, 0x7E0E, 0xFF0F, 0x6F86, 0xE7C7, 
 106 0x63E6, 0xE1F7, 0x70FE, 0x707E, 0x3C3C, 0x1FFC, 0x0FF0, 0x0540}, 
 111 {0x0000, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0FE0, 
 112 0x1FF0, 0x1FF0, 0x0000, 0x1FF0, 0x1FF0, 0x1550, 0x1550, 0x1550}, 
 113 {0x07C0, 0x07C0, 0x07C0, 0x07C0, 0x07C0, 0x07C0, 0x0FE0, 0x1FF0, 
 114 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8}, 
 119 {0x00C0, 0x0140, 0x0640, 0x08C0, 0x3180, 0x47FE, 0x8001, 0x8001, 
 120 0x81FE, 0x8040, 0x01C0, 0x0040, 0x03C0, 0xC080, 0x3F80, 0x0000}, 
 121 {0x00C0, 0x01C0, 0x07C0, 0x0FC0, 0x3F80, 0x7FFE, 0xFFFF, 0xFFFF, 
 122 0xFFFE, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0xFF80, 0x3F80, 0x0000}, 
 127 {0x0100, 0x0280, 0x0260, 0x0310, 0x018C, 0x7FE3, 0x8000, 0x8000, 
 128 0x7F80, 0x0200, 0x0380, 0x0200, 0x03C0, 0x0107, 0x01F8, 0x0000}, 
 129 {0x0100, 0x0380, 0x03E0, 0x03F0, 0x01FC, 0x7FFF, 0xFFFF, 0xFFFF, 
 130 0xFFFF, 0x03FF, 0x03FF, 0x03FF, 0x03FF, 0x01FF, 0x01F8, 0x0000}, 
 135 {0x0000, 0x4078, 0x60FC, 0x71CE, 0x7986, 0x7C06, 0x7E0E, 0x7F1C, 
 136 0x7FB8, 0x7C30, 0x6C30, 0x4600, 0x0630, 0x0330, 0x0300, 0x0000}, 
 137 {0xC078, 0xE0FC, 0xF1FE, 0xFBFF, 0xFFCF, 0xFF8F, 0xFF1F, 0xFFBE, 
 138 0xFFFC, 0xFE78, 0xFF78, 0xEFF8, 0xCFF8, 0x87F8, 0x07F8, 0x0300}, 
 143 {0x0000, 0x0002, 0x0006, 0x000E, 0x001E, 0x003E, 0x007E, 0x00FE, 
 144 0x01FE, 0x003E, 0x0036, 0x0062, 0x0060, 0x00C0, 0x00C0, 0x0000}, 
 145 {0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 
 146 0x03FF, 0x07FF, 0x007F, 0x00F7, 0x00F3, 0x01E1, 0x01E0, 0x01C0}, 
 151 {0x0000, 0x0080, 0x01C0, 0x03E0, 0x0080, 0x0080, 0x0080, 0x1FFC, 
 152 0x1FFC, 0x0080, 0x0080, 0x0080, 0x03E0, 0x01C0, 0x0080, 0x0000}, 
 153 {0x0080, 0x01C0, 0x03E0, 0x07F0, 0x0FF8, 0x01C0, 0x3FFE, 0x3FFE, 
 154 0x3FFE, 0x3FFE, 0x01C0, 0x0FF8, 0x07F0, 0x03E0, 0x01C0, 0x0080}, 
 159 {0x0000, 0x0080, 0x01C0, 0x03E0, 0x0080, 0x0888, 0x188C, 0x3FFE, 
 160 0x188C, 0x0888, 0x0080, 0x03E0, 0x01C0, 0x0080, 0x0000, 0x0000}, 
 161 {0x0080, 0x01C0, 0x03E0, 0x07F0, 0x0BE8, 0x1DDC, 0x3FFE, 0x7FFF, 
 162 0x3FFE, 0x1DDC, 0x0BE8, 0x07F0, 0x03E0, 0x01C0, 0x0080, 0x0000}, 
 167 {0x0000, 0x001E, 0x000E, 0x060E, 0x0712, 0x03A0, 0x01C0, 0x00E0, 
 168 0x0170, 0x1238, 0x1C18, 0x1C00, 0x1E00, 0x0000, 0x0000, 0x0000}, 
 169 {0x007F, 0x003F, 0x0E1F, 0x0F0F, 0x0F97, 0x07E3, 0x03E1, 0x21F0, 
 170 0x31F8, 0x3A7C, 0x3C3C, 0x3E1C, 0x3F00, 0x3F80, 0x0000, 0x0000}, 
 175 {0x0000, 0x7800, 0x7000, 0x7060, 0x48E0, 0x05C0, 0x0380, 0x0700, 
 176 0x0E80, 0x1C48, 0x1838, 0x0038, 0x0078, 0x0000, 0x0000, 0x0000}, 
 177 {0xFE00, 0xFC00, 0xF870, 0xF0F0, 0xE9F0, 0xC7E0, 0x87C0, 0x0F84, 
 178 0x1F8C, 0x3E5C, 0x3C3C, 0x387C, 0x00FC, 0x01FC, 0x0000, 0x0000}, 
 183 {0x0006, 0x000E, 0x001C, 0x0018, 0x0020, 0x0040, 0x00F8, 0x0004, 
 184 0x1FF4, 0x200C, 0x2AA8, 0x1FF0, 0x1F80, 0x3800, 0x6000, 0x8000}, 
 185 {0x000F, 0x001F, 0x003E, 0x007C, 0x0070, 0x00E0, 0x01FC, 0x3FF6, 
 186 0x7FF6, 0x7FFE, 0x7FFC, 0x7FF8, 0x3FF0, 0x7FC0, 0xF800, 0xE000}, 
 192 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 
) ; 
 212 wxCursorRefData::wxCursorRefData() 
 217     m_disposeHandle 
= false; 
 218     m_releaseHandle 
= false; 
 219     m_isColorCursor 
= false; 
 224 wxCursorRefData::wxCursorRefData(const wxCursorRefData
& cursor
) 
 226     // FIXME: need to copy the cursor 
 232     m_disposeHandle 
= false; 
 233     m_releaseHandle 
= false; 
 234     m_isColorCursor 
= cursor
.m_isColorCursor
; 
 235     m_themeCursor 
= cursor
.m_themeCursor
; 
 239 wxCursorRefData::~wxCursorRefData() 
 243         wxMacCocoaRelease(m_hCursor
); 
 245     if ( m_isColorCursor 
) 
 248                ::DisposeCCursor( (CCrsrHandle
) m_hCursor 
) ; 
 251     else if ( m_disposeHandle 
) 
 253         ::DisposeHandle( (Handle 
) m_hCursor 
) ; 
 255     else if ( m_releaseHandle 
) 
 257         // we don't release the resource since it may already 
 267 wxCursor::wxCursor(const char WXUNUSED(bits
)[], int WXUNUSED(width
), int WXUNUSED(height
), 
 268     int WXUNUSED(hotSpotX
), int WXUNUSED(hotSpotY
), const char WXUNUSED(maskBits
)[]) 
 272 wxCursor::wxCursor( const wxImage 
&image 
) 
 275     CreateFromImage( image 
) ; 
 279 wxCursor::wxCursor(const char* const* bits
) 
 281     (void) CreateFromXpm(bits
); 
 284 wxGDIRefData 
*wxCursor::CreateGDIRefData() const 
 286     return new wxCursorRefData
; 
 289 wxGDIRefData 
*wxCursor::CloneGDIRefData(const wxGDIRefData 
*data
) const 
 291     return new wxCursorRefData(*wx_static_cast(const wxCursorRefData 
*, data
)); 
 294 bool wxCursor::CreateFromXpm(const char* const* bits
) 
 297     wxCHECK_MSG( bits 
!= NULL
, false, wxT("invalid cursor data") ); 
 298     wxXPMDecoder decoder
; 
 299     wxImage img 
= decoder
.ReadData(bits
); 
 300     wxCHECK_MSG( img
.Ok(), false, wxT("invalid cursor data") ); 
 301     CreateFromImage( img 
) ; 
 308 WXHCURSOR 
wxCursor::GetHCURSOR() const 
 310     return (M_CURSORDATA 
? M_CURSORDATA
->m_hCursor 
: 0); 
 314 short GetCTabIndex( CTabHandle colors 
, RGBColor 
*col 
) 
 317     unsigned long bestdiff 
= 0xFFFF ; 
 319     for ( int i 
= 0 ; i 
< (**colors
).ctSize 
; ++i 
) 
 321         unsigned long diff 
= abs(col
->red 
-  (**colors
).ctTable
[i
].rgb
.red 
) + 
 322             abs(col
->green 
-  (**colors
).ctTable
[i
].rgb
.green 
) + 
 323             abs(col
->blue 
-  (**colors
).ctTable
[i
].rgb
.blue 
) ; 
 325         if ( diff 
< bestdiff 
) 
 328             retval 
= (**colors
).ctTable
[i
].value 
; 
 338 void wxCursor::CreateFromImage(const wxImage 
& image
) 
 340     m_refData 
= new wxCursorRefData
; 
 341     int hotSpotX 
= image
.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X
); 
 342     int hotSpotY 
= image
.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y
); 
 344     wxBitmap 
bmp( image 
); 
 345     CGImageRef cgimage 
= wxMacCreateCGImageFromBitmap(bmp
); 
 348         M_CURSORDATA
->m_hCursor 
= wxMacCocoaCreateCursorFromCGImage( cgimage
, hotSpotX
, hotSpotY 
);  
 349         CFRelease( cgimage 
); 
 356     int image_w 
= image
.GetWidth(); 
 357     int image_h 
= image
.GetHeight(); 
 359     wxASSERT_MSG( hotSpotX 
>= 0 && hotSpotX 
< image_w 
&& 
 360                   hotSpotY 
>= 0 && hotSpotY 
< image_h
, 
 361                   wxT("invalid cursor hot spot coordinates") ); 
 363     wxImage 
image16(image
); // final image of correct size 
 365     // if image is too small then place it in the center, resize it if too big 
 366     if ((w 
> image_w
) && (h 
> image_h
)) 
 368         wxPoint 
offset((w 
- image_w
) / 2, (h 
- image_h
) / 2); 
 369         hotSpotX 
= hotSpotX 
+ offset
.x
; 
 370         hotSpotY 
= hotSpotY 
+ offset
.y
; 
 372         image16 
= image
.Size(wxSize(w
, h
), offset
); 
 374     else if ((w 
!= image_w
) || (h 
!= image_h
)) 
 376         hotSpotX 
= int(hotSpotX 
* double(w
) / double(image_w
)); 
 377         hotSpotY 
= int(hotSpotY 
* double(h
) / double(image_h
)); 
 379         image16 
= image
.Scale(w
, h
); 
 382     unsigned char * rgbBits 
= image16
.GetData(); 
 383     bool bHasMask 
= image16
.HasMask() ; 
 385     PixMapHandle pm 
= (PixMapHandle
) NewHandleClear( sizeof(PixMap
) )  ; 
 387     short bytesPerPixel 
= 1 ; 
 389     Rect bounds 
= { 0 , 0 , extent 
, extent 
} ; 
 390     CCrsrHandle ch 
= (CCrsrHandle
) NewHandleClear( sizeof(CCrsr
) ) ; 
 391     CTabHandle newColors 
= GetCTable( 8 ) ; 
 392     HandToHand( (Handle 
*) &newColors 
); 
 394     // set the values to the indices 
 395     for ( int i 
= 0 ; i 
< (**newColors
).ctSize 
; ++i 
) 
 397         (**newColors
).ctTable
[i
].value 
= i 
; 
 401     (**ch
).crsrType 
= 0x8001; // color cursors 
 403     short bytesPerRow 
= bytesPerPixel 
* extent
; 
 406     (**pm
).rowBytes 
= bytesPerRow 
| 0x8000; 
 407     (**pm
).bounds 
= bounds
; 
 408     (**pm
).pmVersion 
= 0; 
 411     (**pm
).hRes 
= 0x00480000; // 72 DPI default res 
 412     (**pm
).vRes 
= 0x00480000; // 72 DPI default res 
 413     (**pm
).pixelSize 
= depth
; 
 414     (**pm
).pixelType 
= 0; 
 416     (**pm
).cmpSize 
= depth
; 
 417     (**pm
).pmTable 
= newColors
; 
 419     (**ch
).crsrData 
= NewHandleClear( extent 
* bytesPerRow 
) ; 
 420     (**ch
).crsrXData 
= NULL 
; 
 421     (**ch
).crsrXValid 
= 0; 
 422     (**ch
).crsrXHandle 
= NULL
; 
 424     (**ch
).crsrHotSpot
.h 
= hotSpotX 
; 
 425     (**ch
).crsrHotSpot
.v 
= hotSpotY 
; 
 426     (**ch
).crsrXTable 
= 0 ; 
 427     (**ch
).crsrID 
= GetCTSeed() ; 
 429     memset( (**ch
).crsr1Data  
, 0 , sizeof( Bits16 
) ) ; 
 430     memset( (**ch
).crsrMask 
, 0 , sizeof( Bits16 
) ) ; 
 432     unsigned char mr 
= image16
.GetMaskRed() ; 
 433     unsigned char mg 
= image16
.GetMaskGreen() ; 
 434     unsigned char mb 
= image16
.GetMaskBlue() ; 
 436     for ( int y 
= 0 ; y 
< h 
; ++y 
) 
 438         short rowbits 
= 0, maskbits 
= 0 ; 
 440         for ( int x 
= 0 ; x 
< w 
; ++x 
) 
 442             long pos 
= (y 
* w 
+ x
) * 3; 
 444             unsigned char r 
= rgbBits
[pos
] ; 
 445             unsigned char g 
= rgbBits
[pos 
+ 1] ; 
 446             unsigned char b 
= rgbBits
[pos 
+ 2] ; 
 447             RGBColor col 
= { 0xFFFF, 0xFFFF, 0xFFFF } ; 
 449             if ( bHasMask 
&& r 
== mr 
&& g 
== mg 
&& b 
== mb 
) 
 451                 // masked area, does not appear anywhere 
 455                 if ( (int)r 
+ (int)g 
+ (int)b 
< 0x0200 ) 
 456                     rowbits 
|= ( 1 << (15 - x
) ) ; 
 458                 maskbits 
|= ( 1 << (15 - x
) ) ; 
 460                 col 
= *((RGBColor
*) wxColor( r 
, g 
, b 
).GetPixel()) ; 
 463             *((*(**ch
).crsrData
) + y 
* bytesPerRow 
+ x
) = 
 464                 GetCTabIndex( newColors 
, &col
) ; 
 466 #ifdef WORDS_BIGENDIAN 
 467         (**ch
).crsr1Data
[y
] = rowbits 
; 
 468         (**ch
).crsrMask
[y
] = maskbits 
; 
 470         (**ch
).crsr1Data
[y
] = CFSwapInt16(rowbits
) ; 
 471         (**ch
).crsrMask
[y
] = CFSwapInt16(maskbits
) ; 
 476         memcpy( (**ch
).crsrMask 
, (**ch
).crsr1Data 
, sizeof( Bits16
) ) ; 
 478     HUnlock( (Handle
)ch 
) ; 
 479     M_CURSORDATA
->m_hCursor 
= ch 
; 
 480     M_CURSORDATA
->m_isColorCursor 
= true ; 
 487 wxCursor::wxCursor(const wxString
& cursor_file
, long flags
, int hotSpotX
, int hotSpotY
) 
 489     m_refData 
= new wxCursorRefData
; 
 490     if ( flags 
== wxBITMAP_TYPE_MACCURSOR_RESOURCE 
) 
 493         wxFAIL_MSG( wxT("Not implemented") ); 
 497         wxMacStringToPascal( cursor_file 
, theName 
) ; 
 499         Handle resHandle 
= ::GetNamedResource( 'crsr' , theName 
) ; 
 505             GetResInfo( resHandle 
, &theId 
, &theType 
, theName 
) ; 
 506             ReleaseResource( resHandle 
) ; 
 508             M_CURSORDATA
->m_hCursor 
= GetCCursor( theId 
) ; 
 509             if ( M_CURSORDATA
->m_hCursor 
) 
 510                 M_CURSORDATA
->m_isColorCursor 
= true ; 
 514             Handle resHandle 
= ::GetNamedResource( 'CURS' , theName 
) ; 
 520                 GetResInfo( resHandle 
, &theId 
, &theType 
, theName 
) ; 
 521                 ReleaseResource( resHandle 
) ; 
 523                 M_CURSORDATA
->m_hCursor 
= GetCursor( theId 
) ; 
 524                 if ( M_CURSORDATA
->m_hCursor 
) 
 525                     M_CURSORDATA
->m_releaseHandle 
= true ; 
 535         image
.LoadFile( cursor_file
, flags 
) ; 
 538             image
.SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_X
, hotSpotX 
) ; 
 539             image
.SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_Y
, hotSpotY 
) ; 
 540             m_refData
->DecRef() ; 
 542             CreateFromImage( image 
) ; 
 548 // Cursors by stock number 
 549 wxCursor::wxCursor(int cursor_type
) 
 551     m_refData 
= new wxCursorRefData
; 
 553     M_CURSORDATA
->m_hCursor 
= wxMacCocoaCreateStockCursor( cursor_type 
); 
 557     case wxCURSOR_COPY_ARROW
: 
 558         M_CURSORDATA
->m_themeCursor 
= kThemeCopyArrowCursor
; 
 562         M_CURSORDATA
->m_themeCursor 
= kThemeWatchCursor
; 
 566         M_CURSORDATA
->m_themeCursor 
= kThemeIBeamCursor
; 
 570         M_CURSORDATA
->m_themeCursor 
= kThemeCrossCursor
; 
 573     case wxCURSOR_SIZENWSE
: 
 574         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorSizeNWSE
); 
 577     case wxCURSOR_SIZENESW
: 
 578         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorSizeNESW
); 
 581     case wxCURSOR_SIZEWE
: 
 582         M_CURSORDATA
->m_themeCursor 
= kThemeResizeLeftRightCursor
; 
 585     case wxCURSOR_SIZENS
: 
 586         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorSizeNS
); 
 589     case wxCURSOR_SIZING
: 
 590         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorSize
); 
 594         M_CURSORDATA
->m_themeCursor 
= kThemePointingHandCursor
; 
 597     case wxCURSOR_BULLSEYE
: 
 598         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorBullseye
); 
 601     case wxCURSOR_PENCIL
: 
 602         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorPencil
); 
 605     case wxCURSOR_MAGNIFIER
: 
 606         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorMagnifier
); 
 609     case wxCURSOR_NO_ENTRY
: 
 610         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorNoEntry
); 
 614         M_CURSORDATA
->m_themeCursor 
= kThemeWatchCursor
; 
 617     case wxCURSOR_PAINT_BRUSH
: 
 618         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorPaintBrush
); 
 621     case wxCURSOR_POINT_LEFT
: 
 622         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorPointLeft
); 
 625     case wxCURSOR_POINT_RIGHT
: 
 626         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorPointRight
); 
 629     case wxCURSOR_QUESTION_ARROW
: 
 630         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorQuestionArrow
); 
 634         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorBlank
); 
 637     case wxCURSOR_RIGHT_ARROW
: 
 638         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorRightArrow
); 
 641     case wxCURSOR_SPRAYCAN
: 
 642         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorRoller
); 
 647     case wxCURSOR_LEFT_BUTTON
: 
 648     case wxCURSOR_RIGHT_BUTTON
: 
 649     case wxCURSOR_MIDDLE_BUTTON
: 
 651         M_CURSORDATA
->m_themeCursor 
= kThemeArrowCursor
; 
 655     if ( M_CURSORDATA
->m_themeCursor 
== -1 ) 
 656         M_CURSORDATA
->m_releaseHandle 
= true; 
 660 void wxCursor::MacInstall() const 
 662     gMacCurrentCursor 
= *this ; 
 665         wxMacCocoaSetCursor( M_CURSORDATA
->m_hCursor 
); 
 667     if ( m_refData 
&& M_CURSORDATA
->m_themeCursor 
!= -1 ) 
 669         SetThemeCursor( M_CURSORDATA
->m_themeCursor 
) ; 
 671     else if ( m_refData 
&& M_CURSORDATA
->m_hCursor 
) 
 674        if ( M_CURSORDATA
->m_isColorCursor 
) 
 675             ::SetCCursor( (CCrsrHandle
) M_CURSORDATA
->m_hCursor 
) ; 
 677             ::SetCursor( * (CursHandle
) M_CURSORDATA
->m_hCursor 
) ; 
 682         SetThemeCursor( kThemeArrowCursor 
) ; 
 687 wxCursor::~wxCursor() 
 691 // Global cursor setting 
 692 wxCursor gGlobalCursor
; 
 693 void wxSetCursor(const wxCursor
& cursor
) 
 695     cursor
.MacInstall() ; 
 696     gGlobalCursor 
= cursor
;