summaryrefslogtreecommitdiff
path: root/gtk/gtksettings.c
diff options
context:
space:
mode:
authorTim Janik <timj@gtk.org>2001-04-03 13:18:00 +0000
committerTim Janik <timj@src.gnome.org>2001-04-03 13:18:00 +0000
commit748560e1fcccc046183f82818960ca53f0b69295 (patch)
tree0ca1f02f7507559371d48bcea85cb1e9647ef5be /gtk/gtksettings.c
parent655abd087209e246966e68330f1b2f6861be8154 (diff)
downloadgtk+-748560e1fcccc046183f82818960ca53f0b69295.tar.gz
changed gtk_item_factory_dump_items() and gtk_item_factory_dump_rc()
Tue Apr 3 13:52:57 2001 Tim Janik <timj@gtk.org> * gtk/gtkitemfactory.[hc]: changed gtk_item_factory_dump_items() and gtk_item_factory_dump_rc() GtkPatternSpec argument to GPatternSpec. this is actually unlikely to cause breakage in third-party apps since except for gle, pretty much ever caller passes NULL here. * gtk/gtkbindings.[hc]: removed gtk_pattern_*() API. * *.c: use g_pattern_*() API. * docs/Changes-2.0.txt: GtkPatternSpec->GPatternSpec updates. * gtk/gtkstyle.c (gtk_default_draw_resize_grip): assert unhandled directions aren't passed in. * gtk/gtksettings.[hc] (_gtk_settings_parse_convert): export conversion functionality to be usable from gtkstyle.c as well, give precedence for conversion to user-supplied parsers. s/_gtk_rc_property_parser_for_type/_gtk_rc_property_parser_from_type/; * gtk/gtkstyle.c (_gtk_style_peek_property_value): use _gtk_settings_parse_convert() for rcporperty value conversion.
Diffstat (limited to 'gtk/gtksettings.c')
-rw-r--r--gtk/gtksettings.c120
1 files changed, 75 insertions, 45 deletions
diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c
index 0b4cbac2e7..e0b82820e1 100644
--- a/gtk/gtksettings.c
+++ b/gtk/gtksettings.c
@@ -259,59 +259,89 @@ gtk_settings_notify (GObject *object,
#endif
}
-static void
-apply_queued_setting (GtkSettings *data,
- GParamSpec *pspec,
- GtkSettingsValue *qvalue)
+gboolean
+_gtk_settings_parse_convert (GtkRcPropertyParser parser,
+ const GValue *src_value,
+ GParamSpec *pspec,
+ GValue *dest_value)
{
- gboolean warn_convert = TRUE;
+ gboolean success = FALSE;
- if (g_value_type_transformable (G_VALUE_TYPE (&qvalue->value), G_PARAM_SPEC_VALUE_TYPE (pspec)))
- {
- GValue tmp_value = { 0, };
+ g_return_val_if_fail (G_VALUE_HOLDS (dest_value, G_PARAM_SPEC_VALUE_TYPE (pspec)), FALSE);
- warn_convert = FALSE;
- g_value_init (&tmp_value, G_PARAM_SPEC_VALUE_TYPE (pspec));
- if (g_param_value_convert (pspec, &qvalue->value, &tmp_value, TRUE))
- g_object_set_property (G_OBJECT (data), pspec->name, &tmp_value);
+ if (parser)
+ {
+ GString *gstring;
+ gboolean free_gstring = TRUE;
+
+ if (G_VALUE_HOLDS (src_value, G_TYPE_GSTRING))
+ {
+ gstring = g_value_get_boxed (src_value);
+ free_gstring = FALSE;
+ }
+ else if (G_VALUE_HOLDS_LONG (src_value))
+ {
+ gstring = g_string_new ("");
+ g_string_printfa (gstring, "%ld", g_value_get_long (src_value));
+ }
+ else if (G_VALUE_HOLDS_DOUBLE (src_value))
+ {
+ gstring = g_string_new ("");
+ g_string_printfa (gstring, "%f", g_value_get_double (src_value));
+ }
+ else if (G_VALUE_HOLDS_STRING (src_value))
+ {
+ gchar *tstr = g_strescape (g_value_get_string (src_value), NULL);
+
+ gstring = g_string_new ("\"");
+ g_string_append (gstring, tstr);
+ g_string_append_c (gstring, '\"');
+ g_free (tstr);
+ }
else
{
- gchar *debug = g_strdup_value_contents (&tmp_value);
-
- g_message ("%s: rc-value `%s' for rc-property \"%s\" of type `%s' has invalid contents \"%s\"",
- qvalue->origin,
- G_VALUE_TYPE_NAME (&qvalue->value),
- pspec->name,
- g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)),
- debug);
- g_free (debug);
+ g_return_val_if_fail (G_VALUE_HOLDS (src_value, G_TYPE_GSTRING), FALSE);
+ gstring = NULL; /* silence compiler */
}
- g_value_unset (&tmp_value);
+
+ success = (parser (pspec, gstring, dest_value) &&
+ !g_param_value_validate (pspec, dest_value));
+
+ if (free_gstring)
+ g_string_free (gstring, TRUE);
}
+ else if (!G_VALUE_HOLDS (src_value, G_TYPE_GSTRING) &&
+ g_value_type_transformable (G_VALUE_TYPE (src_value), G_VALUE_TYPE (dest_value)))
+ success = g_param_value_convert (pspec, src_value, dest_value, TRUE);
+
+ return success;
+}
+
+static void
+apply_queued_setting (GtkSettings *data,
+ GParamSpec *pspec,
+ GtkSettingsValue *qvalue)
+{
+ GValue tmp_value = { 0, };
+ GtkRcPropertyParser parser = g_param_spec_get_qdata (pspec, quark_property_parser);
+
+ g_value_init (&tmp_value, G_PARAM_SPEC_VALUE_TYPE (pspec));
+ if (_gtk_settings_parse_convert (parser, &qvalue->value,
+ pspec, &tmp_value))
+ g_object_set_property (G_OBJECT (data), pspec->name, &tmp_value);
else
{
- GtkRcPropertyParser parser = g_param_spec_get_qdata (pspec, quark_property_parser);
-
- if (parser)
- {
- GValue tmp_value = { 0, };
-
- g_value_init (&tmp_value, G_PARAM_SPEC_VALUE_TYPE (pspec));
- if (parser (pspec, g_value_get_boxed (&qvalue->value), &tmp_value))
- {
- warn_convert = FALSE;
- g_object_set_property (G_OBJECT (data), pspec->name, &tmp_value);
- }
- g_value_unset (&tmp_value);
- }
+ gchar *debug = g_strdup_value_contents (&tmp_value);
+
+ g_message ("%s: failed to retrive property `%s' of type `%s' from rc file value \"%s\" of type `%s'",
+ qvalue->origin,
+ pspec->name,
+ g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)),
+ debug,
+ G_VALUE_TYPE_NAME (&tmp_value));
+ g_free (debug);
}
-
- if (warn_convert)
- g_message ("%s: unable to convert rc-value of type `%s' to rc-property \"%s\" of type `%s'",
- qvalue->origin,
- G_VALUE_TYPE_NAME (&qvalue->value),
- pspec->name,
- g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)));
+ g_value_unset (&tmp_value);
}
static guint
@@ -379,7 +409,7 @@ settings_install_property_parser (GtkSettingsClass *class,
}
GtkRcPropertyParser
-_gtk_rc_property_parser_for_type (GType type)
+_gtk_rc_property_parser_from_type (GType type)
{
if (type == GDK_TYPE_COLOR)
return gtk_rc_property_parse_color;
@@ -404,7 +434,7 @@ gtk_settings_install_property (GtkSettings *settings,
g_return_if_fail (GTK_IS_SETTINGS (settings));
g_return_if_fail (G_IS_PARAM_SPEC (pspec));
- parser = _gtk_rc_property_parser_for_type (G_PARAM_SPEC_VALUE_TYPE (pspec));
+ parser = _gtk_rc_property_parser_from_type (G_PARAM_SPEC_VALUE_TYPE (pspec));
settings_install_property_parser (GTK_SETTINGS_GET_CLASS (settings), pspec, parser);
}