X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1dd7badd1ff93e390d6020a0ab5a6c48eca8ebaa..94929e7b60de96bd3b064984ae8995d665329411:/src/unix/taskbarx11.cpp?ds=sidebyside diff --git a/src/unix/taskbarx11.cpp b/src/unix/taskbarx11.cpp index ab82f80a49..d1dfc5e746 100644 --- a/src/unix/taskbarx11.cpp +++ b/src/unix/taskbarx11.cpp @@ -66,7 +66,7 @@ wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR | wxSIMPLE_BORDER | wxFRAME_SHAPED) {} - bool IsProtocolSupported() const { return false; } + static bool IsProtocolSupported() { return false; } }; #endif @@ -124,7 +124,7 @@ 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 defined(__WXGTK20__) && defined(TASKBAR_ICON_AREA_BASE_INCLUDED) m_invokingWindow = icon; @@ -250,6 +250,15 @@ void wxTaskBarIconArea::OnMenuEvent(wxCommandEvent& event) m_icon->ProcessEvent(event); } +// ---------------------------------------------------------------------------- +// wxTaskBarIconBase class: +// ---------------------------------------------------------------------------- + +bool wxTaskBarIconBase::IsAvailable() +{ + return wxTaskBarIconArea::IsProtocolSupported(); +} + // ---------------------------------------------------------------------------- // wxTaskBarIcon class: // ---------------------------------------------------------------------------- @@ -263,7 +272,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 +289,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 +307,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