[gtk+/gtk-style-context: 150/191] GtkStyle: Optionally construct above a GtkStyleContext.
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/gtk-style-context: 150/191] GtkStyle: Optionally construct above a GtkStyleContext.
- Date: Tue, 17 Aug 2010 14:00:48 +0000 (UTC)
commit d8c85f229728ae8261740b17adf65c4c021f52ba
Author: Carlos Garnacho <carlosg gnome org>
Date: Mon Aug 2 16:05:58 2010 +0200
GtkStyle: Optionally construct above a GtkStyleContext.
gtk/gtkstyle.c | 158 +++++++++++++++++++++++++++++++++++++++++++++++++++-----
gtk/gtkstyle.h | 4 ++
2 files changed, 148 insertions(+), 14 deletions(-)
---
diff --git a/gtk/gtkstyle.c b/gtk/gtkstyle.c
index 18d904e..a19fc13 100644
--- a/gtk/gtkstyle.c
+++ b/gtk/gtkstyle.c
@@ -59,10 +59,22 @@ typedef struct _GtkStylePrivate GtkStylePrivate;
struct _GtkStylePrivate {
GSList *color_hashes;
+ GtkStyleContext *context;
+};
+
+enum {
+ PROP_0,
+ PROP_CONTEXT
};
/* --- prototypes --- */
static void gtk_style_finalize (GObject *object);
+static void gtk_style_constructed (GObject *object);
+static void gtk_style_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec);
+
static void gtk_style_realize (GtkStyle *style,
GdkColormap *colormap);
static void gtk_style_real_realize (GtkStyle *style);
@@ -492,6 +504,8 @@ gtk_style_class_init (GtkStyleClass *klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->finalize = gtk_style_finalize;
+ object_class->set_property = gtk_style_set_property;
+ object_class->constructed = gtk_style_constructed;
klass->clone = gtk_style_real_clone;
klass->copy = gtk_style_real_copy;
@@ -526,6 +540,14 @@ gtk_style_class_init (GtkStyleClass *klass)
g_type_class_add_private (object_class, sizeof (GtkStylePrivate));
+ g_object_class_install_property (object_class,
+ PROP_CONTEXT,
+ g_param_spec_object ("context",
+ P_("Style context"),
+ P_("GtkStyleContext to get style from"),
+ GTK_TYPE_STYLE_CONTEXT,
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE));
+
/**
* GtkStyle::realize:
* @style: the object which received the signal
@@ -634,9 +656,110 @@ gtk_style_finalize (GObject *object)
if (style->rc_style)
g_object_unref (style->rc_style);
+ if (priv->context)
+ g_object_unref (priv->context);
+
G_OBJECT_CLASS (gtk_style_parent_class)->finalize (object);
}
+static void
+gtk_style_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GtkStylePrivate *priv;
+
+ priv = GTK_STYLE_GET_PRIVATE (object);
+
+ switch (prop_id)
+ {
+ case PROP_CONTEXT:
+ priv->context = g_value_dup_object (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+set_color (GtkStyle *style,
+ GtkStyleContext *context,
+ GtkStateType state,
+ GtkRcFlags prop)
+{
+ GdkColor *color = NULL;
+
+ switch (prop)
+ {
+ case GTK_RC_BG:
+ gtk_style_context_get (context, state,
+ "background-color", &color,
+ NULL);
+ if (color)
+ style->bg[state] = *color;
+ break;
+ case GTK_RC_FG:
+ gtk_style_context_get (context, state,
+ "foreground-color", &color,
+ NULL);
+ if (color)
+ style->fg[state] = *color;
+ break;
+ case GTK_RC_TEXT:
+ gtk_style_context_get (context, state,
+ "text-color", &color,
+ NULL);
+ if (color)
+ style->text[state] = *color;
+ break;
+ case GTK_RC_BASE:
+ gtk_style_context_get (context, state,
+ "base-color", &color,
+ NULL);
+ if (color)
+ style->base[state] = *color;
+ break;
+ }
+
+ if (color)
+ gdk_color_free (color);
+}
+
+static void
+gtk_style_update_from_context (GtkStyle *style)
+{
+ GtkStylePrivate *priv;
+ GtkStateType state;
+
+ priv = GTK_STYLE_GET_PRIVATE (style);
+
+ for (state = GTK_STATE_NORMAL; state <= GTK_STATE_INSENSITIVE; state++)
+ {
+ set_color (style, priv->context, state, GTK_RC_BG);
+ set_color (style, priv->context, state, GTK_RC_FG);
+ set_color (style, priv->context, state, GTK_RC_BASE);
+ set_color (style, priv->context, state, GTK_RC_TEXT);
+ }
+
+ /* FIXME: thickness */
+}
+
+static void
+gtk_style_constructed (GObject *object)
+{
+ GtkStylePrivate *priv;
+
+ priv = GTK_STYLE_GET_PRIVATE (object);
+
+ if (priv->context)
+ {
+ gtk_style_update_from_context (GTK_STYLE (object));
+
+ /* FIXME: Listen to context changes */
+ }
+}
/**
* gtk_style_copy:
@@ -695,6 +818,16 @@ gtk_style_new (void)
return style;
}
+gboolean
+gtk_style_has_context (GtkStyle *style)
+{
+ GtkStylePrivate *priv;
+
+ priv = GTK_STYLE_GET_PRIVATE (style);
+
+ return priv->context != NULL;
+}
+
/**
* gtk_style_attach:
* @style: a #GtkStyle.
@@ -882,23 +1015,14 @@ GtkIconSet*
gtk_style_lookup_icon_set (GtkStyle *style,
const char *stock_id)
{
- GSList *iter;
+ GtkStylePrivate *priv;
g_return_val_if_fail (GTK_IS_STYLE (style), NULL);
g_return_val_if_fail (stock_id != NULL, NULL);
-
- iter = style->icon_factories;
- while (iter != NULL)
- {
- GtkIconSet *icon_set = gtk_icon_factory_lookup (GTK_ICON_FACTORY (iter->data),
- stock_id);
- if (icon_set)
- return icon_set;
-
- iter = g_slist_next (iter);
- }
- return gtk_icon_factory_lookup_default (stock_id);
+ priv = GTK_STYLE_GET_PRIVATE (style);
+
+ return gtk_style_context_lookup_icon_set (priv->context, stock_id);
}
/**
@@ -1641,7 +1765,13 @@ gtk_style_set_background (GtkStyle *style,
static GtkStyle *
gtk_style_real_clone (GtkStyle *style)
{
- return g_object_new (G_OBJECT_TYPE (style), NULL);
+ GtkStylePrivate *priv;
+
+ priv = GTK_STYLE_GET_PRIVATE (style);
+
+ return g_object_new (G_OBJECT_TYPE (style),
+ "context", priv->context,
+ NULL);
}
static void
diff --git a/gtk/gtkstyle.h b/gtk/gtkstyle.h
index 75dc109..a688bcd 100644
--- a/gtk/gtkstyle.h
+++ b/gtk/gtkstyle.h
@@ -940,6 +940,10 @@ GdkGC *_gtk_widget_get_cursor_gc (GtkWidget *widget);
void _gtk_widget_get_cursor_color (GtkWidget *widget,
GdkColor *color);
+gboolean gtk_style_has_context (GtkStyle *style);
+
+
+
G_END_DECLS
#endif /* __GTK_STYLE_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]