]> git.saurik.com Git - wxWidgets.git/blobdiff - src/cocoa/taskbar.mm
fix memory leak in wxScreenDC, fixes #13249
[wxWidgets.git] / src / cocoa / taskbar.mm
index 5975e31c3d2539eee01ecdbfb0e689db8f42190d..b48ecd30d1ce7eab883abdac14054937f988dd00 100644 (file)
@@ -9,10 +9,6 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "taskbar.h"
-#endif
-
 #include "wx/wxprec.h"
 #ifdef wxHAS_TASK_BAR_ICON
 
 #include "wx/cocoa/NSApplication.h"
 #include "wx/cocoa/autorelease.h"
 
+// A category for methods that are only present in Panther's SDK
+@interface NSStatusItem(wxNSStatusItemPrePantherCompatibility)
+- (void)popUpStatusItemMenu:(NSMenu *)menu;
+@end
+
 class wxTaskBarIconWindow;
 
 // ============================================================================
@@ -61,6 +62,10 @@ public:
     virtual ~wxTaskBarIconCocoaImpl();
     inline wxTaskBarIcon* GetTaskBarIcon() { return m_taskBarIcon; }
 protected:
+    inline wxMenu* CreatePopupMenu()
+    {   wxASSERT(m_taskBarIcon);
+        return m_taskBarIcon->CreatePopupMenu();
+    }
     wxTaskBarIcon *m_taskBarIcon;
     wxTaskBarIconWindow *m_iconWindow;
 private:
@@ -211,7 +216,7 @@ wxTaskBarIconDockImpl::wxTaskBarIconDockImpl(wxTaskBarIcon *taskBarIcon)
 :   wxTaskBarIconCocoaImpl(taskBarIcon)
 {
     m_originalDockIcon = nil;
-    wxASSERT_MSG(!sm_dockIcon,"You should never have more than one dock icon!");
+    wxASSERT_MSG(!sm_dockIcon, wxT("You should never have more than one dock icon!"));
     sm_dockIcon = this;
 }
 
@@ -231,7 +236,7 @@ WX_NSMenu wxTaskBarIconDockImpl::CocoaGetDockNSMenu()
 
 WX_NSMenu wxTaskBarIconDockImpl::CocoaDoGetDockNSMenu()
 {
-    wxMenu *dockMenu = m_taskBarIcon->CreatePopupMenu();
+    wxMenu *dockMenu = CreatePopupMenu();
     if(!dockMenu)
         return nil;
     if(!m_iconWindow)
@@ -306,8 +311,9 @@ bool wxTaskBarIconCustomStatusItemImpl::RemoveIcon()
 
 bool wxTaskBarIconCustomStatusItemImpl::PopupMenu(wxMenu *menu)
 {
-    wxASSERT(menu);
-    menu->SetInvokingWindow(m_iconWindow);
+    wxCHECK_MSG(menu, false, "can't popup a NULL menu");
+
+    wxMenuInvokingWindowSetter setInvokingWin(*menu, m_iconWindow);
     menu->UpdateUI();
 
     if([m_cocoaNSStatusItem respondsToSelector:@selector(popUpStatusItemMenu:)])
@@ -323,7 +329,6 @@ bool wxTaskBarIconCustomStatusItemImpl::PopupMenu(wxMenu *menu)
             eventNumber:0 clickCount:1 pressure:0.0];
         [NSMenu popUpContextMenu:menu->GetNSMenu() withEvent:nsevent forView:m_iconWindow->GetNSView()];
     }
-    menu->SetInvokingWindow(NULL);
     return true;
 }
 
@@ -385,7 +390,7 @@ void wxTaskBarIconWindowCustom::OnPaint(wxPaintEvent &event)
 
 // This neatly solves the problem of DLL separation.  If the wxAdvanced
 // library (which this file is part of) is loaded then this category is
-// defined and we get dock menu behavior without app.mm ever having to
+// defined and we get dock menu behaviour without app.mm ever having to
 // know we exist.  C++ did sucketh so. :-)
 
 @interface wxNSApplicationDelegate(wxTaskBarIconNSApplicationDelegateCategory)