]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/taskbarx11.cpp
Slightly better wxStockCursor usage
[wxWidgets.git] / src / unix / taskbarx11.cpp
index c335b5d7af8cb777048571a1288da0faab813944..ced3b5e059716e7060ce6ae4f6e17d0d384f2a75 100644 (file)
@@ -124,24 +124,24 @@ BEGIN_EVENT_TABLE(wxTaskBarIconArea, wxTaskBarIconAreaBase)
 END_EVENT_TABLE()
 
 wxTaskBarIconArea::wxTaskBarIconArea(wxTaskBarIcon *icon, const wxBitmap &bmp)
-    : wxTaskBarIconAreaBase(), m_icon(icon), m_pos(0,0)
+    : wxTaskBarIconAreaBase(), m_icon(icon), m_bmp(bmp)
 {
-    if (!IsProtocolSupported())
-    {
-        wxLogTrace(_T("systray"),
-                   _T("using legacy KDE1,2 and GNOME 1.2 methods"));
-        SetLegacyWMProperties();
-    }
-
 #if defined(__WXGTK20__) && defined(TASKBAR_ICON_AREA_BASE_INCLUDED)
     m_invokingWindow = icon;
 #endif
 
     // Set initial size to bitmap size (tray manager may and often will
     // change it):
-    SetSize(wxSize(bmp.GetWidth(), bmp.GetHeight()));
+    SetClientSize(wxSize(bmp.GetWidth(), bmp.GetHeight()));
 
     SetTrayIcon(bmp);
+
+    if (!IsProtocolSupported())
+    {
+        wxLogTrace(_T("systray"),
+                   _T("using legacy KDE1,2 and GNOME 1.2 methods"));
+        SetLegacyWMProperties();
+    }
 }
 
 void wxTaskBarIconArea::SetTrayIcon(const wxBitmap& bmp)
@@ -149,7 +149,7 @@ void wxTaskBarIconArea::SetTrayIcon(const wxBitmap& bmp)
     m_bmp = bmp;
 
     // determine suitable bitmap size:
-    wxSize winsize(GetSize());
+    wxSize winsize(GetClientSize());
     wxSize bmpsize(m_bmp.GetWidth(), m_bmp.GetHeight());
     wxSize iconsize(wxMin(winsize.x, bmpsize.x), wxMin(winsize.y, bmpsize.y));
 
@@ -263,7 +263,11 @@ wxTaskBarIcon::wxTaskBarIcon() : m_iconWnd(NULL)
 wxTaskBarIcon::~wxTaskBarIcon()
 {
     if (m_iconWnd)
+    {
+        m_iconWnd->Disconnect(
+            wxEVT_DESTROY, wxObjectEventFunction(NULL), NULL, this);
         RemoveIcon();
+    }
 }
 
 bool wxTaskBarIcon::IsOk() const
@@ -276,6 +280,14 @@ bool wxTaskBarIcon::IsIconInstalled() const
     return m_iconWnd != NULL;
 }
 
+// Destroy event from wxTaskBarIconArea
+void wxTaskBarIcon::OnDestroy(wxWindowDestroyEvent&)
+{
+    // prevent crash if wxTaskBarIconArea is destroyed by something else,
+    // for example if panel/kicker is killed
+    m_iconWnd = NULL;
+}
+
 bool wxTaskBarIcon::SetIcon(const wxIcon& icon, const wxString& tooltip)
 {
     wxBitmap bmp;
@@ -286,6 +298,9 @@ bool wxTaskBarIcon::SetIcon(const wxIcon& icon, const wxString& tooltip)
         m_iconWnd = new wxTaskBarIconArea(this, bmp);
         if (m_iconWnd->IsOk())
         {
+            m_iconWnd->Connect(wxEVT_DESTROY,
+                wxWindowDestroyEventHandler(wxTaskBarIcon::OnDestroy),
+                NULL, this);
             m_iconWnd->Show();
         }
         else