+class WXDLLIMPEXP_ADV wxTaskBarIconArea : public wxTaskBarIconAreaBase
+{
+public:
+    wxTaskBarIconArea(wxTaskBarIcon *icon, const wxBitmap &bmp);
+    void SetTrayIcon(const wxBitmap& bmp);
+    bool IsOk() { return true; }
+
+protected:
+    void SetLegacyWMProperties();
+
+    void OnSizeChange(wxSizeEvent& event);
+    void OnPaint(wxPaintEvent& evt);
+    void OnMouseEvent(wxMouseEvent& event);
+    void OnMenuEvent(wxCommandEvent& event);
+
+    wxTaskBarIcon *m_icon;
+    wxPoint        m_pos;
+    wxBitmap       m_bmp;
+
+    DECLARE_EVENT_TABLE()
+};
+
+BEGIN_EVENT_TABLE(wxTaskBarIconArea, wxTaskBarIconAreaBase)
+    EVT_SIZE(wxTaskBarIconArea::OnSizeChange)
+    EVT_MOUSE_EVENTS(wxTaskBarIconArea::OnMouseEvent)
+    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_bmp(bmp)
+{
+#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):
+    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)
+{
+    m_bmp = bmp;
+
+    // determine suitable bitmap size:
+    wxSize winsize(GetClientSize());
+    wxSize bmpsize(m_bmp.GetWidth(), m_bmp.GetHeight());
+    wxSize iconsize(wxMin(winsize.x, bmpsize.x), wxMin(winsize.y, bmpsize.y));
+
+    // rescale the bitmap to fit into the tray icon window:
+    if (bmpsize != iconsize)
+    {
+        wxImage img = m_bmp.ConvertToImage();
+        img.Rescale(iconsize.x, iconsize.y);
+        m_bmp = wxBitmap(img);
+    }
+
+    wxRegion region;
+    region.Union(m_bmp);
+
+    // if the bitmap is smaller than the window, offset it:
+    if (winsize != iconsize)
+    {
+        m_pos.x = (winsize.x - iconsize.x) / 2;
+        m_pos.y = (winsize.y - iconsize.y) / 2;
+        region.Offset(m_pos.x, m_pos.y);
+    }
+
+    // set frame's shape to correct value and redraw:
+    SetShape(region);
+    Refresh();
+}
+
+void wxTaskBarIconArea::SetLegacyWMProperties()
+{