1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/osx/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/osx/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 wxOSX_USE_COCOA_OR_CARBON 
  40         if ( m_hCursor 
!= NULL 
) 
  43         if ( m_themeCursor 
!= -1 ) 
  49         // in order to avoid asserts, always claim to have a valid cursor 
  56     WX_NSCursor m_hCursor
; 
  57 #elif wxOSX_USE_CARBON 
  63 #elif wxOSX_USE_IPHONE 
  67     friend class wxCursor
; 
  69     wxDECLARE_NO_ASSIGN_CLASS(wxCursorRefData
); 
  72 #define M_CURSORDATA static_cast<wxCursorRefData*>(m_refData) 
  74 #if wxOSX_USE_COCOA_OR_CARBON 
  76 ClassicCursor gMacCursors
[kwxCursorLast
+1] = 
  80 {0x0000, 0x03E0, 0x0630, 0x0808, 0x1004, 0x31C6, 0x2362, 0x2222, 
  81 0x2362, 0x31C6, 0x1004, 0x0808, 0x0630, 0x03E0, 0x0000, 0x0000}, 
  82 {0x0000, 0x03E0, 0x07F0, 0x0FF8, 0x1FFC, 0x3FFE, 0x3FFE, 0x3FFE, 
  83 0x3FFE, 0x3FFE, 0x1FFC, 0x0FF8, 0x07F0, 0x03E0, 0x0000, 0x0000}, 
  88 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
  89 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, 
  90 {0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
  91 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000}, 
  96 {0x00F0, 0x0088, 0x0108, 0x0190, 0x0270, 0x0220, 0x0440, 0x0440, 
  97 0x0880, 0x0880, 0x1100, 0x1E00, 0x1C00, 0x1800, 0x1000, 0x0000}, 
  98 {0x00F0, 0x00F8, 0x01F8, 0x01F0, 0x03F0, 0x03E0, 0x07C0, 0x07C0, 
  99 0x0F80, 0x0F80, 0x1F00, 0x1E00, 0x1C00, 0x1800, 0x1000, 0x0000}, 
 104 {0x0000, 0x1E00, 0x2100, 0x4080, 0x4080, 0x4080, 0x4080, 0x2180, 
 105 0x1FC0, 0x00E0, 0x0070, 0x0038, 0x001C, 0x000E, 0x0006, 0x0000}, 
 106 {0x3F00, 0x7F80, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0x7FC0, 
 107 0x3FE0, 0x1FF0, 0x00F8, 0x007C, 0x003E, 0x001F, 0x000F, 0x0007}, 
 112 {0x0000, 0x07E0, 0x1FF0, 0x3838, 0x3C0C, 0x6E0E, 0x6706, 0x6386, 
 113 0x61C6, 0x60E6, 0x7076, 0x303C, 0x1C1C, 0x0FF8, 0x07E0, 0x0000}, 
 114 {0x0540, 0x0FF0, 0x3FF8, 0x3C3C, 0x7E0E, 0xFF0F, 0x6F86, 0xE7C7, 
 115 0x63E6, 0xE1F7, 0x70FE, 0x707E, 0x3C3C, 0x1FFC, 0x0FF0, 0x0540}, 
 120 {0x0000, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0FE0, 
 121 0x1FF0, 0x1FF0, 0x0000, 0x1FF0, 0x1FF0, 0x1550, 0x1550, 0x1550}, 
 122 {0x07C0, 0x07C0, 0x07C0, 0x07C0, 0x07C0, 0x07C0, 0x0FE0, 0x1FF0, 
 123 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8}, 
 128 {0x00C0, 0x0140, 0x0640, 0x08C0, 0x3180, 0x47FE, 0x8001, 0x8001, 
 129 0x81FE, 0x8040, 0x01C0, 0x0040, 0x03C0, 0xC080, 0x3F80, 0x0000}, 
 130 {0x00C0, 0x01C0, 0x07C0, 0x0FC0, 0x3F80, 0x7FFE, 0xFFFF, 0xFFFF, 
 131 0xFFFE, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0xFF80, 0x3F80, 0x0000}, 
 136 {0x0100, 0x0280, 0x0260, 0x0310, 0x018C, 0x7FE3, 0x8000, 0x8000, 
 137 0x7F80, 0x0200, 0x0380, 0x0200, 0x03C0, 0x0107, 0x01F8, 0x0000}, 
 138 {0x0100, 0x0380, 0x03E0, 0x03F0, 0x01FC, 0x7FFF, 0xFFFF, 0xFFFF, 
 139 0xFFFF, 0x03FF, 0x03FF, 0x03FF, 0x03FF, 0x01FF, 0x01F8, 0x0000}, 
 144 {0x0000, 0x4078, 0x60FC, 0x71CE, 0x7986, 0x7C06, 0x7E0E, 0x7F1C, 
 145 0x7FB8, 0x7C30, 0x6C30, 0x4600, 0x0630, 0x0330, 0x0300, 0x0000}, 
 146 {0xC078, 0xE0FC, 0xF1FE, 0xFBFF, 0xFFCF, 0xFF8F, 0xFF1F, 0xFFBE, 
 147 0xFFFC, 0xFE78, 0xFF78, 0xEFF8, 0xCFF8, 0x87F8, 0x07F8, 0x0300}, 
 152 {0x0000, 0x0002, 0x0006, 0x000E, 0x001E, 0x003E, 0x007E, 0x00FE, 
 153 0x01FE, 0x003E, 0x0036, 0x0062, 0x0060, 0x00C0, 0x00C0, 0x0000}, 
 154 {0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 
 155 0x03FF, 0x07FF, 0x007F, 0x00F7, 0x00F3, 0x01E1, 0x01E0, 0x01C0}, 
 160 {0x0000, 0x0080, 0x01C0, 0x03E0, 0x0080, 0x0080, 0x0080, 0x1FFC, 
 161 0x1FFC, 0x0080, 0x0080, 0x0080, 0x03E0, 0x01C0, 0x0080, 0x0000}, 
 162 {0x0080, 0x01C0, 0x03E0, 0x07F0, 0x0FF8, 0x01C0, 0x3FFE, 0x3FFE, 
 163 0x3FFE, 0x3FFE, 0x01C0, 0x0FF8, 0x07F0, 0x03E0, 0x01C0, 0x0080}, 
 168 {0x0000, 0x0080, 0x01C0, 0x03E0, 0x0080, 0x0888, 0x188C, 0x3FFE, 
 169 0x188C, 0x0888, 0x0080, 0x03E0, 0x01C0, 0x0080, 0x0000, 0x0000}, 
 170 {0x0080, 0x01C0, 0x03E0, 0x07F0, 0x0BE8, 0x1DDC, 0x3FFE, 0x7FFF, 
 171 0x3FFE, 0x1DDC, 0x0BE8, 0x07F0, 0x03E0, 0x01C0, 0x0080, 0x0000}, 
 176 {0x0000, 0x001E, 0x000E, 0x060E, 0x0712, 0x03A0, 0x01C0, 0x00E0, 
 177 0x0170, 0x1238, 0x1C18, 0x1C00, 0x1E00, 0x0000, 0x0000, 0x0000}, 
 178 {0x007F, 0x003F, 0x0E1F, 0x0F0F, 0x0F97, 0x07E3, 0x03E1, 0x21F0, 
 179 0x31F8, 0x3A7C, 0x3C3C, 0x3E1C, 0x3F00, 0x3F80, 0x0000, 0x0000}, 
 184 {0x0000, 0x7800, 0x7000, 0x7060, 0x48E0, 0x05C0, 0x0380, 0x0700, 
 185 0x0E80, 0x1C48, 0x1838, 0x0038, 0x0078, 0x0000, 0x0000, 0x0000}, 
 186 {0xFE00, 0xFC00, 0xF870, 0xF0F0, 0xE9F0, 0xC7E0, 0x87C0, 0x0F84, 
 187 0x1F8C, 0x3E5C, 0x3C3C, 0x387C, 0x00FC, 0x01FC, 0x0000, 0x0000}, 
 192 {0x0006, 0x000E, 0x001C, 0x0018, 0x0020, 0x0040, 0x00F8, 0x0004, 
 193 0x1FF4, 0x200C, 0x2AA8, 0x1FF0, 0x1F80, 0x3800, 0x6000, 0x8000}, 
 194 {0x000F, 0x001F, 0x003E, 0x007C, 0x0070, 0x00E0, 0x01FC, 0x3FF6, 
 195 0x7FF6, 0x7FFE, 0x7FFC, 0x7FF8, 0x3FF0, 0x7FC0, 0xF800, 0xE000}, 
 203 wxCursor    gMacCurrentCursor 
; 
 206 CursHandle 
wxGetStockCursor( int number 
) 
 208     wxASSERT_MSG( number 
>= 0 && number 
<=kwxCursorLast 
, wxT("invalid stock cursor id") ) ; 
 209     CursHandle c 
= (CursHandle
) NewHandle( sizeof(Cursor
) ) ; 
 210     memcpy( *c
, &gMacCursors
[number
], sizeof(Cursor
) ) ; 
 212 #ifndef WORDS_BIGENDIAN 
 213     short *sptr 
= (short*) *c 
; 
 214     for ( int i 
= 0 ; i 
< 2 * 16 /* image and mask */ ; ++i
, ++sptr 
) 
 216         *sptr 
= CFSwapInt16( *sptr 
) ; 
 223 wxCursorRefData::wxCursorRefData() 
 227     m_disposeHandle 
= false; 
 228     m_releaseHandle 
= false; 
 229     m_isColorCursor 
= false; 
 234 wxCursorRefData::wxCursorRefData(const wxCursorRefData
& cursor
) 
 236     // FIXME: need to copy the cursor 
 241 #elif wxOSX_USE_CARBON 
 242     m_disposeHandle 
= false; 
 243     m_releaseHandle 
= false; 
 244     m_isColorCursor 
= cursor
.m_isColorCursor
; 
 245     m_themeCursor 
= cursor
.m_themeCursor
; 
 249 wxCursorRefData::~wxCursorRefData() 
 253         wxMacCocoaRelease(m_hCursor
); 
 254 #elif wxOSX_USE_CARBON 
 255     if ( m_isColorCursor 
) 
 258                ::DisposeCCursor( (CCrsrHandle
) m_hCursor 
) ; 
 261     else if ( m_disposeHandle 
) 
 263         ::DisposeHandle( (Handle 
) m_hCursor 
) ; 
 265     else if ( m_releaseHandle 
) 
 267         // we don't release the resource since it may already 
 277 wxCursor::wxCursor( const wxImage 
&image 
) 
 280     CreateFromImage( image 
) ; 
 284 wxCursor::wxCursor(const char* const* bits
) 
 286     (void) CreateFromXpm(bits
); 
 289 wxGDIRefData 
*wxCursor::CreateGDIRefData() const 
 291     return new wxCursorRefData
; 
 294 wxGDIRefData 
*wxCursor::CloneGDIRefData(const wxGDIRefData 
*data
) const 
 296     return new wxCursorRefData(*static_cast<const wxCursorRefData 
*>(data
)); 
 299 bool wxCursor::CreateFromXpm(const char* const* bits
) 
 302     wxCHECK_MSG( bits 
!= NULL
, false, wxT("invalid cursor data") ); 
 303     wxXPMDecoder decoder
; 
 304     wxImage img 
= decoder
.ReadData(bits
); 
 305     wxCHECK_MSG( img
.Ok(), false, wxT("invalid cursor data") ); 
 306     CreateFromImage( img 
) ; 
 313 WXHCURSOR 
wxCursor::GetHCURSOR() const 
 315     return (M_CURSORDATA 
? M_CURSORDATA
->m_hCursor 
: 0); 
 319 short GetCTabIndex( CTabHandle colors 
, RGBColor 
*col 
) 
 322     unsigned long bestdiff 
= 0xFFFF ; 
 324     for ( int i 
= 0 ; i 
< (**colors
).ctSize 
; ++i 
) 
 326         unsigned long diff 
= abs(col
->red 
-  (**colors
).ctTable
[i
].rgb
.red 
) + 
 327             abs(col
->green 
-  (**colors
).ctTable
[i
].rgb
.green 
) + 
 328             abs(col
->blue 
-  (**colors
).ctTable
[i
].rgb
.blue 
) ; 
 330         if ( diff 
< bestdiff 
) 
 333             retval 
= (**colors
).ctTable
[i
].value 
; 
 343 void wxCursor::CreateFromImage(const wxImage 
& image
) 
 345     m_refData 
= new wxCursorRefData
; 
 346     int hotSpotX 
= image
.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X
); 
 347     int hotSpotY 
= image
.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y
); 
 349     wxBitmap 
bmp( image 
); 
 350     CGImageRef cgimage 
= wxMacCreateCGImageFromBitmap(bmp
); 
 353         M_CURSORDATA
->m_hCursor 
= wxMacCocoaCreateCursorFromCGImage( cgimage
, hotSpotX
, hotSpotY 
); 
 354         CFRelease( cgimage 
); 
 356 #elif wxOSX_USE_CARBON 
 361     int image_w 
= image
.GetWidth(); 
 362     int image_h 
= image
.GetHeight(); 
 364     wxASSERT_MSG( hotSpotX 
>= 0 && hotSpotX 
< image_w 
&& 
 365                   hotSpotY 
>= 0 && hotSpotY 
< image_h
, 
 366                   wxT("invalid cursor hot spot coordinates") ); 
 368     wxImage 
image16(image
); // final image of correct size 
 370     // if image is too small then place it in the center, resize it if too big 
 371     if ((w 
> image_w
) && (h 
> image_h
)) 
 373         wxPoint 
offset((w 
- image_w
) / 2, (h 
- image_h
) / 2); 
 374         hotSpotX 
= hotSpotX 
+ offset
.x
; 
 375         hotSpotY 
= hotSpotY 
+ offset
.y
; 
 377         image16 
= image
.Size(wxSize(w
, h
), offset
); 
 379     else if ((w 
!= image_w
) || (h 
!= image_h
)) 
 381         hotSpotX 
= int(hotSpotX 
* double(w
) / double(image_w
)); 
 382         hotSpotY 
= int(hotSpotY 
* double(h
) / double(image_h
)); 
 384         image16 
= image
.Scale(w
, h
); 
 387     unsigned char * rgbBits 
= image16
.GetData(); 
 388     bool bHasMask 
= image16
.HasMask() ; 
 390     PixMapHandle pm 
= (PixMapHandle
) NewHandleClear( sizeof(PixMap
) )  ; 
 392     short bytesPerPixel 
= 1 ; 
 394     Rect bounds 
= { 0 , 0 , extent 
, extent 
} ; 
 395     CCrsrHandle ch 
= (CCrsrHandle
) NewHandleClear( sizeof(CCrsr
) ) ; 
 396     CTabHandle newColors 
= GetCTable( 8 ) ; 
 397     HandToHand( (Handle 
*) &newColors 
); 
 399     // set the values to the indices 
 400     for ( int i 
= 0 ; i 
< (**newColors
).ctSize 
; ++i 
) 
 402         (**newColors
).ctTable
[i
].value 
= i 
; 
 406     (**ch
).crsrType 
= 0x8001; // color cursors 
 408     short bytesPerRow 
= bytesPerPixel 
* extent
; 
 411     (**pm
).rowBytes 
= bytesPerRow 
| 0x8000; 
 412     (**pm
).bounds 
= bounds
; 
 413     (**pm
).pmVersion 
= 0; 
 416     (**pm
).hRes 
= 0x00480000; // 72 DPI default res 
 417     (**pm
).vRes 
= 0x00480000; // 72 DPI default res 
 418     (**pm
).pixelSize 
= depth
; 
 419     (**pm
).pixelType 
= 0; 
 421     (**pm
).cmpSize 
= depth
; 
 422     (**pm
).pmTable 
= newColors
; 
 424     (**ch
).crsrData 
= NewHandleClear( extent 
* bytesPerRow 
) ; 
 425     (**ch
).crsrXData 
= NULL 
; 
 426     (**ch
).crsrXValid 
= 0; 
 427     (**ch
).crsrXHandle 
= NULL
; 
 429     (**ch
).crsrHotSpot
.h 
= hotSpotX 
; 
 430     (**ch
).crsrHotSpot
.v 
= hotSpotY 
; 
 431     (**ch
).crsrXTable 
= 0 ; 
 432     (**ch
).crsrID 
= GetCTSeed() ; 
 434     memset( (**ch
).crsr1Data  
, 0 , sizeof( Bits16 
) ) ; 
 435     memset( (**ch
).crsrMask 
, 0 , sizeof( Bits16 
) ) ; 
 437     unsigned char mr 
= image16
.GetMaskRed() ; 
 438     unsigned char mg 
= image16
.GetMaskGreen() ; 
 439     unsigned char mb 
= image16
.GetMaskBlue() ; 
 441     for ( int y 
= 0 ; y 
< h 
; ++y 
) 
 443         short rowbits 
= 0, maskbits 
= 0 ; 
 445         for ( int x 
= 0 ; x 
< w 
; ++x 
) 
 447             long pos 
= (y 
* w 
+ x
) * 3; 
 449             unsigned char r 
= rgbBits
[pos
] ; 
 450             unsigned char g 
= rgbBits
[pos 
+ 1] ; 
 451             unsigned char b 
= rgbBits
[pos 
+ 2] ; 
 452             RGBColor col 
= { 0xFFFF, 0xFFFF, 0xFFFF } ; 
 454             if ( bHasMask 
&& r 
== mr 
&& g 
== mg 
&& b 
== mb 
) 
 456                 // masked area, does not appear anywhere 
 460                 if ( (int)r 
+ (int)g 
+ (int)b 
< 0x0200 ) 
 461                     rowbits 
|= ( 1 << (15 - x
) ) ; 
 463                 maskbits 
|= ( 1 << (15 - x
) ) ; 
 465                 wxColor( r 
, g 
, b 
).GetRGBColor( &col 
); 
 468             *((*(**ch
).crsrData
) + y 
* bytesPerRow 
+ x
) = 
 469                 GetCTabIndex( newColors 
, &col
) ; 
 471 #ifdef WORDS_BIGENDIAN 
 472         (**ch
).crsr1Data
[y
] = rowbits 
; 
 473         (**ch
).crsrMask
[y
] = maskbits 
; 
 475         (**ch
).crsr1Data
[y
] = CFSwapInt16(rowbits
) ; 
 476         (**ch
).crsrMask
[y
] = CFSwapInt16(maskbits
) ; 
 481         memcpy( (**ch
).crsrMask 
, (**ch
).crsr1Data 
, sizeof( Bits16
) ) ; 
 483     HUnlock( (Handle
)ch 
) ; 
 484     M_CURSORDATA
->m_hCursor 
= ch 
; 
 485     M_CURSORDATA
->m_isColorCursor 
= true ; 
 492 wxCursor::wxCursor(const wxString
& cursor_file
, wxBitmapType flags
, int hotSpotX
, int hotSpotY
) 
 494     m_refData 
= new wxCursorRefData
; 
 495     if ( flags 
== wxBITMAP_TYPE_MACCURSOR_RESOURCE 
) 
 498         wxFAIL_MSG( wxT("Not implemented") ); 
 499 #elif wxOSX_USE_CARBON 
 502         wxMacStringToPascal( cursor_file 
, theName 
) ; 
 504         Handle resHandle 
= ::GetNamedResource( 'crsr' , theName 
) ; 
 510             GetResInfo( resHandle 
, &theId 
, &theType 
, theName 
) ; 
 511             ReleaseResource( resHandle 
) ; 
 513             M_CURSORDATA
->m_hCursor 
= GetCCursor( theId 
) ; 
 514             if ( M_CURSORDATA
->m_hCursor 
) 
 515                 M_CURSORDATA
->m_isColorCursor 
= true ; 
 519             Handle resHandle 
= ::GetNamedResource( 'CURS' , theName 
) ; 
 525                 GetResInfo( resHandle 
, &theId 
, &theType 
, theName 
) ; 
 526                 ReleaseResource( resHandle 
) ; 
 528                 M_CURSORDATA
->m_hCursor 
= GetCursor( theId 
) ; 
 529                 if ( M_CURSORDATA
->m_hCursor 
) 
 530                     M_CURSORDATA
->m_releaseHandle 
= true ; 
 540         image
.LoadFile( cursor_file
, flags 
) ; 
 543             image
.SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_X
, hotSpotX 
) ; 
 544             image
.SetOption( wxIMAGE_OPTION_CUR_HOTSPOT_Y
, hotSpotY 
) ; 
 545             m_refData
->DecRef() ; 
 547             CreateFromImage( image 
) ; 
 553 // Cursors by stock number 
 554 void wxCursor::InitFromStock(wxStockCursor cursor_type
) 
 556     m_refData 
= new wxCursorRefData
; 
 558     M_CURSORDATA
->m_hCursor 
= wxMacCocoaCreateStockCursor( cursor_type 
); 
 559 #elif wxOSX_USE_CARBON 
 562     case wxCURSOR_COPY_ARROW
: 
 563         M_CURSORDATA
->m_themeCursor 
= kThemeCopyArrowCursor
; 
 567         M_CURSORDATA
->m_themeCursor 
= kThemeWatchCursor
; 
 571         M_CURSORDATA
->m_themeCursor 
= kThemeIBeamCursor
; 
 575         M_CURSORDATA
->m_themeCursor 
= kThemeCrossCursor
; 
 578     case wxCURSOR_SIZENWSE
: 
 579         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorSizeNWSE
); 
 582     case wxCURSOR_SIZENESW
: 
 583         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorSizeNESW
); 
 586     case wxCURSOR_SIZEWE
: 
 587         M_CURSORDATA
->m_themeCursor 
= kThemeResizeLeftRightCursor
; 
 590     case wxCURSOR_SIZENS
: 
 591         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorSizeNS
); 
 594     case wxCURSOR_SIZING
: 
 595         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorSize
); 
 599         M_CURSORDATA
->m_themeCursor 
= kThemePointingHandCursor
; 
 602     case wxCURSOR_BULLSEYE
: 
 603         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorBullseye
); 
 606     case wxCURSOR_PENCIL
: 
 607         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorPencil
); 
 610     case wxCURSOR_MAGNIFIER
: 
 611         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorMagnifier
); 
 614     case wxCURSOR_NO_ENTRY
: 
 615         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorNoEntry
); 
 619         M_CURSORDATA
->m_themeCursor 
= kThemeWatchCursor
; 
 622     case wxCURSOR_PAINT_BRUSH
: 
 623         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorPaintBrush
); 
 626     case wxCURSOR_POINT_LEFT
: 
 627         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorPointLeft
); 
 630     case wxCURSOR_POINT_RIGHT
: 
 631         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorPointRight
); 
 634     case wxCURSOR_QUESTION_ARROW
: 
 635         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorQuestionArrow
); 
 639         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorBlank
); 
 642     case wxCURSOR_RIGHT_ARROW
: 
 643         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorRightArrow
); 
 646     case wxCURSOR_SPRAYCAN
: 
 647         M_CURSORDATA
->m_hCursor 
= wxGetStockCursor(kwxCursorRoller
); 
 650     case wxCURSOR_OPEN_HAND
: 
 651         M_CURSORDATA
->m_themeCursor 
= kThemeOpenHandCursor
; 
 654     case wxCURSOR_CLOSED_HAND
: 
 655         M_CURSORDATA
->m_themeCursor 
= kThemeClosedHandCursor
; 
 660     case wxCURSOR_LEFT_BUTTON
: 
 661     case wxCURSOR_RIGHT_BUTTON
: 
 662     case wxCURSOR_MIDDLE_BUTTON
: 
 664         M_CURSORDATA
->m_themeCursor 
= kThemeArrowCursor
; 
 668     if ( M_CURSORDATA
->m_themeCursor 
== -1 ) 
 669         M_CURSORDATA
->m_releaseHandle 
= true; 
 673 void wxCursor::MacInstall() const 
 675     gMacCurrentCursor 
= *this ; 
 678         wxMacCocoaSetCursor( M_CURSORDATA
->m_hCursor 
); 
 679 #elif wxOSX_USE_CARBON 
 680     if ( m_refData 
&& M_CURSORDATA
->m_themeCursor 
!= -1 ) 
 682         SetThemeCursor( M_CURSORDATA
->m_themeCursor 
) ; 
 684     else if ( m_refData 
&& M_CURSORDATA
->m_hCursor 
) 
 687        if ( M_CURSORDATA
->m_isColorCursor 
) 
 688             ::SetCCursor( (CCrsrHandle
) M_CURSORDATA
->m_hCursor 
) ; 
 690             ::SetCursor( * (CursHandle
) M_CURSORDATA
->m_hCursor 
) ; 
 695         SetThemeCursor( kThemeArrowCursor 
) ; 
 700 wxCursor::~wxCursor() 
 704 // Global cursor setting 
 705 wxCursor gGlobalCursor
; 
 706 void wxSetCursor(const wxCursor
& cursor
) 
 708     cursor
.MacInstall() ; 
 709     gGlobalCursor 
= cursor
;