// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
-#ifdef wxHAS_TASK_BAR_ICON
+#if wxUSE_TASKBARICON && !defined(__WXGTK20__)
#include "wx/taskbar.h"
// 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:
wxTaskBarIconAreaBase()
- : wxFrame(NULL, wxID_ANY, _T("systray icon"),
+ : wxFrame(NULL, wxID_ANY, wxT("systray icon"),
wxDefaultPosition, wxDefaultSize,
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__)
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(wxT("systray"),
+ wxT("using legacy KDE1,2 and GNOME 1.2 methods"));
+ SetLegacyWMProperties();
+ }
}
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));
void wxTaskBarIconArea::OnSizeChange(wxSizeEvent& WXUNUSED(event))
{
- wxLogTrace(_T("systray"), _T("icon size changed to %i x %i"),
+ wxLogTrace(wxT("systray"), wxT("icon size changed to %i x %i"),
GetSize().x, GetSize().y);
// rescale or reposition the icon as needed:
wxBitmap bmp(m_bmp);
m_icon->ProcessEvent(event);
}
+// ----------------------------------------------------------------------------
+// wxTaskBarIconBase class:
+// ----------------------------------------------------------------------------
+
+bool wxTaskBarIconBase::IsAvailable()
+{
+ return wxTaskBarIconArea::IsProtocolSupported();
+}
+
// ----------------------------------------------------------------------------
// wxTaskBarIcon class:
// ----------------------------------------------------------------------------
wxTaskBarIcon::~wxTaskBarIcon()
{
if (m_iconWnd)
+ {
+ m_iconWnd->Disconnect(wxEVT_DESTROY,
+ wxWindowDestroyEventHandler(wxTaskBarIcon::OnDestroy), NULL, this);
RemoveIcon();
+ }
}
bool wxTaskBarIcon::IsOk() 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;
m_iconWnd = new wxTaskBarIconArea(this, bmp);
if (m_iconWnd->IsOk())
{
+ m_iconWnd->Connect(wxEVT_DESTROY,
+ wxWindowDestroyEventHandler(wxTaskBarIcon::OnDestroy),
+ NULL, this);
m_iconWnd->Show();
}
else
return true;
}
-#endif // wxHAS_TASK_BAR_ICON
+#endif // wxUSE_TASKBARICON