From d2fc1c7ee02220d9db120e0f73cdf99225ba27eb Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 2 Aug 2008 05:07:02 +0000 Subject: [PATCH] Add GIcon support to GtkStatusIcon svn path=/trunk/; revision=20940 --- ChangeLog | 8 +++ gtk/gtk.symbols | 3 + gtk/gtkstatusicon.c | 170 +++++++++++++++++++++++++++++++++++++++++++- gtk/gtkstatusicon.h | 5 ++ 4 files changed, 183 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 648d579b9..7284ef88c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-08-02 Matthias Clasen + + 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 Bug 429427 – Add "arrow-spacing" style property to GtkRange diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols index 29dd8e582..56afd150b 100644 --- a/gtk/gtk.symbols +++ b/gtk/gtk.symbols @@ -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 diff --git a/gtk/gtkstatusicon.c b/gtk/gtkstatusicon.c index 52b8d8566..61ebcb09e 100644 --- a/gtk/gtkstatusicon.c +++ b/gtk/gtkstatusicon.c @@ -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 diff --git a/gtk/gtkstatusicon.h b/gtk/gtkstatusicon.h index 677d9b923..cacb406cd 100755 --- a/gtk/gtkstatusicon.h +++ b/gtk/gtkstatusicon.h @@ -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); -- 2.43.2