]> Pileus Git - ~andy/gtk/commitdiff
Add GIcon support to GtkStatusIcon
authorMatthias Clasen <matthiasc@src.gnome.org>
Sat, 2 Aug 2008 05:07:02 +0000 (05:07 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Sat, 2 Aug 2008 05:07:02 +0000 (05:07 +0000)
svn path=/trunk/; revision=20940

ChangeLog
gtk/gtk.symbols
gtk/gtkstatusicon.c
gtk/gtkstatusicon.h

index 648d579b9042b5e873dd0ba69c3db3aabdc9b944..7284ef88c5900436c44aa04ce2bc46ad66aa09e3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-08-02  Matthias Clasen  <mclasen@redhat.com>
+       
+       Bug 544302 – GtkStatusIcon should support GIcon
+
+       * gtk/gtk.symbols:
+       * gtk/gtkstatusicon.[hc]: Add GIcon support to GtkStatusIcon.
+       Patch by Christian Dywan
+
 2008-08-02  Matthias Clasen  <mclasen@redhat.com>
        
        Bug 429427 – Add "arrow-spacing" style property to GtkRange
index 29dd8e582b163d2971421bc0159da827b7ee98fd..56afd150bb0bee08c95011ccb11a79ba1a745a9e 100644 (file)
@@ -1117,15 +1117,18 @@ gtk_status_icon_new_from_pixbuf
 gtk_status_icon_new_from_file
 gtk_status_icon_new_from_stock
 gtk_status_icon_new_from_icon_name
+gtk_status_icon_new_from_gicon
 gtk_status_icon_set_from_pixbuf
 gtk_status_icon_set_from_file
 gtk_status_icon_set_from_stock
 gtk_status_icon_set_from_icon_name
+gtk_status_icon_set_from_gicon
 gtk_status_icon_get_storage_type
 gtk_status_icon_get_pixbuf
 gtk_status_icon_get_screen
 gtk_status_icon_get_stock
 gtk_status_icon_get_icon_name
+gtk_status_icon_get_gicon
 gtk_status_icon_get_size
 gtk_status_icon_set_screen
 gtk_status_icon_set_tooltip
index 52b8d85662feabed38020594bd20da3a121f2cac..61ebcb09e88c31bc94dfc56faed8ec887ed2b4ea 100644 (file)
@@ -71,6 +71,7 @@ enum
   PROP_FILE,
   PROP_STOCK,
   PROP_ICON_NAME,
+  PROP_GICON,
   PROP_STORAGE_TYPE,
   PROP_SIZE,
   PROP_SCREEN,
@@ -125,6 +126,7 @@ struct _GtkStatusIconPrivate
       GdkPixbuf *pixbuf;
       gchar     *stock_id;
       gchar     *icon_name;
+      GIcon     *gicon;
     } image_data;
 
   GdkPixbuf    *blank_icon;
@@ -209,7 +211,23 @@ gtk_status_icon_class_init (GtkStatusIconClass *class)
                                                         P_("The name of the icon from the icon theme"),
                                                         NULL,
                                                         GTK_PARAM_READWRITE));
-  
+
+  /**
+   * GtkStatusIcon:gicon:
+   *
+   * The #GIcon displayed in the #GtkStatusIcon. For themed icons,
+   * the image will be updated automatically if the theme changes.
+   *
+   * Since: 2.14
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_GICON,
+                                   g_param_spec_object ("gicon",
+                                                        P_("GIcon"),
+                                                        P_("The GIcon being displayed"),
+                                                        G_TYPE_ICON,
+                                                        GTK_PARAM_READWRITE));
+
   g_object_class_install_property (gobject_class,
                                   PROP_STORAGE_TYPE,
                                   g_param_spec_enum ("storage-type",
@@ -698,6 +716,9 @@ gtk_status_icon_set_property (GObject      *object,
     case PROP_ICON_NAME:
       gtk_status_icon_set_from_icon_name (status_icon, g_value_get_string (value));
       break;
+    case PROP_GICON:
+      gtk_status_icon_set_from_gicon (status_icon, g_value_get_object (value));
+      break;
     case PROP_SCREEN:
       gtk_status_icon_set_screen (status_icon, g_value_get_object (value));
       break;
@@ -748,6 +769,17 @@ gtk_status_icon_get_property (GObject    *object,
       else
        g_value_set_string (value, gtk_status_icon_get_icon_name (status_icon));
       break;
+    case PROP_GICON:
+      if (priv->storage_type != GTK_IMAGE_GICON)
+        g_value_set_object (value, NULL);
+      else
+        {
+          GIcon *icon;
+
+          gtk_status_icon_get_gicon (status_icon, &icon);
+          g_value_set_object (value, icon);
+        }
+      break;
     case PROP_STORAGE_TYPE:
       g_value_set_enum (value, gtk_status_icon_get_storage_type (status_icon));
       break;
@@ -878,6 +910,25 @@ gtk_status_icon_new_from_icon_name (const gchar *icon_name)
                       NULL);
 }
 
+/**
+ * gtk_status_icon_new_from_gicon:
+ * @icon: a #GIcon
+ *
+ * Creates a status icon displaying a #GIcon. If the icon is a
+ * themed icon, it will be updated when the theme changes.
+ *
+ * Return value: a new #GtkStatusIcon
+ *
+ * Since: 2.14
+ **/
+GtkStatusIcon *
+gtk_status_icon_new_from_gicon (GIcon *icon)
+{
+  return g_object_new (GTK_TYPE_STATUS_ICON,
+                      "gicon", icon,
+                      NULL);
+}
+
 static void
 emit_activate_signal (GtkStatusIcon *status_icon)
 {
@@ -1173,7 +1224,54 @@ gtk_status_icon_update_image (GtkStatusIcon *status_icon)
        
       }
       break;
-      
+
+    case GTK_IMAGE_GICON:
+      {
+#ifdef GDK_WINDOWING_X11
+        GtkIconSize size = find_icon_size (priv->image, priv->size);
+        gtk_image_set_from_gicon (GTK_IMAGE (priv->image),
+                                  priv->image_data.gicon,
+                                  size);
+#endif
+#ifdef GDK_WINDOWING_WIN32
+      {
+        GtkIconInfo *info =
+        gtk_icon_theme_lookup_by_gicon (gtk_icon_theme_get_default (),
+                                        priv->image_data.gicon,
+                                        priv->size,
+                                        0);
+        GdkPixbuf *pixbuf = gtk_icon_icon_info_load_icon (info, NULL);
+
+        prev_hicon = priv->nid.hIcon;
+        priv->nid.hIcon = gdk_win32_pixbuf_to_hicon_libgtk_only (pixbuf);
+        priv->nid.uFlags |= NIF_ICON;
+        if (priv->nid.hWnd != NULL && priv->visible)
+          if (!Shell_NotifyIconW (NIM_MODIFY, &priv->nid))
+            g_warning ("%s:%d:Shell_NotifyIcon(NIM_MODIFY) failed", __FILE__, __LINE__-1);
+          if (prev_hicon)
+            DestroyIcon (prev_hicon);
+          g_object_unref (pixbuf);
+      }
+#endif
+#ifdef GDK_WINDOWING_QUARTZ
+      {
+        GtkIconInfo *info =
+        gtk_icon_theme_lookup_by_gicon (gtk_icon_theme_get_default (),
+                                        priv->image_data.gicon,
+                                        priv->size,
+                                        0);
+        GdkPixbuf *pixbuf = gtk_icon_icon_info_load_icon (info, NULL);
+
+        QUARTZ_POOL_ALLOC;
+        [priv->status_item setImage:pixbuf];
+        QUARTZ_POOL_RELEASE;
+        g_object_unref (pixbuf);
+      }
+#endif
+
+      }
+      break;
+
     case GTK_IMAGE_EMPTY:
 #ifdef GDK_WINDOWING_X11
       gtk_image_set_from_pixbuf (GTK_IMAGE (priv->image), NULL);
@@ -1332,7 +1430,14 @@ gtk_status_icon_reset_image_data (GtkStatusIcon *status_icon)
 
       g_object_notify (G_OBJECT (status_icon), "icon-name");
       break;
-      
+
+    case GTK_IMAGE_GICON:
+      g_free (priv->image_data.gicon);
+      priv->image_data.gicon = NULL;
+
+      g_object_notify (G_OBJECT (status_icon), "gicon");
+      break;
+
     case GTK_IMAGE_EMPTY:
       break;
     default:
@@ -1372,6 +1477,10 @@ gtk_status_icon_set_image (GtkStatusIcon *status_icon,
       priv->image_data.icon_name = g_strdup ((const gchar *)data);
       g_object_notify (G_OBJECT (status_icon), "icon-name");
       break;
+    case GTK_IMAGE_GICON:
+      priv->image_data.gicon = (GIcon *)data;
+      g_object_notify (G_OBJECT (status_icon), "gicon");
+      break;
     default:
       g_warning ("Image type %u not handled by GtkStatusIcon", storage_type);
     }
@@ -1475,6 +1584,27 @@ gtk_status_icon_set_from_icon_name (GtkStatusIcon *status_icon,
                             (gpointer) icon_name);
 }
 
+/**
+ * gtk_status_icon_set_from_gicon:
+ * @status_icon: a #GtkStatusIcon
+ * @icon: a GIcon
+ *
+ * Makes @status_icon display the #GIcon.
+ * See gtk_status_icon_new_from_gicon() for details.
+ *
+ * Since: 2.14
+ **/
+void
+gtk_status_icon_set_from_gicon (GtkStatusIcon *status_icon,
+                                GIcon         *icon)
+{
+  g_return_if_fail (GTK_IS_STATUS_ICON (status_icon));
+  g_return_if_fail (icon != NULL);
+
+  gtk_status_icon_set_image (status_icon, GTK_IMAGE_GICON,
+                             (gpointer) icon);
+}
+
 /**
  * gtk_status_icon_get_storage_type:
  * @status_icon: a #GtkStatusIcon
@@ -1591,6 +1721,40 @@ gtk_status_icon_get_icon_name (GtkStatusIcon *status_icon)
   return priv->image_data.icon_name;
 }
 
+/**
+ * gtk_status_icon_get_gicon:
+ * @status_icon: a #GtkStatusIcon
+ * @icon: a place to store a #GIcon
+ *
+ * Retrieves the #GIcon being displayed by the #GtkStatusIcon.
+ * The storage type of the status icon must be %GTK_IMAGE_EMPTY or
+ * %GTK_IMAGE_GICON (see gtk_status_icon_get_storage_type()).
+ * The caller of this function does not own a reference to the
+ * returned #GIcon.
+ *
+ * If this function fails, @icon is left unchanged;
+ *
+ * Since: 2.14
+ **/
+void
+gtk_status_icon_get_gicon (GtkStatusIcon  *status_icon,
+                           GIcon         **icon)
+{
+  GtkStatusIconPrivate *priv;
+
+  g_return_if_fail (GTK_IS_STATUS_ICON (status_icon));
+
+  priv = status_icon->priv;
+
+  g_return_if_fail (priv->storage_type == GTK_IMAGE_GICON ||
+                    priv->storage_type == GTK_IMAGE_EMPTY);
+
+  if (priv->storage_type == GTK_IMAGE_EMPTY)
+    priv->image_data.gicon = NULL;
+
+  *icon = priv->image_data.gicon;
+}
+
 /**
  * gtk_status_icon_get_size:
  * @status_icon: a #GtkStatusIcon
index 677d9b923a8e9856fe10e7fcc62ad711cb041f94..cacb406cd022b04c162b1033a83ca23fcf34c96c 100755 (executable)
@@ -77,6 +77,7 @@ GtkStatusIcon        *gtk_status_icon_new_from_pixbuf    (GdkPixbuf          *pi
 GtkStatusIcon        *gtk_status_icon_new_from_file      (const gchar        *filename);
 GtkStatusIcon        *gtk_status_icon_new_from_stock     (const gchar        *stock_id);
 GtkStatusIcon        *gtk_status_icon_new_from_icon_name (const gchar        *icon_name);
+GtkStatusIcon        *gtk_status_icon_new_from_gicon     (GIcon              *icon);
 
 void                  gtk_status_icon_set_from_pixbuf    (GtkStatusIcon      *status_icon,
                                                          GdkPixbuf          *pixbuf);
@@ -86,12 +87,16 @@ void                  gtk_status_icon_set_from_stock     (GtkStatusIcon      *st
                                                          const gchar        *stock_id);
 void                  gtk_status_icon_set_from_icon_name (GtkStatusIcon      *status_icon,
                                                          const gchar        *icon_name);
+void                  gtk_status_icon_set_from_gicon     (GtkStatusIcon      *status_icon,
+                                                          GIcon              *icon);
 
 GtkImageType          gtk_status_icon_get_storage_type   (GtkStatusIcon      *status_icon);
 
 GdkPixbuf            *gtk_status_icon_get_pixbuf         (GtkStatusIcon      *status_icon);
 G_CONST_RETURN gchar *gtk_status_icon_get_stock          (GtkStatusIcon      *status_icon);
 G_CONST_RETURN gchar *gtk_status_icon_get_icon_name      (GtkStatusIcon      *status_icon);
+void                  gtk_status_icon_get_gicon          (GtkStatusIcon      *status_icon,
+                                                          GIcon             **icon);
 
 gint                  gtk_status_icon_get_size           (GtkStatusIcon      *status_icon);