]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/taskbarx11.cpp
remove obsolete comment moved to wxBitmapButtonBase
[wxWidgets.git] / src / unix / taskbarx11.cpp
index e3ac3d59871b1ffddbeb835394d13e33a8dfd16f..0978d60c1acb190599b2638afc2db73b1c77fe17 100644 (file)
@@ -21,6 +21,8 @@
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
+#if wxUSE_TASKBARICON && !defined(__WXGTK20__)
+
 #include "wx/taskbar.h"
 
 #ifndef  WX_PRECOMP
     #include "wx/dcclient.h"
     #include "wx/statbmp.h"
     #include "wx/sizer.h"
+    #include "wx/bitmap.h"
+    #include "wx/image.h"
 #endif
 
-#include "wx/bitmap.h"
-#include "wx/image.h"
-
 #ifdef __VMS
 #pragma message disable nosimpint
 #endif
 // base class that implements toolkit-specific method:
 // ----------------------------------------------------------------------------
 
-#ifdef __WXGTK20__
-    #include <gtk/gtk.h>
-    #if GTK_CHECK_VERSION(2,1,0)
-        #include "wx/gtk/taskbarpriv.h"
-        #define TASKBAR_ICON_AREA_BASE_INCLUDED
-    #endif
-#endif
-
-#ifndef TASKBAR_ICON_AREA_BASE_INCLUDED
     class WXDLLIMPEXP_ADV wxTaskBarIconAreaBase : public wxFrame
     {
     public:
                       wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR |
                       wxSIMPLE_BORDER | wxFRAME_SHAPED) {}
 
-        bool IsProtocolSupported() const { return false; }
+        static bool IsProtocolSupported() { return false; }
     };
-#endif
-
 
 // ----------------------------------------------------------------------------
 // toolkit dependent methods to set properties on helper window:
 // ----------------------------------------------------------------------------
 
 #if defined(__WXGTK__)
-    #include <gdk/gdk.h>
-    #include <gdk/gdkx.h>
     #include <gtk/gtk.h>
+    #include <gdk/gdkx.h>
     #define GetDisplay()        GDK_DISPLAY()
     #define GetXWindow(wxwin)   GDK_WINDOW_XWINDOW((wxwin)->m_widget->window)
 #elif defined(__WXX11__) || defined(__WXMOTIF__)
@@ -123,24 +112,20 @@ 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)
 {
+    // Set initial size to bitmap size (tray manager may and often will
+    // change it):
+    SetClientSize(wxSize(bmp.GetWidth(), bmp.GetHeight()));
+
+    SetTrayIcon(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()));
-
-    SetTrayIcon(bmp);
 }
 
 void wxTaskBarIconArea::SetTrayIcon(const wxBitmap& bmp)
@@ -148,7 +133,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));
 
@@ -249,6 +234,15 @@ void wxTaskBarIconArea::OnMenuEvent(wxCommandEvent& event)
     m_icon->ProcessEvent(event);
 }
 
+// ----------------------------------------------------------------------------
+// wxTaskBarIconBase class:
+// ----------------------------------------------------------------------------
+
+bool wxTaskBarIconBase::IsAvailable()
+{
+    return wxTaskBarIconArea::IsProtocolSupported();
+}
+
 // ----------------------------------------------------------------------------
 // wxTaskBarIcon class:
 // ----------------------------------------------------------------------------
@@ -262,7 +256,11 @@ wxTaskBarIcon::wxTaskBarIcon() : m_iconWnd(NULL)
 wxTaskBarIcon::~wxTaskBarIcon()
 {
     if (m_iconWnd)
+    {
+        m_iconWnd->Disconnect(wxEVT_DESTROY,
+            wxWindowDestroyEventHandler(wxTaskBarIcon::OnDestroy), NULL, this);
         RemoveIcon();
+    }
 }
 
 bool wxTaskBarIcon::IsOk() const
@@ -275,6 +273,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;
@@ -285,6 +291,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
@@ -326,3 +335,5 @@ bool wxTaskBarIcon::PopupMenu(wxMenu *menu)
     m_iconWnd->PopupMenu(menu);
     return true;
 }
+
+#endif // wxUSE_TASKBARICON