--- gtk+-2.6.4/gtk/gtkstyle.c 2005-01-18 18:43:45.000000000 +0200 +++ gtk+-2.6.4/gtk/gtkstyle.c 2005-04-06 16:19:37.951768816 +0300 @@ -38,6 +38,7 @@ #include "gtkthemes.h" #include "gtkiconfactory.h" #include "gtksettings.h" /* _gtk_settings_parse_convert() */ +#include "gtkhashtable.h" #define LIGHTNESS_MULT 1.3 #define DARKNESS_MULT 0.7 @@ -49,6 +50,14 @@ GValue value; } PropertyValue; +#define GTK_STYLE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_STYLE, GtkStylePrivate)) + +typedef struct _GtkStylePrivate GtkStylePrivate; + +struct _GtkStylePrivate { + GSList *logical_color_hashes; +}; + /* --- prototypes --- */ static void gtk_style_init (GtkStyle *style); static void gtk_style_class_init (GtkStyleClass *klass); @@ -655,6 +664,7 @@ klass->draw_layout = gtk_default_draw_layout; klass->draw_resize_grip = gtk_default_draw_resize_grip; + g_type_class_add_private (object_class, sizeof (GtkStylePrivate)); /** * GtkStyle::realize: @@ -714,9 +724,28 @@ } static void +free_object_list (GSList *list) +{ + if (list) + { + GSList *tmp_list = list; + + while (tmp_list) + { + g_object_unref (tmp_list->data); + tmp_list = tmp_list->next; + } + + g_slist_free (list); + } + +} + +static void gtk_style_finalize (GObject *object) { GtkStyle *style = GTK_STYLE (object); + GtkStylePrivate *priv = GTK_STYLE_GET_PRIVATE (style); g_return_if_fail (style->attach_count == 0); @@ -745,19 +774,9 @@ g_slist_free_1 (style->styles); } } - - if (style->icon_factories) - { - GSList *tmp_list = style->icon_factories; - - while (tmp_list) - { - g_object_unref (tmp_list->data); - tmp_list = tmp_list->next; - } - - g_slist_free (style->icon_factories); - } + + free_object_list (style->icon_factories); + free_object_list (priv->logical_color_hashes); pango_font_description_free (style->font_desc); @@ -1003,6 +1022,51 @@ return gtk_icon_factory_lookup_default (stock_id); } + /** + * gtk_style_lookup_logical_color: + * @style: a #GtkStyle + * @color_name: the name of the logical color to look up + * @color: the #GdkColor to fill in + * + * Looks up @color_name in the style's logical color mappings, + * filling in @color and returning %TRUE if found, otherwise + * returning %FALSE. Do not cache the found mapping, because + * it depends on the #GtkStyle and might change when a theme + * switch occurs. + * + * Return value: %TRUE if the mapping was found. + */ +gboolean +gtk_style_lookup_logical_color (GtkStyle *style, + const char *color_name, + GdkColor *color) +{ + GtkStylePrivate *priv = GTK_STYLE_GET_PRIVATE (style); + GSList *iter; + + g_return_val_if_fail (GTK_IS_STYLE (style), FALSE); + g_return_val_if_fail (color_name != NULL, FALSE); + g_return_val_if_fail (color != NULL, FALSE); + + iter = priv->logical_color_hashes; + while (iter != NULL) + { + GdkColor *mapping = g_hash_table_lookup (GTK_HASH_TABLE (iter->data)->hash, + color_name); + if (mapping) + { + color->red = mapping->red; + color->green = mapping->green; + color->blue = mapping->blue; + return TRUE; + } + + iter = g_slist_next (iter); + } + + return FALSE; +} + /** * gtk_draw_hline: * @style: a #GtkStyle @@ -1717,10 +1781,32 @@ clear_property_cache (style); } +static GSList * +copy_object_list (GSList *list) +{ + if (list) + { + GSList *iter; + + iter = list; + while (iter != NULL) + { + g_object_ref (iter->data); + iter = g_slist_next (iter); + } + + return g_slist_copy (list); + } + else + return NULL; +} + static void gtk_style_real_init_from_rc (GtkStyle *style, GtkRcStyle *rc_style) { + GtkStylePrivate *priv = GTK_STYLE_GET_PRIVATE (style); + GSList *logical_color_hashes; gint i; /* cache _should_ be still empty */ @@ -1746,19 +1832,10 @@ if (rc_style->ythickness >= 0) style->ythickness = rc_style->ythickness; - if (rc_style->icon_factories) - { - GSList *iter; + style->icon_factories = copy_object_list (rc_style->icon_factories); - style->icon_factories = g_slist_copy (rc_style->icon_factories); - - iter = style->icon_factories; - while (iter != NULL) - { - g_object_ref (iter->data); - iter = g_slist_next (iter); - } - } + logical_color_hashes = _gtk_rc_style_get_logical_color_hashes (rc_style); + priv->logical_color_hashes = copy_object_list (logical_color_hashes); } static gint @@ -2065,7 +2142,7 @@ const gchar *detail) { GdkPixbuf *pixbuf; - + g_return_val_if_fail (GTK_IS_STYLE (style), NULL); g_return_val_if_fail (GTK_STYLE_GET_CLASS (style)->render_icon != NULL, NULL); @@ -2156,7 +2233,7 @@ { return gdk_pixbuf_scale_simple (src, width, height, - GDK_INTERP_BILINEAR); + GDK_INTERP_NEAREST); } } @@ -2183,7 +2260,6 @@ */ base_pixbuf = gtk_icon_source_get_pixbuf (source); - g_return_val_if_fail (base_pixbuf != NULL, NULL); if (widget && gtk_widget_has_screen (widget)) @@ -2213,7 +2289,9 @@ /* If the size was wildcarded, and we're allowed to scale, then scale; otherwise, * leave it alone. */ - if (size != (GtkIconSize)-1 && gtk_icon_source_get_size_wildcarded (source)) + /* Hildon addition: Device icons are never scaled */ + if (size != (GtkIconSize)-1 && gtk_icon_source_get_size_wildcarded (source) + && size < HILDON_ICON_SIZE_26) scaled = scale_or_ref (base_pixbuf, width, height); else scaled = g_object_ref (base_pixbuf); @@ -2224,7 +2302,7 @@ if (state == GTK_STATE_INSENSITIVE) { stated = gdk_pixbuf_copy (scaled); - + gdk_pixbuf_saturate_and_pixelate (scaled, stated, 0.8, TRUE); @@ -2232,8 +2310,8 @@ } else if (state == GTK_STATE_PRELIGHT) { - stated = gdk_pixbuf_copy (scaled); - + stated = gdk_pixbuf_copy (scaled); + gdk_pixbuf_saturate_and_pixelate (scaled, stated, 1.2, FALSE);