From fb29dcac01af849053d8f85b69aae7e7ca8c7d26 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Sat, 5 Apr 2003 22:27:47 +0000 Subject: [PATCH] partially working wxTaskBarIcon for X11 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@19993 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + include/wx/taskbar.h | 2 + include/wx/unix/taskbarx11.h | 46 +++++++ src/unix/taskbarx11.cpp | 226 +++++++++++++++++++++++++++++++++++ 4 files changed, 275 insertions(+) create mode 100644 include/wx/unix/taskbarx11.h create mode 100644 src/unix/taskbarx11.cpp diff --git a/docs/changes.txt b/docs/changes.txt index 255f1f36d7..62fbd0a7b9 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -74,6 +74,7 @@ Unix: - fixed compilation on systems with zlib installed but < 1.1.3 version - fixed compilation on Solaris 7 with large files support enabled +- added wxTaskBarIcon implementation for X11 wxGTK: diff --git a/include/wx/taskbar.h b/include/wx/taskbar.h index fc989414c4..e80aff5217 100644 --- a/include/wx/taskbar.h +++ b/include/wx/taskbar.h @@ -18,6 +18,8 @@ class WXDLLEXPORT wxTaskBarIconBase : public wxEvtHandler #if defined(__WXMSW__) #include "wx/msw/taskbar.h" +#elif defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) + #include "wx/unix/taskbarx11.h" #endif diff --git a/include/wx/unix/taskbarx11.h b/include/wx/unix/taskbarx11.h new file mode 100644 index 0000000000..0c924b7b78 --- /dev/null +++ b/include/wx/unix/taskbarx11.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////// +// File: wx/unix/taskbarx11.h +// Purpose: Defines wxTaskBarIcon class for most common X11 desktops +// Author: Vaclav Slavik +// Modified by: +// Created: 04/04/2003 +// RCS-ID: $Id$ +// Copyright: (c) Vaclav Slavik, 2003 +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////// + +#ifndef _TASKBAR_H_ +#define _TASKBAR_H_ + +#ifdef __GNUG__ +#pragma interface "taskbarx11.h" +#endif + +class WXDLLEXPORT wxIcon; +class WXDLLEXPORT wxFrame; +class WXDLLEXPORT wxWindow; + +class WXDLLEXPORT wxTaskBarIcon: public wxTaskBarIconBase +{ +public: + wxTaskBarIcon(); + virtual ~wxTaskBarIcon(); + + // Accessors: + bool IsOk() const; + bool IsIconInstalled() const; + + // Operations: + bool SetIcon(const wxIcon& icon, const wxString& tooltip = wxEmptyString); + bool RemoveIcon(); + bool PopupMenu(wxMenu *menu); + +protected: + wxFrame *m_iconWnd; + wxWindow *m_iconArea; + + DECLARE_DYNAMIC_CLASS(wxTaskBarIcon) +}; + +#endif + // _TASKBAR_H_ diff --git a/src/unix/taskbarx11.cpp b/src/unix/taskbarx11.cpp new file mode 100644 index 0000000000..1d01758c9f --- /dev/null +++ b/src/unix/taskbarx11.cpp @@ -0,0 +1,226 @@ +///////////////////////////////////////////////////////////////////////// +// File: taskbar.cpp +// Purpose: wxTaskBarIcon class for common Unix desktops +// Author: Vaclav Slavik +// Modified by: +// Created: 04/04/2003 +// RCS-ID: $Id$ +// Copyright: (c) Vaclav Slavik, 2003 +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////// + +#ifdef __GNUG__ +#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. +// +// FIXME: implement: +// - GNOME 2 support (see www.freedesktop.org for specification; +// KDE 3 uses this method as well, even though legacy KDE +// method we implement works as well) +// - IceWM and XFCE support (?) +// +// Thanks to Ian Campbell, author of XMMS Status Docklet, for publishing +// KDE and GNOME 1.2 methods. + + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#include "wx/taskbar.h" +#include "wx/frame.h" +#include "wx/bitmap.h" +#include "wx/statbmp.h" + +#ifdef __VMS +#pragma message disable nosimpint +#endif +#include +#include +#ifdef __VMS +#pragma message enable nosimpint +#endif + +// ---------------------------------------------------------------------------- +// toolkit dependent methods to set properties on helper window: +// ---------------------------------------------------------------------------- + +#if defined(__WXGTK__) + #include + #include + #include + #define GetDisplay() GDK_DISPLAY() + #define GetXWindow(wxwin) GDK_WINDOW_XWINDOW((wxwin)->m_widget->window) +#elif defined(__WXX11__) || defined(__WXMOTIF__) + #include "wx/x11/privx.h" + #define GetDisplay() ((Display*)wxGlobalDisplay()) + #define GetXWindow(wxwin) ((Window)(wxwin)->GetHandle()) +#else + #error "You must define X11 accessors for this port!" +#endif + +// ---------------------------------------------------------------------------- +// code for making wxFrame a toolbar icon by setting appropriate properties: +// ---------------------------------------------------------------------------- + +static bool wxMakeTaskBarIcon(wxFrame *wnd) +{ +#ifdef __WXGTK__ + gtk_widget_realize(wnd->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); + data[0] = 0; + XChangeProperty(GetDisplay(), GetXWindow(wnd), + _KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR, + XA_WINDOW, 32, + PropModeReplace, (unsigned char*)data, 1); + + // GNOME 1.2 & KDE 1: + Atom KWM_DOCKWINDOW = + XInternAtom(GetDisplay(), "KWM_DOCKWINDOW", False); + data[0] = 1; + XChangeProperty(GetDisplay(), GetXWindow(wnd), + KWM_DOCKWINDOW, + KWM_DOCKWINDOW, 32, + PropModeReplace, (unsigned char*)data, 1); + + return true; +} + +// ---------------------------------------------------------------------------- +// wxTaskBarIconArea is the real window that shows the icon: +// ---------------------------------------------------------------------------- + +class wxTaskBarIconArea : public wxStaticBitmap +{ +public: + wxTaskBarIconArea(wxTaskBarIcon *icon, + wxWindow *parent, const wxBitmap &bmp) + : wxStaticBitmap(parent, -1, bmp), m_icon(icon) {} + +protected: + void OnMouseEvent(wxMouseEvent& event); + void OnMenuEvent(wxCommandEvent& event); + + wxTaskBarIcon *m_icon; + + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(wxTaskBarIconArea, wxStaticBitmap) + EVT_MOUSE_EVENTS(wxTaskBarIconArea::OnMouseEvent) + EVT_MENU(-1, wxTaskBarIconArea::OnMenuEvent) +END_EVENT_TABLE() + +void wxTaskBarIconArea::OnMouseEvent(wxMouseEvent& event) +{ + wxEventType type = 0; + wxEventType mtype = event.GetEventType(); + + if (mtype == wxEVT_LEFT_DOWN) + type = wxEVT_TASKBAR_LEFT_DOWN; + else if (mtype == wxEVT_LEFT_UP) + type = wxEVT_TASKBAR_LEFT_UP; + else if (mtype == wxEVT_LEFT_DCLICK) + type = wxEVT_TASKBAR_LEFT_DCLICK; + else if (mtype == wxEVT_RIGHT_DOWN) + type = wxEVT_TASKBAR_RIGHT_DOWN; + else if (mtype == wxEVT_RIGHT_UP) + type = wxEVT_TASKBAR_RIGHT_UP; + else if (mtype == wxEVT_RIGHT_DCLICK) + type = wxEVT_TASKBAR_RIGHT_DCLICK; + else if (mtype == wxEVT_MOTION) + type = wxEVT_TASKBAR_MOVE; + else + return; + + wxTaskBarIconEvent e(type, m_icon); + m_icon->ProcessEvent(e); +} + +void wxTaskBarIconArea::OnMenuEvent(wxCommandEvent& event) +{ + m_icon->ProcessEvent(event); +} + +// ---------------------------------------------------------------------------- +// wxTaskBarIcon class: +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxTaskBarIcon, wxEvtHandler) + +wxTaskBarIcon::wxTaskBarIcon() : m_iconWnd(NULL) +{ +} + +wxTaskBarIcon::~wxTaskBarIcon() +{ + if (m_iconWnd) + RemoveIcon(); +} + +bool wxTaskBarIcon::IsOk() const +{ + return true; +} + +bool wxTaskBarIcon::IsIconInstalled() const +{ + return m_iconWnd != NULL; +} + +bool wxTaskBarIcon::SetIcon(const wxIcon& icon, const wxString& tooltip) +{ + if (m_iconWnd) + RemoveIcon(); + + m_iconWnd = new wxFrame(NULL, -1, wxT("taskbar icon"), + wxDefaultPosition, wxDefaultSize, + wxDEFAULT_FRAME_STYLE | wxFRAME_NO_TASKBAR); + wxBitmap bmp; + bmp.CopyFromIcon(icon); + wxTaskBarIconArea *area = new wxTaskBarIconArea(this, m_iconWnd, bmp); + m_iconWnd->SetClientSize(area->GetSize()); +#if wxUSE_TOOLTIPS + if (!tooltip.empty()) + area->SetToolTip(tooltip); +#endif + if (wxMakeTaskBarIcon(m_iconWnd)) + { + m_iconWnd->Show(); + m_iconArea = area; + return true; + } + else + { + m_iconWnd->Destroy(); + m_iconWnd = NULL; + return false; + } +} + +bool wxTaskBarIcon::RemoveIcon() +{ + if (!m_iconWnd) + return false; + m_iconWnd->Destroy(); + m_iconWnd = NULL; + return true; +} + +bool wxTaskBarIcon::PopupMenu(wxMenu *menu) +{ + if (!m_iconWnd) + return false; + wxSize size(m_iconArea->GetSize()); + m_iconArea->PopupMenu(menu, size.x/2, size.y/2); + return true; +} -- 2.45.2