resource fork not used anymore
[wxWidgets.git] / src / mac / carbon / cursor.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: cursor.cpp
3 // Purpose: wxCursor class
4 // Author: Stefan Csomor
5 // Modified by:
6 // Created: 1998-01-01
7 // RCS-ID: $Id$
8 // Copyright: (c) Stefan Csomor
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
13 #pragma implementation "cursor.h"
14 #endif
15
16 #include "wx/defs.h"
17
18 #include "wx/app.h"
19 #include "wx/cursor.h"
20 #include "wx/icon.h"
21 #include "wx/image.h"
22 #include "wx/xpmdecod.h"
23
24 #include "wx/mac/private.h"
25
26 #if !USE_SHARED_LIBRARIES
27 IMPLEMENT_DYNAMIC_CLASS(wxCursor, wxBitmap)
28 #endif
29
30 const short kwxCursorBullseye = 0 ;
31 const short kwxCursorBlank = 1 ;
32 const short kwxCursorPencil = 2 ;
33 const short kwxCursorMagnifier = 3 ;
34 const short kwxCursorNoEntry = 4 ;
35 const short kwxCursorPaintBrush = 5 ;
36 const short kwxCursorPointRight = 6 ;
37 const short kwxCursorPointLeft = 7 ;
38 const short kwxCursorQuestionArrow = 8 ;
39 const short kwxCursorRightArrow = 9 ;
40 const short kwxCursorSizeNS = 10 ;
41 const short kwxCursorSize = 11 ;
42 const short kwxCursorSizeNESW = 12 ;
43 const short kwxCursorSizeNWSE = 13 ;
44 const short kwxCursorRoller = 14 ;
45 const short kwxCursorLast = kwxCursorRoller ;
46
47 Cursor gMacCursors[kwxCursorLast+1] =
48 {
49 {
50 0x0000, 0x03E0, 0x0630, 0x0808, 0x1004, 0x31C6, 0x2362, 0x2222,
51 0x2362, 0x31C6, 0x1004, 0x0808, 0x0630, 0x03E0, 0x0000, 0x0000,
52 0x0000, 0x03E0, 0x07F0, 0x0FF8, 0x1FFC, 0x3FFE, 0x3FFE, 0x3FFE,
53 0x3FFE, 0x3FFE, 0x1FFC, 0x0FF8, 0x07F0, 0x03E0, 0x0000, 0x0000,
54 0x0007, 0x0008,
55 },
56
57 {
58 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
59 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
60 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
61 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
62 0x0000, 0x0000,
63 },
64
65 {
66 0x00F0, 0x0088, 0x0108, 0x0190, 0x0270, 0x0220, 0x0440, 0x0440,
67 0x0880, 0x0880, 0x1100, 0x1E00, 0x1C00, 0x1800, 0x1000, 0x0000,
68 0x00F0, 0x00F8, 0x01F8, 0x01F0, 0x03F0, 0x03E0, 0x07C0, 0x07C0,
69 0x0F80, 0x0F80, 0x1F00, 0x1E00, 0x1C00, 0x1800, 0x1000, 0x0000,
70 0x000E, 0x0003,
71 },
72
73 {
74 0x0000, 0x1E00, 0x2100, 0x4080, 0x4080, 0x4080, 0x4080, 0x2180,
75 0x1FC0, 0x00E0, 0x0070, 0x0038, 0x001C, 0x000E, 0x0006, 0x0000,
76 0x3F00, 0x7F80, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0x7FC0,
77 0x3FE0, 0x1FF0, 0x00F8, 0x007C, 0x003E, 0x001F, 0x000F, 0x0007,
78 0x0004, 0x0004,
79 },
80
81 {
82 0x0000, 0x07E0, 0x1FF0, 0x3838, 0x3C0C, 0x6E0E, 0x6706, 0x6386,
83 0x61C6, 0x60E6, 0x7076, 0x303C, 0x1C1C, 0x0FF8, 0x07E0, 0x0000,
84 0x0540, 0x0FF0, 0x3FF8, 0x3C3C, 0x7E0E, 0xFF0F, 0x6F86, 0xE7C7,
85 0x63E6, 0xE1F7, 0x70FE, 0x707E, 0x3C3C, 0x1FFC, 0x0FF0, 0x0540,
86 0x0007, 0x0007,
87 },
88
89 {
90 0x0000, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0FE0,
91 0x1FF0, 0x1FF0, 0x0000, 0x1FF0, 0x1FF0, 0x1550, 0x1550, 0x1550,
92 0x07C0, 0x07C0, 0x07C0, 0x07C0, 0x07C0, 0x07C0, 0x0FE0, 0x1FF0,
93 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8, 0x3FF8,
94 0x000B, 0x0007,
95 },
96
97 {
98 0x00C0, 0x0140, 0x0640, 0x08C0, 0x3180, 0x47FE, 0x8001, 0x8001,
99 0x81FE, 0x8040, 0x01C0, 0x0040, 0x03C0, 0xC080, 0x3F80, 0x0000,
100 0x00C0, 0x01C0, 0x07C0, 0x0FC0, 0x3F80, 0x7FFE, 0xFFFF, 0xFFFF,
101 0xFFFE, 0xFFC0, 0xFFC0, 0xFFC0, 0xFFC0, 0xFF80, 0x3F80, 0x0000,
102 0x0006, 0x000F,
103 },
104
105 {
106 0x0100, 0x0280, 0x0260, 0x0310, 0x018C, 0x7FE3, 0x8000, 0x8000,
107 0x7F80, 0x0200, 0x0380, 0x0200, 0x03C0, 0x0107, 0x01F8, 0x0000,
108 0x0100, 0x0380, 0x03E0, 0x03F0, 0x01FC, 0x7FFF, 0xFFFF, 0xFFFF,
109 0xFFFF, 0x03FF, 0x03FF, 0x03FF, 0x03FF, 0x01FF, 0x01F8, 0x0000,
110 0x0006, 0x0000,
111 },
112
113 {
114 0x0000, 0x4078, 0x60FC, 0x71CE, 0x7986, 0x7C06, 0x7E0E, 0x7F1C,
115 0x7FB8, 0x7C30, 0x6C30, 0x4600, 0x0630, 0x0330, 0x0300, 0x0000,
116 0xC078, 0xE0FC, 0xF1FE, 0xFBFF, 0xFFCF, 0xFF8F, 0xFF1F, 0xFFBE,
117 0xFFFC, 0xFE78, 0xFF78, 0xEFF8, 0xCFF8, 0x87F8, 0x07F8, 0x0300,
118 0x0001, 0x0001,
119 },
120
121 {
122 0x0000, 0x0002, 0x0006, 0x000E, 0x001E, 0x003E, 0x007E, 0x00FE,
123 0x01FE, 0x003E, 0x0036, 0x0062, 0x0060, 0x00C0, 0x00C0, 0x0000,
124 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF,
125 0x03FF, 0x07FF, 0x007F, 0x00F7, 0x00F3, 0x01E1, 0x01E0, 0x01C0,
126 0x0001, 0x000E,
127 },
128
129 {
130 0x0000, 0x0080, 0x01C0, 0x03E0, 0x0080, 0x0080, 0x0080, 0x1FFC,
131 0x1FFC, 0x0080, 0x0080, 0x0080, 0x03E0, 0x01C0, 0x0080, 0x0000,
132 0x0080, 0x01C0, 0x03E0, 0x07F0, 0x0FF8, 0x01C0, 0x3FFE, 0x3FFE,
133 0x3FFE, 0x3FFE, 0x01C0, 0x0FF8, 0x07F0, 0x03E0, 0x01C0, 0x0080,
134 0x0007, 0x0008,
135 },
136
137 {
138 0x0000, 0x0080, 0x01C0, 0x03E0, 0x0080, 0x0888, 0x188C, 0x3FFE,
139 0x188C, 0x0888, 0x0080, 0x03E0, 0x01C0, 0x0080, 0x0000, 0x0000,
140 0x0080, 0x01C0, 0x03E0, 0x07F0, 0x0BE8, 0x1DDC, 0x3FFE, 0x7FFF,
141 0x3FFE, 0x1DDC, 0x0BE8, 0x07F0, 0x03E0, 0x01C0, 0x0080, 0x0000,
142 0x0007, 0x0008,
143 },
144
145 {
146 0x0000, 0x001E, 0x000E, 0x060E, 0x0712, 0x03A0, 0x01C0, 0x00E0,
147 0x0170, 0x1238, 0x1C18, 0x1C00, 0x1E00, 0x0000, 0x0000, 0x0000,
148 0x007F, 0x003F, 0x0E1F, 0x0F0F, 0x0F97, 0x07E3, 0x03E1, 0x21F0,
149 0x31F8, 0x3A7C, 0x3C3C, 0x3E1C, 0x3F00, 0x3F80, 0x0000, 0x0000,
150 0x0006, 0x0009,
151 },
152
153 {
154 0x0000, 0x7800, 0x7000, 0x7060, 0x48E0, 0x05C0, 0x0380, 0x0700,
155 0x0E80, 0x1C48, 0x1838, 0x0038, 0x0078, 0x0000, 0x0000, 0x0000,
156 0xFE00, 0xFC00, 0xF870, 0xF0F0, 0xE9F0, 0xC7E0, 0x87C0, 0x0F84,
157 0x1F8C, 0x3E5C, 0x3C3C, 0x387C, 0x00FC, 0x01FC, 0x0000, 0x0000,
158 0x0006, 0x0006,
159 },
160
161 {
162 0x0006, 0x000E, 0x001C, 0x0018, 0x0020, 0x0040, 0x00F8, 0x0004,
163 0x1FF4, 0x200C, 0x2AA8, 0x1FF0, 0x1F80, 0x3800, 0x6000, 0x8000,
164 0x000F, 0x001F, 0x003E, 0x007C, 0x0070, 0x00E0, 0x01FC, 0x3FF6,
165 0x7FF6, 0x7FFE, 0x7FFC, 0x7FF8, 0x3FF0, 0x7FC0, 0xF800, 0xE000,
166 0x000A, 0x0006,
167 },} ;
168
169 wxCursor gMacCurrentCursor ;
170
171 CursHandle wxGetStockCursor( int number )
172 {
173 wxASSERT_MSG( number >= 0 && number <=kwxCursorLast , wxT("invalid stock cursor id") ) ;
174 CursHandle c = (CursHandle) NewHandle( sizeof(Cursor) ) ;
175 memcpy( *c , &gMacCursors[number] , sizeof( Cursor ) ) ;
176 return c ;
177 }
178
179 wxCursorRefData::wxCursorRefData()
180 {
181 m_width = 16;
182 m_height = 16;
183 m_hCursor = NULL ;
184 m_disposeHandle = false ;
185 m_releaseHandle = false ;
186 m_isColorCursor = false ;
187 m_themeCursor = -1 ;
188 }
189
190 wxCursorRefData::~wxCursorRefData()
191 {
192 if ( m_isColorCursor )
193 {
194 ::DisposeCCursor( (CCrsrHandle) m_hCursor ) ;
195 }
196 else if ( m_disposeHandle )
197 {
198 ::DisposeHandle( (Handle ) m_hCursor ) ;
199 }
200 else if ( m_releaseHandle )
201 {
202 // we don't release the resource since it may already
203 // be in use again
204 }
205 }
206
207 // Cursors
208 wxCursor::wxCursor()
209 {
210 }
211
212 wxCursor::wxCursor(const char WXUNUSED(bits)[], int WXUNUSED(width), int WXUNUSED(height),
213 int WXUNUSED(hotSpotX), int WXUNUSED(hotSpotY), const char WXUNUSED(maskBits)[])
214 {
215 }
216
217 wxCursor::wxCursor( const wxImage &image )
218 {
219 CreateFromImage( image ) ;
220 }
221
222 wxCursor::wxCursor(const char **bits)
223 {
224 (void) CreateFromXpm(bits);
225 }
226
227 wxCursor::wxCursor(char **bits)
228 {
229 (void) CreateFromXpm((const char **)bits);
230 }
231
232 bool wxCursor::CreateFromXpm(const char **bits)
233 {
234 wxCHECK_MSG( bits != NULL, FALSE, wxT("invalid cursor data") )
235 wxXPMDecoder decoder;
236 wxImage img = decoder.ReadData(bits);
237 wxCHECK_MSG( img.Ok(), FALSE, wxT("invalid cursor data") )
238 CreateFromImage( img ) ;
239 return TRUE;
240 }
241
242 short GetCTabIndex( CTabHandle colors , RGBColor *col )
243 {
244 short retval = 0 ;
245 unsigned long bestdiff = 0xFFFF ;
246 for ( int i = 0 ; i < (**colors).ctSize ; ++i )
247 {
248 unsigned long diff = abs(col->red - (**colors).ctTable[i].rgb.red ) +
249 abs(col->green - (**colors).ctTable[i].rgb.green ) +
250 abs(col->blue - (**colors).ctTable[i].rgb.blue ) ;
251 if ( diff < bestdiff )
252 {
253 bestdiff = diff ;
254 retval = (**colors).ctTable[i].value ;
255 }
256 }
257 return retval ;
258 }
259
260 void wxCursor::CreateFromImage(const wxImage & image)
261 {
262 m_refData = new wxCursorRefData;
263
264 wxImage image16 = image.Scale(16,16) ;
265 unsigned char * rgbBits = image16.GetData();
266
267
268 int w = image16.GetWidth() ;
269 int h = image16.GetHeight() ;
270 bool bHasMask = image16.HasMask() ;
271
272 int hotSpotX = image16.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_X);
273 int hotSpotY = image16.GetOptionInt(wxIMAGE_OPTION_CUR_HOTSPOT_Y);
274 if (hotSpotX < 0 || hotSpotX >= w)
275 hotSpotX = 0;
276 if (hotSpotY < 0 || hotSpotY >= h)
277 hotSpotY = 0;
278
279 PixMapHandle pm = (PixMapHandle) NewHandleClear( sizeof (PixMap)) ;
280 short extent = 16 ;
281 short bytesPerPixel = 1 ;
282 short depth = 8 ;
283 Rect bounds = { 0 , 0 , extent , extent } ;
284 CCrsrHandle ch = (CCrsrHandle) NewHandleClear ( sizeof( CCrsr ) ) ;
285 CTabHandle newColors = GetCTable( 8 ) ;
286 HandToHand((Handle *) &newColors);
287 // set the values to the indices
288 for ( int i = 0 ; i < (**newColors).ctSize ; ++i )
289 {
290 (**newColors).ctTable[i].value = i ;
291 }
292 HLock( (Handle) ch) ;
293 (**ch).crsrType = 0x8001 ; // color cursors
294 (**ch).crsrMap = pm ;
295 short bytesPerRow = bytesPerPixel * extent ;
296
297 (**pm).baseAddr = 0;
298 (**pm).rowBytes = bytesPerRow | 0x8000;
299 (**pm).bounds = bounds;
300 (**pm).pmVersion = 0;
301 (**pm).packType = 0;
302 (**pm).packSize = 0;
303 (**pm).hRes = 0x00480000; /* 72 DPI default res */
304 (**pm).vRes = 0x00480000; /* 72 DPI default res */
305 (**pm).pixelSize = depth;
306 (**pm).pixelType = 0;
307 (**pm).cmpCount = 1;
308 (**pm).cmpSize = depth;
309 (**pm).pmTable = newColors;
310
311 (**ch).crsrData = NewHandleClear( extent * bytesPerRow ) ;
312 (**ch).crsrXData = NULL ;
313 (**ch).crsrXValid = 0;
314 (**ch).crsrXHandle = NULL;
315
316 (**ch).crsrHotSpot.h = hotSpotX ;
317 (**ch).crsrHotSpot.v = hotSpotY ;
318 (**ch).crsrXTable = NULL ;
319 (**ch).crsrID = GetCTSeed() ;
320
321 memset( (**ch).crsr1Data , 0 , sizeof( Bits16 ) ) ;
322 memset( (**ch).crsrMask , 0 , sizeof( Bits16 ) ) ;
323
324 unsigned char mr = image16.GetMaskRed() ;
325 unsigned char mg = image16.GetMaskGreen() ;
326 unsigned char mb = image16.GetMaskBlue() ;
327 for ( int y = 0 ; y < h ; ++y )
328 {
329 short rowbits = 0 ;
330 short maskbits = 0 ;
331
332 for ( int x = 0 ; x < w ; ++x )
333 {
334 long pos = (y * w + x) * 3;
335
336 unsigned char r = rgbBits[pos] ;
337 unsigned char g = rgbBits[pos+1] ;
338 unsigned char b = rgbBits[pos+2] ;
339 RGBColor col = { 0xFFFF ,0xFFFF, 0xFFFF } ;
340
341 if ( bHasMask && r==mr && g==mg && b==mb )
342 {
343 // masked area, does not appear anywhere
344 }
345 else
346 {
347 if ( (int)r + (int)g + (int)b < 0x0200 )
348 {
349 rowbits |= ( 1 << (15-x) ) ;
350 }
351 maskbits |= ( 1 << (15-x) ) ;
352
353 col = *((RGBColor*) wxColor( r , g , b ).GetPixel()) ;
354 }
355 *((*(**ch).crsrData) + y * bytesPerRow + x) =
356 GetCTabIndex( newColors , &col) ;
357 }
358 (**ch).crsr1Data[y] = rowbits ;
359 (**ch).crsrMask[y] = maskbits ;
360 }
361 if ( !bHasMask )
362 {
363 memcpy( (**ch).crsrMask , (**ch).crsr1Data , sizeof( Bits16) ) ;
364 }
365
366 HUnlock((Handle) ch) ;
367 M_CURSORDATA->m_hCursor = ch ;
368 M_CURSORDATA->m_isColorCursor = true ;
369 }
370
371 wxCursor::wxCursor(const wxString& cursor_file, long flags, int hotSpotX, int hotSpotY)
372 {
373 m_refData = new wxCursorRefData;
374 if ( flags == wxBITMAP_TYPE_MACCURSOR_RESOURCE )
375 {
376 Str255 theName ;
377 wxMacStringToPascal( cursor_file , theName ) ;
378
379 Handle resHandle = ::GetNamedResource( 'crsr' , theName ) ;
380 if ( resHandle )
381 {
382 short theId = -1 ;
383 OSType theType ;
384 GetResInfo( resHandle , &theId , &theType , theName ) ;
385 ReleaseResource( resHandle ) ;
386 M_CURSORDATA->m_hCursor = GetCCursor( theId ) ;
387 if ( M_CURSORDATA->m_hCursor )
388 M_CURSORDATA->m_isColorCursor = true ;
389 }
390 else
391 {
392 Handle resHandle = ::GetNamedResource( 'CURS' , theName ) ;
393 if ( resHandle )
394 {
395 short theId = -1 ;
396 OSType theType ;
397 GetResInfo( resHandle , &theId , &theType , theName ) ;
398 ReleaseResource( resHandle ) ;
399 M_CURSORDATA->m_hCursor = GetCursor( theId ) ;
400 if ( M_CURSORDATA->m_hCursor )
401 M_CURSORDATA->m_releaseHandle = true ;
402 }
403 }
404 }
405 else
406 {
407 wxImage image ;
408 image.LoadFile( cursor_file , flags ) ;
409 if( image.Ok() )
410 {
411 image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X,hotSpotX ) ;
412 image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y,hotSpotY ) ;
413 delete m_refData ;
414 CreateFromImage(image) ;
415 }
416 }
417 }
418
419 // Cursors by stock number
420 wxCursor::wxCursor(int cursor_type)
421 {
422 m_refData = new wxCursorRefData;
423
424 switch (cursor_type)
425 {
426 case wxCURSOR_COPY_ARROW:
427 M_CURSORDATA->m_themeCursor = kThemeCopyArrowCursor ;
428 break;
429 case wxCURSOR_WAIT:
430 M_CURSORDATA->m_themeCursor = kThemeWatchCursor ;
431 break;
432 case wxCURSOR_IBEAM:
433 M_CURSORDATA->m_themeCursor = kThemeIBeamCursor ;
434 break;
435 case wxCURSOR_CROSS:
436 M_CURSORDATA->m_themeCursor = kThemeCrossCursor;
437 break;
438 case wxCURSOR_SIZENWSE:
439 {
440 M_CURSORDATA->m_hCursor = wxGetStockCursor(kwxCursorSizeNWSE);
441 }
442 break;
443 case wxCURSOR_SIZENESW:
444 {
445 M_CURSORDATA->m_hCursor = wxGetStockCursor(kwxCursorSizeNESW);
446 }
447 break;
448 case wxCURSOR_SIZEWE:
449 {
450 M_CURSORDATA->m_themeCursor = kThemeResizeLeftRightCursor;
451 }
452 break;
453 case wxCURSOR_SIZENS:
454 {
455 M_CURSORDATA->m_hCursor = wxGetStockCursor(kwxCursorSizeNS);
456 }
457 break;
458 case wxCURSOR_SIZING:
459 {
460 M_CURSORDATA->m_hCursor = wxGetStockCursor(kwxCursorSize);
461 }
462 break;
463 case wxCURSOR_HAND:
464 {
465 M_CURSORDATA->m_themeCursor = kThemePointingHandCursor;
466 }
467 break;
468 case wxCURSOR_BULLSEYE:
469 {
470 M_CURSORDATA->m_hCursor = wxGetStockCursor(kwxCursorBullseye);
471 }
472 break;
473 case wxCURSOR_PENCIL:
474 {
475 M_CURSORDATA->m_hCursor = wxGetStockCursor(kwxCursorPencil);
476 }
477 break;
478 case wxCURSOR_MAGNIFIER:
479 {
480 M_CURSORDATA->m_hCursor = wxGetStockCursor(kwxCursorMagnifier);
481 }
482 break;
483 case wxCURSOR_NO_ENTRY:
484 {
485 M_CURSORDATA->m_hCursor = wxGetStockCursor(kwxCursorNoEntry);
486 }
487 break;
488 case wxCURSOR_WATCH:
489 {
490 M_CURSORDATA->m_themeCursor = kThemeWatchCursor;
491 break;
492 }
493 case wxCURSOR_PAINT_BRUSH:
494 {
495 M_CURSORDATA->m_hCursor = wxGetStockCursor(kwxCursorPaintBrush);
496 break;
497 }
498 case wxCURSOR_POINT_LEFT:
499 {
500 M_CURSORDATA->m_hCursor = wxGetStockCursor(kwxCursorPointLeft);
501 break;
502 }
503 case wxCURSOR_POINT_RIGHT:
504 {
505 M_CURSORDATA->m_hCursor = wxGetStockCursor(kwxCursorPointRight);
506 break;
507 }
508 case wxCURSOR_QUESTION_ARROW:
509 {
510 M_CURSORDATA->m_hCursor = wxGetStockCursor(kwxCursorQuestionArrow);
511 break;
512 }
513 case wxCURSOR_BLANK:
514 {
515 M_CURSORDATA->m_hCursor = wxGetStockCursor(kwxCursorBlank);
516 break;
517 }
518 case wxCURSOR_RIGHT_ARROW:
519 {
520 M_CURSORDATA->m_hCursor = wxGetStockCursor(kwxCursorRightArrow);
521 break;
522 }
523 case wxCURSOR_SPRAYCAN:
524 {
525 M_CURSORDATA->m_hCursor = wxGetStockCursor(kwxCursorRoller);
526 break;
527 }
528 case wxCURSOR_CHAR:
529 case wxCURSOR_ARROW:
530 case wxCURSOR_LEFT_BUTTON:
531 case wxCURSOR_RIGHT_BUTTON:
532 case wxCURSOR_MIDDLE_BUTTON:
533 default:
534 M_CURSORDATA->m_themeCursor = kThemeArrowCursor ;
535 break;
536 }
537 if ( M_CURSORDATA->m_themeCursor == -1 )
538 M_CURSORDATA->m_releaseHandle = true ;
539 }
540
541 void wxCursor::MacInstall() const
542 {
543 gMacCurrentCursor = *this ;
544 if ( m_refData && M_CURSORDATA->m_themeCursor != -1 )
545 {
546 SetThemeCursor( M_CURSORDATA->m_themeCursor ) ;
547 }
548 else if ( m_refData && M_CURSORDATA->m_hCursor )
549 {
550 if ( M_CURSORDATA->m_isColorCursor )
551 ::SetCCursor( (CCrsrHandle) M_CURSORDATA->m_hCursor ) ;
552 else
553 ::SetCursor( * (CursHandle) M_CURSORDATA->m_hCursor ) ;
554 }
555 else
556 {
557 SetThemeCursor( kThemeArrowCursor ) ;
558 }
559 }
560
561 wxCursor::~wxCursor()
562 {
563 }
564
565 // Global cursor setting
566 void wxSetCursor(const wxCursor& cursor)
567 {
568 cursor.MacInstall() ;
569 }
570
571