251 lines
6.3 KiB
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);
|
|
|