From: Carlos Garcia Campos Date: Fri, 3 Dec 2010 19:39:58 +0000 (+0100) Subject: GtkIconFactory: add gtk_icon_set_render_icon_pixbuf() X-Git-Url: http://pileus.org/git/?a=commitdiff_plain;h=905ba2f1983877bf45bc541cf3aa9a7c5cb0936d;p=~andy%2Fgtk GtkIconFactory: add gtk_icon_set_render_icon_pixbuf() and deprecate gtk_icon_set_render_icon(). --- diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt index bbf8178b1..d8f17b542 100644 --- a/docs/reference/gtk/gtk3-sections.txt +++ b/docs/reference/gtk/gtk3-sections.txt @@ -6087,6 +6087,7 @@ gtk_icon_set_new gtk_icon_set_new_from_pixbuf gtk_icon_set_ref gtk_icon_set_render_icon +gtk_icon_set_render_icon_pixbuf gtk_icon_set_unref gtk_icon_size_lookup gtk_icon_size_lookup_for_settings diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols index d7dc83e19..411a2e76d 100644 --- a/gtk/gtk.symbols +++ b/gtk/gtk.symbols @@ -1045,6 +1045,7 @@ gtk_icon_set_new gtk_icon_set_new_from_pixbuf gtk_icon_set_ref gtk_icon_set_render_icon +gtk_icon_set_render_icon_pixbuf gtk_icon_set_unref gtk_icon_size_from_name gtk_icon_size_get_name diff --git a/gtk/gtkiconfactory.c b/gtk/gtkiconfactory.c index b70a62872..5b21c62fd 100644 --- a/gtk/gtkiconfactory.c +++ b/gtk/gtkiconfactory.c @@ -1083,12 +1083,12 @@ gtk_icon_size_get_name (GtkIconSize size) static GdkPixbuf *find_in_cache (GtkIconSet *icon_set, - GtkStyle *style, + GtkStyleContext *style_context, GtkTextDirection direction, GtkStateType state, GtkIconSize size); static void add_to_cache (GtkIconSet *icon_set, - GtkStyle *style, + GtkStyleContext *style_context, GtkTextDirection direction, GtkStateType state, GtkIconSize size, @@ -1102,9 +1102,9 @@ static void clear_cache (GtkIconSet *icon_set, static GSList* copy_cache (GtkIconSet *icon_set, GtkIconSet *copy_recipient); static void attach_to_style (GtkIconSet *icon_set, - GtkStyle *style); + GtkStyleContext *style_context); static void detach_from_style (GtkIconSet *icon_set, - GtkStyle *style); + GtkStyleContext *style_context); static void style_dnotify (gpointer data); struct _GtkIconSet @@ -1369,12 +1369,8 @@ ensure_filename_pixbuf (GtkIconSet *icon_set, static GdkPixbuf * render_icon_name_pixbuf (GtkIconSource *icon_source, - GtkStyle *style, - GtkTextDirection direction, - GtkStateType state, - GtkIconSize size, - GtkWidget *widget, - const char *detail) + GtkStyleContext *context, + GtkIconSize size) { GdkPixbuf *pixbuf; GdkPixbuf *tmp_pixbuf; @@ -1386,17 +1382,7 @@ render_icon_name_pixbuf (GtkIconSource *icon_source, gint *sizes, *s, dist; GError *error = NULL; - if (widget && gtk_widget_has_screen (widget)) - screen = gtk_widget_get_screen (widget); - else if (style && style->visual) - screen = gdk_visual_get_screen (style->visual); - else - { - screen = gdk_screen_get_default (); - GTK_NOTE (MULTIHEAD, - g_warning ("Using the default screen for gtk_icon_source_render_icon()")); - } - + screen = gtk_style_context_get_screen (context); icon_theme = gtk_icon_theme_get_for_screen (screen); settings = gtk_settings_get_for_screen (screen); @@ -1487,9 +1473,7 @@ render_icon_name_pixbuf (GtkIconSource *icon_source, tmp_source.type = GTK_ICON_SOURCE_PIXBUF; tmp_source.source.pixbuf = tmp_pixbuf; - pixbuf = gtk_style_render_icon (style, &tmp_source, - direction, state, -1, - widget, detail); + pixbuf = gtk_render_icon_pixbuf (context, &tmp_source, -1); if (!pixbuf) g_warning ("Failed to render icon"); @@ -1501,12 +1485,10 @@ render_icon_name_pixbuf (GtkIconSource *icon_source, static GdkPixbuf * find_and_render_icon_source (GtkIconSet *icon_set, - GtkStyle *style, + GtkStyleContext *context, GtkTextDirection direction, GtkStateType state, - GtkIconSize size, - GtkWidget *widget, - const char *detail) + GtkIconSize size) { GSList *failed = NULL; GdkPixbuf *pixbuf = NULL; @@ -1535,9 +1517,7 @@ find_and_render_icon_source (GtkIconSet *icon_set, break; /* Fall through */ case GTK_ICON_SOURCE_PIXBUF: - pixbuf = gtk_style_render_icon (style, source, - direction, state, size, - widget, detail); + pixbuf = gtk_render_icon_pixbuf (context, source, size); if (!pixbuf) { g_warning ("Failed to render icon"); @@ -1546,9 +1526,7 @@ find_and_render_icon_source (GtkIconSet *icon_set, break; case GTK_ICON_SOURCE_ICON_NAME: case GTK_ICON_SOURCE_STATIC_ICON_NAME: - pixbuf = render_icon_name_pixbuf (source, style, - direction, state, size, - widget, detail); + pixbuf = render_icon_name_pixbuf (source, context, size); if (!pixbuf) failed = g_slist_prepend (failed, source); break; @@ -1565,12 +1543,10 @@ find_and_render_icon_source (GtkIconSet *icon_set, extern GtkIconCache *_builtin_cache; static GdkPixbuf* -render_fallback_image (GtkStyle *style, +render_fallback_image (GtkStyleContext *context, GtkTextDirection direction, GtkStateType state, - GtkIconSize size, - GtkWidget *widget, - const char *detail) + GtkIconSize size) { /* This icon can be used for any direction/state/size */ static GtkIconSource fallback_source = GTK_ICON_SOURCE_INIT (TRUE, TRUE, TRUE); @@ -1590,13 +1566,69 @@ render_fallback_image (GtkStyle *style, g_object_unref (pixbuf); } - return gtk_style_render_icon (style, - &fallback_source, - direction, - state, - size, - widget, - detail); + return gtk_render_icon_pixbuf (context, &fallback_source, size); +} + +/** + * gtk_icon_set_render_icon_pixbuf: + * @icon_set: a #GtkIconSet + * @context: a #GtkStyleContext + * @size: (type int): icon size. A size of (GtkIconSize)-1 + * means render at the size of the source and don't scale. + * + * Renders an icon using gtk_render_icon_pixbuf(). In most cases, + * gtk_widget_render_icon() is better, since it automatically provides + * most of the arguments from the current widget settings. This + * function never returns %NULL; if the icon can't be rendered + * (perhaps because an image file fails to load), a default "missing + * image" icon will be returned instead. + * + * Return value: (transfer full): a #GdkPixbuf to be displayed + * + * Since: 3.0 + */ +GdkPixbuf * +gtk_icon_set_render_icon_pixbuf (GtkIconSet *icon_set, + GtkStyleContext *context, + GtkIconSize size) +{ + GdkPixbuf *icon = NULL; + GtkStateFlags flags = 0; + GtkStateType state; + GtkTextDirection direction; + + g_return_val_if_fail (icon_set != NULL, NULL); + g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL); + + flags = gtk_style_context_get_state (context); + if (flags & GTK_STATE_FLAG_INSENSITIVE) + state = GTK_STATE_INSENSITIVE; + else if (flags & GTK_STATE_FLAG_PRELIGHT) + state = GTK_STATE_PRELIGHT; + else + state = GTK_STATE_NORMAL; + + direction = gtk_style_context_get_direction (context); + + if (icon_set->sources) + { + icon = find_in_cache (icon_set, context, direction, state, size); + if (icon) + { + g_object_ref (icon); + return icon; + } + } + + if (icon_set->sources) + icon = find_and_render_icon_source (icon_set, context, direction, state, size); + + if (icon == NULL) + icon = render_fallback_image (context, direction, state, size); + + add_to_cache (icon_set, context, direction, state, size, icon); + + return icon; } /** @@ -1622,6 +1654,8 @@ render_fallback_image (GtkStyle *style, * image" icon will be returned instead. * * Return value: (transfer full): a #GdkPixbuf to be displayed + * + * Deprecated: 3.0: Use gtk_icon_set_render_icon_pixbuf() instead */ GdkPixbuf* gtk_icon_set_render_icon (GtkIconSet *icon_set, @@ -1633,34 +1667,47 @@ gtk_icon_set_render_icon (GtkIconSet *icon_set, const char *detail) { GdkPixbuf *icon; + GtkStyleContext *context = NULL; + GtkStateFlags flags = 0; g_return_val_if_fail (icon_set != NULL, NULL); g_return_val_if_fail (style == NULL || GTK_IS_STYLE (style), NULL); - if (icon_set->sources == NULL) - return render_fallback_image (style, direction, state, size, widget, detail); - - if (detail == NULL) + if (style && gtk_style_has_context (style)) { - icon = find_in_cache (icon_set, style, direction, - state, size); - - if (icon) - { - g_object_ref (icon); - return icon; - } + g_object_get (style, "context", &context, NULL); + /* g_object_get returns a refed object */ + if (context) + g_object_unref (context); + } + else if (widget) + { + context = gtk_widget_get_style_context (widget); } + if (!context) + return render_fallback_image (context, direction, state, size); - icon = find_and_render_icon_source (icon_set, style, direction, state, size, - widget, detail); + gtk_style_context_save (context); - if (icon == NULL) - icon = render_fallback_image (style, direction, state, size, widget, detail); + switch (state) + { + case GTK_STATE_PRELIGHT: + flags |= GTK_STATE_FLAG_PRELIGHT; + break; + case GTK_STATE_INSENSITIVE: + flags |= GTK_STATE_FLAG_INSENSITIVE; + break; + default: + break; + } + + gtk_style_context_set_state (context, flags); + gtk_style_context_set_direction (context, direction); - if (detail == NULL) - add_to_cache (icon_set, style, direction, state, size, icon); + icon = gtk_icon_set_render_icon_pixbuf (icon_set, context, size); + + gtk_style_context_restore (context); return icon; } @@ -2376,7 +2423,7 @@ struct _CachedIcon /* These must all match to use the cached pixbuf. * If any don't match, we must re-render the pixbuf. */ - GtkStyle *style; + GtkStyleContext *style; GtkTextDirection direction; GtkStateType state; GtkIconSize size; @@ -2398,16 +2445,14 @@ static void cached_icon_free (CachedIcon *icon) { g_object_unref (icon->pixbuf); - - if (icon->style) - g_object_unref (icon->style); + g_object_unref (icon->style); g_free (icon); } static GdkPixbuf * find_in_cache (GtkIconSet *icon_set, - GtkStyle *style, + GtkStyleContext *style_context, GtkTextDirection direction, GtkStateType state, GtkIconSize size) @@ -2423,7 +2468,7 @@ find_in_cache (GtkIconSet *icon_set, { CachedIcon *icon = tmp_list->data; - if (icon->style == style && + if (icon->style == style_context && icon->direction == direction && icon->state == state && (size == (GtkIconSize)-1 || icon->size == size)) @@ -2448,7 +2493,7 @@ find_in_cache (GtkIconSet *icon_set, static void add_to_cache (GtkIconSet *icon_set, - GtkStyle *style, + GtkStyleContext *style_context, GtkTextDirection direction, GtkStateType state, GtkIconSize size, @@ -2460,26 +2505,16 @@ add_to_cache (GtkIconSet *icon_set, g_object_ref (pixbuf); - /* We have to ref the style, since if the style was finalized - * its address could be reused by another style, creating a - * really weird bug - */ - - if (style) - g_object_ref (style); - icon = g_new (CachedIcon, 1); icon_set->cache = g_slist_prepend (icon_set->cache, icon); icon_set->cache_size++; - icon->style = style; + icon->style = g_object_ref (style_context); icon->direction = direction; icon->state = state; icon->size = size; icon->pixbuf = pixbuf; - - if (icon->style) - attach_to_style (icon_set, icon->style); + attach_to_style (icon_set, icon->style); if (icon_set->cache_size >= NUM_CACHED_ICONS) { @@ -2512,7 +2547,7 @@ clear_cache (GtkIconSet *icon_set, gboolean style_detach) { GSList *cache, *tmp_list; - GtkStyle *last_style = NULL; + GtkStyleContext *last_style = NULL; cache = icon_set->cache; icon_set->cache = NULL; @@ -2561,11 +2596,8 @@ copy_cache (GtkIconSet *icon_set, *icon_copy = *icon; - if (icon_copy->style) - { - attach_to_style (copy_recipient, icon_copy->style); - g_object_ref (icon_copy->style); - } + attach_to_style (copy_recipient, icon_copy->style); + g_object_ref (icon_copy->style); g_object_ref (icon_copy->pixbuf); @@ -2580,18 +2612,18 @@ copy_cache (GtkIconSet *icon_set, } static void -attach_to_style (GtkIconSet *icon_set, - GtkStyle *style) +attach_to_style (GtkIconSet *icon_set, + GtkStyleContext *style_context) { GHashTable *table; - table = g_object_get_qdata (G_OBJECT (style), + table = g_object_get_qdata (G_OBJECT (style_context), g_quark_try_string ("gtk-style-icon-sets")); if (table == NULL) { table = g_hash_table_new (NULL, NULL); - g_object_set_qdata_full (G_OBJECT (style), + g_object_set_qdata_full (G_OBJECT (style_context), g_quark_from_static_string ("gtk-style-icon-sets"), table, style_dnotify); @@ -2601,12 +2633,12 @@ attach_to_style (GtkIconSet *icon_set, } static void -detach_from_style (GtkIconSet *icon_set, - GtkStyle *style) +detach_from_style (GtkIconSet *icon_set, + GtkStyleContext *style_context) { GHashTable *table; - table = g_object_get_qdata (G_OBJECT (style), + table = g_object_get_qdata (G_OBJECT (style_context), g_quark_try_string ("gtk-style-icon-sets")); if (table != NULL) diff --git a/gtk/gtkiconfactory.h b/gtk/gtkiconfactory.h index 1019cf6b4..69ab250b0 100644 --- a/gtk/gtkiconfactory.h +++ b/gtk/gtkiconfactory.h @@ -132,7 +132,6 @@ GdkPixbuf* gtk_icon_set_render_icon (GtkIconSet *icon_set, GtkWidget *widget, const char *detail); - void gtk_icon_set_add_source (GtkIconSet *icon_set, const GtkIconSource *source); diff --git a/gtk/gtkstylecontext.h b/gtk/gtkstylecontext.h index 132a90baf..a67e523a8 100644 --- a/gtk/gtkstylecontext.h +++ b/gtk/gtkstylecontext.h @@ -399,6 +399,9 @@ void gtk_style_context_get_style (GtkStyleContext *context, GtkIconSet * gtk_style_context_lookup_icon_set (GtkStyleContext *context, const gchar *stock_id); +GdkPixbuf * gtk_icon_set_render_icon_pixbuf (GtkIconSet *icon_set, + GtkStyleContext *context, + GtkIconSize size); void gtk_style_context_set_screen (GtkStyleContext *context, GdkScreen *screen);