+wxTaskBarIconArea::wxTaskBarIconArea(wxTaskBarIcon *icon, const wxBitmap &bmp)
+ : wxTaskBarIconAreaBase(), m_icon(icon), m_pos(0,0)
+{
+ 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()));
+
+ SetTrayIcon(bmp);
+}
+
+void wxTaskBarIconArea::SetTrayIcon(const wxBitmap& bmp)
+{
+ m_bmp = bmp;
+
+ // determine suitable bitmap size:
+ wxSize winsize(GetSize());
+ 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()
+{