]> git.saurik.com Git - wxWidgets.git/commitdiff
partially working wxTaskBarIcon for X11
authorVáclav Slavík <vslavik@fastmail.fm>
Sat, 5 Apr 2003 22:27:47 +0000 (22:27 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Sat, 5 Apr 2003 22:27:47 +0000 (22:27 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@19993 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/taskbar.h
include/wx/unix/taskbarx11.h [new file with mode: 0644]
src/unix/taskbarx11.cpp [new file with mode: 0644]

index 255f1f36d741415147db5e399fbf7d3f7b769b81..62fbd0a7b9bf6d6643b3b84ed1e528437b2fe036 100644 (file)
@@ -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:
 
index fc989414c4decaf107c377f66e7bed4e2f90c0e0..e80aff52177926f51cbfbe0df81e9a07604fd472 100644 (file)
@@ -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 (file)
index 0000000..0c924b7
--- /dev/null
@@ -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 (file)
index 0000000..1d01758
--- /dev/null
@@ -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 <X11/Xlib.h>
+#include <X11/Xatom.h>
+#ifdef __VMS
+#pragma message enable nosimpint
+#endif
+
+// ----------------------------------------------------------------------------
+// toolkit dependent methods to set properties on helper window:
+// ----------------------------------------------------------------------------
+
+#if defined(__WXGTK__)
+    #include <gdk/gdk.h>
+    #include <gdk/gdkx.h>
+    #include <gtk/gtk.h>
+    #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;
+}