]> git.saurik.com Git - wxWidgets.git/blobdiff - src/cocoa/cursor.mm
fixing osx_cocoa, there's a reason m_peer is private in the base class
[wxWidgets.git] / src / cocoa / cursor.mm
index 7f3ec31b19234a4dd5edca8c6e5b1d5cd4d9d1ee..be8c6adb977de051c2a0fb3a5dc809b613026900 100644 (file)
@@ -8,7 +8,7 @@
 // RCS-ID:      $Id$
 // Copyright:   (c) Ryan Norton
 //              2007, Software 2000 Ltd.
 // RCS-ID:      $Id$
 // Copyright:   (c) Ryan Norton
 //              2007, Software 2000 Ltd.
-// Licence:     wxWidgets licence
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #include "wx/wxprec.h"
 /////////////////////////////////////////////////////////////////////////////
 
 #include "wx/wxprec.h"
@@ -35,7 +35,7 @@ typedef struct tagClassicCursor
 }ClassicCursor;
 
 ///////////////////////////////////////////////////////////////////////////
 }ClassicCursor;
 
 ///////////////////////////////////////////////////////////////////////////
-// This is a direct copy from src/mac/carbon/cursor.cpp and should be
+// This is a direct copy from src/osx/carbon/cursor.cpp and should be
 // changed to use common code if we plan on keeping it this way.
 // Note that this is basically an array of classic 'CURS' resources.
 
 // changed to use common code if we plan on keeping it this way.
 // Note that this is basically an array of classic 'CURS' resources.
 
@@ -181,7 +181,7 @@ ClassicCursor gMacCursors[kwxCursorLast+1] =
 
 } ;
 
 
 } ;
 
-// End of data copied from src/mac/carbon/cursor.cpp
+// End of data copied from src/osx/carbon/cursor.cpp
 ///////////////////////////////////////////////////////////////////////////
 
 /* NSCursorCreateWithPrivateId
 ///////////////////////////////////////////////////////////////////////////
 
 /* NSCursorCreateWithPrivateId
@@ -259,13 +259,6 @@ static inline NSCursor* NSCursorCreateWithPrivateId(short sIndex)
     return theCursor;
 }
 
     return theCursor;
 }
 
-// TODO: Remove in trunk.. needed for 2.8
-NSCursor* wxGetStockCursor( short sIndex )
-{
-    wxLogDebug("Please do not call wxGetStockCursor.");
-    return NSCursorCreateWithPrivateId(sIndex);
-}
-
 wxCursorRefData::wxCursorRefData() :
     m_width(32), m_height(32), m_hCursor(nil)
 {
 wxCursorRefData::wxCursorRefData() :
     m_width(32), m_height(32), m_hCursor(nil)
 {
@@ -400,9 +393,25 @@ static inline int GetPrivateCursorIdForStockCursor(int stock_cursor_id)
     return -1;
 }
 
     return -1;
 }
 
+// Keep an array of stock cursors so they can share wxCursorRefData and thus
+// wxObject::IsSameAs will return true.
+// They will obviously be destroyed at static destruction time which should
+// theoretically be fine.
+static wxCursor s_stockCursors[wxCURSOR_MAX];
+
 // Cursors by stock number (enum wxStockCursor)
 wxCursor::wxCursor(int stock_cursor_id)
 {
 // Cursors by stock number (enum wxStockCursor)
 wxCursor::wxCursor(int stock_cursor_id)
 {
+    // We default-constructed wxObject so our m_refData == NULL
+    if(stock_cursor_id >= 0 && stock_cursor_id < wxCURSOR_MAX)
+    {
+        // Attempt to reference an existing stock cursor
+        Ref(s_stockCursors[stock_cursor_id]);
+    }
+    // If we succeeded in getting an existing stock cursor, we're done.
+    if(m_refData != NULL)
+        return;
+
     m_refData = new wxCursorRefData;
 
     M_CURSORDATA->m_hCursor = nil;
     m_refData = new wxCursorRefData;
 
     M_CURSORDATA->m_hCursor = nil;
@@ -424,7 +433,7 @@ wxCursor::wxCursor(int stock_cursor_id)
     {
         int privateId;
         if( (privateId = GetPrivateCursorIdForStockCursor(stock_cursor_id)) >= 0)
     {
         int privateId;
         if( (privateId = GetPrivateCursorIdForStockCursor(stock_cursor_id)) >= 0)
-        {   // wxGetStockCursor is not a get method but an alloc method.
+        {
             M_CURSORDATA->m_hCursor = NSCursorCreateWithPrivateId(privateId);
         }
     }
             M_CURSORDATA->m_hCursor = NSCursorCreateWithPrivateId(privateId);
         }
     }
@@ -432,12 +441,19 @@ wxCursor::wxCursor(int stock_cursor_id)
     // Stage 3: Give up, complain, and use a normal arrow
     if(M_CURSORDATA->m_hCursor == nil)
     {
     // Stage 3: Give up, complain, and use a normal arrow
     if(M_CURSORDATA->m_hCursor == nil)
     {
-        wxLogDebug("Could not find suitable cursor for wxStockCursor = %d.  Using normal pointer.", stock_cursor_id);
+        wxLogDebug(wxT("Could not find suitable cursor for wxStockCursor = %d.  Using normal pointer."), stock_cursor_id);
         M_CURSORDATA->m_hCursor = [[NSCursor arrowCursor] retain];
     }
 
     // This should never happen as the arrowCursor should always exist.
     wxASSERT(M_CURSORDATA->m_hCursor != nil);
         M_CURSORDATA->m_hCursor = [[NSCursor arrowCursor] retain];
     }
 
     // This should never happen as the arrowCursor should always exist.
     wxASSERT(M_CURSORDATA->m_hCursor != nil);
+
+    // Store ourself as the new stock cursor for this ID so that future
+    // calls will share the same ref data.
+    if(stock_cursor_id >= 0 && stock_cursor_id < wxCURSOR_MAX)
+    {
+        s_stockCursors[stock_cursor_id] = *this;
+    }
 }
 
 wxCursor::~wxCursor()
 }
 
 wxCursor::~wxCursor()