]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/taskbar.cpp
correcting Drag Data handling for 'TEXT' and 'utxt'
[wxWidgets.git] / src / mac / carbon / taskbar.cpp
index 395f5f5e30fc1723250731a41c8f43a59e83f86a..a37330054691de5caf9b4a58decd2ed45587bd17 100644 (file)
@@ -11,8 +11,6 @@
 
 #include "wx/wxprec.h"
 
-#include "wx/defs.h"
-
 #ifdef wxHAS_TASK_BAR_ICON
 
 #include "wx/mac/private.h"
@@ -36,7 +34,12 @@ pascal OSStatus wxDockEventHandler( EventHandlerCallRef inHandlerCallRef,
     {
         //TODO:        This is a complete copy of 
         //static pascal OSStatus wxMacAppCommandEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
-       
+
+        if (! pTB->GetCurrentMenu() )
+        {
+            return eventNotHandledErr;
+        }
+                
         MenuRef hMenu = MAC_WXHMENU(pTB->GetCurrentMenu()->GetHMenu());
         OSStatus result = eventNotHandledErr ;
 
@@ -140,6 +143,8 @@ wxTaskBarIcon::wxTaskBarIcon(const wxTaskBarIconType& nType)
             this, (&(EventHandlerRef&)m_pEventHandlerRef));
             
     wxASSERT(err == noErr);
+    
+    Connect(wxEVT_TASKBAR_RIGHT_DOWN, wxTaskBarIconEventHandler(wxTaskBarIcon::OnRightDown));
 }
 
 wxTaskBarIcon::~wxTaskBarIcon()
@@ -173,39 +178,46 @@ wxMenu* wxTaskBarIcon::DoCreatePopupMenu()
 // Operations:
 bool wxTaskBarIcon::SetIcon(const wxIcon& icon, const wxString& tooltip)
 {
-    wxMask* mask = icon.GetMask();
-    if (!mask)
+    wxBitmap bmp( icon ) ;
+    OSStatus err = noErr ;
+
+    CGImageRef pImage;
+    
+#if 0 // is always available under OSX now -- crashes on 10.2 in CFRetain() - RN
+    pImage = (CGImageRef) bmp.CGImageCreate() ;
+#else
+    WXHBITMAP iconport ;
+    WXHBITMAP maskport ;
+    iconport = bmp.GetHBITMAP( &maskport ) ;
+
+    if (!maskport)
     {
         // Make a mask with no transparent pixels
-        wxBitmap   bmp(icon.GetWidth(), icon.GetHeight());
+        wxBitmap   mbmp(icon.GetWidth(), icon.GetHeight());
         wxMemoryDC dc;
-        dc.SelectObject(bmp);
+        dc.SelectObject(mbmp);
         dc.SetBackground(*wxBLACK_BRUSH);
         dc.Clear();
         dc.SelectObject(wxNullBitmap);
-        mask = new wxMask(bmp, *wxWHITE);
+        bmp.SetMask( new wxMask(mbmp, *wxWHITE) ) ;
+        iconport = bmp.GetHBITMAP( &maskport ) ;
     } 
-        
-    CGImageRef pImage;
     
     //create the icon from the bitmap and mask bitmap contained within
-    OSStatus err = CreateCGImageFromPixMaps(
-        GetGWorldPixMap(MAC_WXHBITMAP(icon.GetHBITMAP())),
-        GetGWorldPixMap(MAC_WXHBITMAP(mask->GetMaskBitmap())),
-        &pImage
-        );
-        
+    err = CreateCGImageFromPixMaps(
+                                            GetGWorldPixMap(MAC_WXHBITMAP(iconport)),
+                                            GetGWorldPixMap(MAC_WXHBITMAP(maskport)),
+                                            &pImage
+                                            );    
     wxASSERT(err == 0);
-    
+#endif
+    wxASSERT(pImage != NULL );
     err = SetApplicationDockTileImage(pImage);
-        
+    
     wxASSERT(err == 0);
     
     if (pImage != NULL)
         CGImageRelease(pImage);
-
-    if (!icon.GetMask())
-        delete mask;
     
     return m_iconAdded = err == noErr;
 }
@@ -269,7 +281,7 @@ bool wxTaskBarIcon::PopupMenu(wxMenu *menu)
                                         theItem->GetId(), //id
                                         theItem->GetText(), //text label
                                         theItem->GetHelp(), //status bar help string
-                                        theItem->GetKind(), //menu flags - checkable, seperator, etc.
+                                        theItem->GetKind(), //menu flags - checkable, separator, etc.
                                         theItem->GetSubMenu() //submenu
                                         ));
         theNode = theNode->GetNext();
@@ -279,4 +291,10 @@ bool wxTaskBarIcon::PopupMenu(wxMenu *menu)
     return true;
 }
 
+//Skip the event so that popupmenu isn't called in parent, avoiding double-creation of the menus
+void wxTaskBarIcon::OnRightDown(wxTaskBarIconEvent& evt)
+{
+    evt.Skip();
+}
+
 #endif //wxHAS_TASK_BAR_ICON