/////////////////////////////////////////////////////////////////////////
-// File: taskbar.cpp
+// File: src/unix/taskbarx11.cpp
// Purpose: wxTaskBarIcon class for common Unix desktops
// Author: Vaclav Slavik
// Modified by:
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "taskbarx11.h"
-#endif
-
// NB: This implementation does *not* work with every X11 window manager.
// Currently only GNOME 1.2 and KDE 1,2,3 methods are implemented here.
// Freedesktop.org's System Tray specification is implemented in
#include "wx/wxprec.h"
#include "wx/taskbar.h"
-#include "wx/frame.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/log.h"
+ #include "wx/frame.h"
+ #include "wx/dcclient.h"
+#endif
+
#include "wx/bitmap.h"
#include "wx/statbmp.h"
#include "wx/sizer.h"
-#include "wx/dcclient.h"
-#include "wx/log.h"
+#include "wx/image.h"
#ifdef __VMS
#pragma message disable nosimpint
// ----------------------------------------------------------------------------
#ifdef __WXGTK20__
- #include "wx/gtk/taskbarpriv.h"
-#else
+ #include <gtk/gtk.h>
+ #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:
#error "You must define X11 accessors for this port!"
#endif
-
+
// ----------------------------------------------------------------------------
// wxTaskBarIconArea is the real window that shows the icon:
// ----------------------------------------------------------------------------
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);
wxTaskBarIcon *m_icon;
wxPoint m_pos;
wxBitmap m_bmp;
-
+
DECLARE_EVENT_TABLE()
};
EVT_MENU(-1, wxTaskBarIconArea::OnMenuEvent)
EVT_PAINT(wxTaskBarIconArea::OnPaint)
END_EVENT_TABLE()
-
+
wxTaskBarIconArea::wxTaskBarIconArea(wxTaskBarIcon *icon, const wxBitmap &bmp)
: wxTaskBarIconAreaBase(), m_icon(icon), m_pos(0,0)
{
_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-2, bmpsize.x), wxMin(winsize.y-2, bmpsize.y));
+ 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)
}
wxRegion region;
- if (m_bmp.GetMask())
- region.Union(m_bmp);
- else
- region.Union(0,0, iconsize.x, iconsize.y);
+ region.Union(m_bmp);
// if the bitmap is smaller than the window, offset it:
if (winsize != iconsize)
}
void wxTaskBarIconArea::SetLegacyWMProperties()
-{
+{
#ifdef __WXGTK__
gtk_widget_realize(m_widget);
#endif
-
+
long data[1];
-
+
// KDE 2 & KDE 3:
Atom _KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR =
XInternAtom(GetDisplay(), "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR", False);
KWM_DOCKWINDOW, 32,
PropModeReplace, (unsigned char*)data, 1);
}
-
-void wxTaskBarIconArea::OnSizeChange(wxSizeEvent& event)
+
+void wxTaskBarIconArea::OnSizeChange(wxSizeEvent& WXUNUSED(event))
{
wxLogTrace(_T("systray"), _T("icon size changed to %i x %i"),
GetSize().x, GetSize().y);
wxPaintDC dc(this);
dc.DrawBitmap(m_bmp, m_pos.x, m_pos.y, true);
}
-
+
void wxTaskBarIconArea::OnMouseEvent(wxMouseEvent& event)
{
wxEventType type = 0;
}
void wxTaskBarIconArea::OnMenuEvent(wxCommandEvent& event)
-{
+{
m_icon->ProcessEvent(event);
}
else
{
m_iconWnd->SetTrayIcon(bmp);
- }
-
+ }
+
#if wxUSE_TOOLTIPS
if (!tooltip.empty())
m_iconWnd->SetToolTip(tooltip);
else
m_iconWnd->SetToolTip(NULL);
+#else
+ wxUnusedVar(tooltip);
#endif
return true;
}
{
if (!m_iconWnd)
return false;
- wxSize size(m_iconWnd->GetClientSize());
- m_iconWnd->PopupMenu(menu, size.x/2, size.y/2);
+ m_iconWnd->PopupMenu(menu);
return true;
}