Add GIcon support to GtkStatusIcon

svn path=/trunk/; revision=20940
This commit is contained in:
Matthias Clasen 2008-08-02 05:07:02 +00:00
parent 5b980c221a
commit d2fc1c7ee0
4 changed files with 183 additions and 3 deletions

View File

@ -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

View 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

View 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;
@ -210,6 +212,22 @@ gtk_status_icon_class_init (GtkStatusIconClass *class)
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)
{
@ -1174,6 +1225,53 @@ 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);
@ -1333,6 +1431,13 @@ 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

View File

@ -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);