X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/155ecd4c4221d3bbc7aa93d472d11948f21d21ab..2bfca191bf2261e385594a369da9aa4e4441aa43:/src/unix/taskbarx11.cpp?ds=sidebyside diff --git a/src/unix/taskbarx11.cpp b/src/unix/taskbarx11.cpp index 9535ee340e..ced3b5e059 100644 --- a/src/unix/taskbarx11.cpp +++ b/src/unix/taskbarx11.cpp @@ -21,6 +21,8 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" +#if wxUSE_TASKBARICON + #include "wx/taskbar.h" #ifndef WX_PRECOMP @@ -122,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) @@ -147,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)); @@ -261,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 @@ -274,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; @@ -284,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 @@ -325,3 +342,5 @@ bool wxTaskBarIcon::PopupMenu(wxMenu *menu) m_iconWnd->PopupMenu(menu); return true; } + +#endif // wxUSE_TASKBARICON