generic-poky/openembedded/packages/gtk+/gtk+-2.6.4-1.osso7/gtkstyle.c.diff

251 lines
6.3 KiB
Diff

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