]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/taskbar.cpp
Fix crash in wxDC::GetMultiLineTextExtent() after last commit.
[wxWidgets.git] / src / gtk / taskbar.cpp
index f3069bb79ec623b86328684d864a5888e8c5aea7..1aee6ca5b9287cb455c5f1d7bd812b6d0b3c40bd 100644 (file)
@@ -12,7 +12,7 @@
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
-#if wxUSE_TASKBARICON && defined(__WXGTK210__)
+#if wxUSE_TASKBARICON
 
 #include "wx/taskbar.h"
 
     #include "wx/icon.h"
 #endif
 
-#include "eggtrayicon.h"
 #include <gtk/gtk.h>
+#ifdef GDK_WINDOWING_X11
+    #include <gdk/gdkx.h>
+#endif
+#ifndef __WXGTK3__
+    #include "eggtrayicon.h"
+#endif
+
+#if !GTK_CHECK_VERSION(2,10,0)
+    typedef struct _GtkStatusIcon GtkStatusIcon;
+#endif
 
 class wxTaskBarIcon::Private
 {
@@ -37,20 +46,23 @@ public:
     wxTaskBarIcon* m_taskBarIcon;
     // used when GTK+ >= 2.10
     GtkStatusIcon* m_statusIcon;
-    // used when GTK+ < 2.10
-    GtkWidget* m_eggTrayIcon;
     // for PopupMenu
     wxWindow* m_win;
-    // for tooltip when GTK+ < 2.10
-    GtkTooltips* m_tooltips;
     wxBitmap m_bitmap;
     wxString m_tipText;
+#ifndef __WXGTK3__
+    // used when GTK+ < 2.10
+    GtkWidget* m_eggTrayIcon;
+    // for tooltip when GTK+ < 2.10
+    GtkTooltips* m_tooltips;
     // width and height of available space, only used when GTK+ < 2.10
     int m_size;
+#endif
 };
 //-----------------------------------------------------------------------------
 
 extern "C" {
+#ifndef __WXGTK3__
 static void
 icon_size_allocate(GtkWidget*, GtkAllocation* alloc, wxTaskBarIcon::Private* priv)
 {
@@ -65,6 +77,7 @@ icon_destroy(GtkWidget*, wxTaskBarIcon::Private* priv)
     priv->m_eggTrayIcon = NULL;
     priv->SetIcon();
 }
+#endif
 
 static void
 icon_activate(void*, wxTaskBarIcon* taskBarIcon)
@@ -87,6 +100,7 @@ icon_popup_menu(GtkWidget*, wxTaskBarIcon* taskBarIcon)
     return true;
 }
 
+#ifndef __WXGTK3__
 static gboolean
 icon_button_press_event(GtkWidget*, GdkEventButton* event, wxTaskBarIcon* taskBarIcon)
 {
@@ -99,6 +113,7 @@ icon_button_press_event(GtkWidget*, GdkEventButton* event, wxTaskBarIcon* taskBa
     }
     return false;
 }
+#endif
 
 #if GTK_CHECK_VERSION(2,10,0)
 static void
@@ -112,6 +127,7 @@ status_icon_popup_menu(GtkStatusIcon*, guint, guint, wxTaskBarIcon* taskBarIcon)
 
 bool wxTaskBarIconBase::IsAvailable()
 {
+#ifdef GDK_WINDOWING_X11
     char name[32];
     g_snprintf(name, sizeof(name), "_NET_SYSTEM_TRAY_S%d",
         gdk_x11_get_default_screen());
@@ -120,6 +136,9 @@ bool wxTaskBarIconBase::IsAvailable()
     Window manager = XGetSelectionOwner(gdk_x11_get_default_xdisplay(), atom);
 
     return manager != None;
+#else
+    return true;
+#endif
 }
 //-----------------------------------------------------------------------------
 
@@ -127,37 +146,43 @@ wxTaskBarIcon::Private::Private(wxTaskBarIcon* taskBarIcon)
 {
     m_taskBarIcon = taskBarIcon;
     m_statusIcon = NULL;
-    m_eggTrayIcon = NULL;
     m_win = NULL;
+#ifndef __WXGTK3__
+    m_eggTrayIcon = NULL;
     m_tooltips = NULL;
     m_size = 0;
+#endif
 }
 
 wxTaskBarIcon::Private::~Private()
 {
     if (m_statusIcon)
         g_object_unref(m_statusIcon);
+#ifndef __WXGTK3__
     else if (m_eggTrayIcon)
     {
         g_signal_handlers_disconnect_by_func(m_eggTrayIcon, (void*)icon_destroy, this);
         gtk_widget_destroy(m_eggTrayIcon);
     }
+#endif
     if (m_win)
     {
         m_win->PopEventHandler();
         m_win->Destroy();
     }
+#ifndef __WXGTK3__
     if (m_tooltips)
     {
         gtk_object_destroy(GTK_OBJECT(m_tooltips));
         g_object_unref(m_tooltips);
     }
+#endif
 }
 
 void wxTaskBarIcon::Private::SetIcon()
 {
 #if GTK_CHECK_VERSION(2,10,0)
-    if (gtk_check_version(2,10,0) == NULL)
+    if (GTK_CHECK_VERSION(3,0,0) || gtk_check_version(2,10,0) == NULL)
     {
         if (m_statusIcon)
             gtk_status_icon_set_from_pixbuf(m_statusIcon, m_bitmap.GetPixbuf());
@@ -173,10 +198,11 @@ void wxTaskBarIcon::Private::SetIcon()
     else
 #endif
     {
+#ifndef __WXGTK3__
         m_size = 0;
         if (m_eggTrayIcon)
         {
-            GtkWidget* image = GTK_BIN(m_eggTrayIcon)->child;
+            GtkWidget* image = gtk_bin_get_child(GTK_BIN(m_eggTrayIcon));
             gtk_image_set_from_pixbuf(GTK_IMAGE(image), m_bitmap.GetPixbuf());
         }
         else
@@ -195,18 +221,31 @@ void wxTaskBarIcon::Private::SetIcon()
             gtk_container_add(GTK_CONTAINER(m_eggTrayIcon), image);
             gtk_widget_show_all(m_eggTrayIcon);
         }
+#endif
     }
 #if wxUSE_TOOLTIPS
     const char *tip_text = NULL;
     if (!m_tipText.empty())
-        tip_text = m_tipText.c_str();
+        tip_text = m_tipText.utf8_str();
 
 #if GTK_CHECK_VERSION(2,10,0)
     if (m_statusIcon)
-        gtk_status_icon_set_tooltip(m_statusIcon, tip_text);
-    else
+    {
+#if GTK_CHECK_VERSION(2,16,0)
+        if (GTK_CHECK_VERSION(3,0,0) || gtk_check_version(2,16,0) == NULL)
+            gtk_status_icon_set_tooltip_text(m_statusIcon, tip_text);
+        else
 #endif
+        {
+#ifndef __WXGTK3__
+            gtk_status_icon_set_tooltip(m_statusIcon, tip_text);
+#endif
+        }
+    }
+    else
+#endif // GTK_CHECK_VERSION(2,10,0)
     {
+#ifndef __WXGTK3__
         if (tip_text && m_tooltips == NULL)
         {
             m_tooltips = gtk_tooltips_new();
@@ -215,10 +254,12 @@ void wxTaskBarIcon::Private::SetIcon()
         }
         if (m_tooltips)
             gtk_tooltips_set_tip(m_tooltips, m_eggTrayIcon, tip_text, "");
+#endif
     }
 #endif // wxUSE_TOOLTIPS
 }
 
+#ifndef __WXGTK3__
 void wxTaskBarIcon::Private::size_allocate(int width, int height)
 {
     int size = height;
@@ -236,16 +277,17 @@ void wxTaskBarIcon::Private::size_allocate(int width, int height)
         if (h > size) h = size;
         GdkPixbuf* pixbuf =
             gdk_pixbuf_scale_simple(m_bitmap.GetPixbuf(), w, h, GDK_INTERP_BILINEAR);
-        GtkImage* image = GTK_IMAGE(GTK_BIN(m_eggTrayIcon)->child);
+        GtkImage* image = GTK_IMAGE(gtk_bin_get_child(GTK_BIN(m_eggTrayIcon)));
         gtk_image_set_from_pixbuf(image, pixbuf);
         g_object_unref(pixbuf);
     }
 }
+#endif
 //-----------------------------------------------------------------------------
 
 IMPLEMENT_DYNAMIC_CLASS(wxTaskBarIcon, wxEvtHandler)
 
-wxTaskBarIcon::wxTaskBarIcon()
+wxTaskBarIcon::wxTaskBarIcon(wxTaskBarIconType WXUNUSED(iconType))
 {
     m_priv = new Private(this);
 }
@@ -272,7 +314,11 @@ bool wxTaskBarIcon::RemoveIcon()
 
 bool wxTaskBarIcon::IsIconInstalled() const
 {
+#ifdef __WXGTK3__
+    return m_priv->m_statusIcon != NULL;
+#else
     return m_priv->m_statusIcon || m_priv->m_eggTrayIcon;
+#endif
 }
 
 bool wxTaskBarIcon::PopupMenu(wxMenu* menu)