X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/76b49cf49ba9ee9f3eeec9730cb4bc4569ab17f1..589046c0bd6abc0836ffc97a6f4ebceea35a79c2:/src/unix/taskbarx11.cpp?ds=sidebyside diff --git a/src/unix/taskbarx11.cpp b/src/unix/taskbarx11.cpp index 43bf60080a..3b4ffeea54 100644 --- a/src/unix/taskbarx11.cpp +++ b/src/unix/taskbarx11.cpp @@ -21,19 +21,20 @@ // 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/log.h" #include "wx/frame.h" + #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/statbmp.h" -#include "wx/sizer.h" -#include "wx/dcclient.h" -#include "wx/image.h" - #ifdef __VMS #pragma message disable nosimpint #endif @@ -47,37 +48,25 @@ // base class that implements toolkit-specific method: // ---------------------------------------------------------------------------- -#ifdef __WXGTK20__ - #include - #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 - #include #include + #include #define GetDisplay() GDK_DISPLAY() #define GetXWindow(wxwin) GDK_WINDOW_XWINDOW((wxwin)->m_widget->window) #elif defined(__WXX11__) || defined(__WXMOTIF__) @@ -118,29 +107,25 @@ protected: BEGIN_EVENT_TABLE(wxTaskBarIconArea, wxTaskBarIconAreaBase) EVT_SIZE(wxTaskBarIconArea::OnSizeChange) EVT_MOUSE_EVENTS(wxTaskBarIconArea::OnMouseEvent) - EVT_MENU(-1, wxTaskBarIconArea::OnMenuEvent) + EVT_MENU(wxID_ANY, wxTaskBarIconArea::OnMenuEvent) EVT_PAINT(wxTaskBarIconArea::OnPaint) 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) @@ -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)); @@ -205,7 +190,7 @@ void wxTaskBarIconArea::SetLegacyWMProperties() 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); @@ -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