X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e2948f175ed451f1403209018fb0dce99e0ab23a..4f64fde78548c2111a4f48595b485dac6d0e6557:/src/cocoa/cursor.mm

diff --git a/src/cocoa/cursor.mm b/src/cocoa/cursor.mm
index a1fad8eba5..c0458ce439 100644
--- a/src/cocoa/cursor.mm
+++ b/src/cocoa/cursor.mm
@@ -393,9 +393,25 @@ static inline int GetPrivateCursorIdForStockCursor(int stock_cursor_id)
     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)
 {
+    // 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;
@@ -425,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)
     {
-        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);
+
+    // 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()