aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--e-util/ChangeLog8
-rw-r--r--e-util/e-config-listener.c94
-rw-r--r--e-util/e-config-listener.h10
3 files changed, 110 insertions, 2 deletions
diff --git a/e-util/ChangeLog b/e-util/ChangeLog
index 3d6dd456f8..fcfbb86bcc 100644
--- a/e-util/ChangeLog
+++ b/e-util/ChangeLog
@@ -1,3 +1,11 @@
+2002-08-27 Rodrigo Moya <rodrigo@ximian.com>
+
+ * e-config-listener.c[ch] (e_config_listener_get_float_with_default,
+ e_config_listener_set_boolean, e_config_listener_set_float): new
+ functions.
+ (property_change_cb, add_key): added support for FLOAT values.
+ (e_config_listener_set_string): free strings before returning.
+
2002-08-26 Peter Williams <peterw@ximian.com>
* e-dialog-utils.c (set_transient_for_gdk): If gdk_window_foreign_new
diff --git a/e-util/e-config-listener.c b/e-util/e-config-listener.c
index 028f5ecc8e..1d4f38ce87 100644
--- a/e-util/e-config-listener.c
+++ b/e-util/e-config-listener.c
@@ -24,6 +24,7 @@ typedef struct {
GtkFundamentalType type;
union {
gboolean v_bool;
+ float v_float;
long v_long;
char *v_str;
} value;
@@ -191,6 +192,9 @@ property_change_cb (BonoboListener *listener,
if (bonobo_arg_type_is_equal (any->_type, BONOBO_ARG_BOOLEAN, NULL)) {
kd->type = GTK_TYPE_BOOL;
kd->value.v_bool = BONOBO_ARG_GET_BOOLEAN (any);
+ } else if (bonobo_arg_type_is_equal (any->_type, BONOBO_ARG_FLOAT, NULL)) {
+ kd->type = GTK_TYPE_FLOAT;
+ kd->value.v_float = BONOBO_ARG_GET_FLOAT (any);
} else if (bonobo_arg_type_is_equal (any->_type, BONOBO_ARG_LONG, NULL)) {
kd->type = GTK_TYPE_LONG;
kd->value.v_long = BONOBO_ARG_GET_LONG (any);
@@ -221,6 +225,9 @@ add_key (EConfigListener *cl, const char *key, GtkFundamentalType type,
case GTK_TYPE_BOOL :
memcpy (&kd->value.v_bool, value, sizeof (gboolean));
break;
+ case GTK_TYPE_FLOAT :
+ memcpy (&kd->value.v_float, value, sizeof (float));
+ break;
case GTK_TYPE_LONG :
memcpy (&kd->value.v_long, value, sizeof (long));
break;
@@ -297,6 +304,43 @@ e_config_listener_get_boolean_with_default (EConfigListener *cl,
return value;
}
+float
+e_config_listener_get_float_with_default (EConfigListener *cl,
+ const char *key,
+ float def,
+ gboolean *used_default)
+{
+ float value;
+ KeyData *kd;
+ gboolean d;
+ gpointer orig_key, orig_value;
+
+ g_return_val_if_fail (E_IS_CONFIG_LISTENER (cl), -1);
+ g_return_val_if_fail (key != NULL, -1);
+
+ /* search for the key in our hash table */
+ if (!g_hash_table_lookup_extended (cl->priv->keys, key, &orig_key, &orig_value)) {
+ /* not found, so retrieve it from the configuration database */
+ value = bonobo_config_get_float_with_default (cl->priv->db, key, def, &d);
+ kd = add_key (cl, key, GTK_TYPE_FLOAT, &value, d);
+
+ if (used_default != NULL)
+ *used_default = d;
+ } else {
+ kd = (KeyData *) orig_value;
+ g_assert (kd != NULL);
+
+ if (kd->type == GTK_TYPE_FLOAT) {
+ value = kd->value.v_float;
+ if (used_default != NULL)
+ *used_default = kd->used_default;
+ } else
+ return -1;
+ }
+
+ return value;
+}
+
long
e_config_listener_get_long_with_default (EConfigListener *cl,
const char *key,
@@ -375,6 +419,48 @@ e_config_listener_get_string_with_default (EConfigListener *cl,
}
void
+e_config_listener_set_boolean (EConfigListener *cl, const char *key, gboolean value)
+{
+ CORBA_Environment ev;
+
+ g_return_if_fail (E_IS_CONFIG_LISTENER (cl));
+ g_return_if_fail (key != NULL);
+
+ /* check that the value is not the same */
+ if (value == e_config_listener_get_boolean_with_default (cl, key, 0, NULL))
+ return;
+
+ CORBA_exception_init (&ev);
+
+ bonobo_config_set_boolean (cl->priv->db, key, value, &ev);
+ if (BONOBO_EX (&ev))
+ g_warning ("Cannot save config key %s -- %s", key, BONOBO_EX_ID (&ev));
+
+ CORBA_exception_free (&ev);
+}
+
+void
+e_config_listener_set_float (EConfigListener *cl, const char *key, float value)
+{
+ CORBA_Environment ev;
+
+ g_return_if_fail (E_IS_CONFIG_LISTENER (cl));
+ g_return_if_fail (key != NULL);
+
+ /* check that the value is not the same */
+ if (value == e_config_listener_get_float_with_default (cl, key, 0, NULL))
+ return;
+
+ CORBA_exception_init (&ev);
+
+ bonobo_config_set_float (cl->priv->db, key, value, &ev);
+ if (BONOBO_EX (&ev))
+ g_warning ("Cannot save config key %s -- %s", key, BONOBO_EX_ID (&ev));
+
+ CORBA_exception_free (&ev);
+}
+
+void
e_config_listener_set_long (EConfigListener *cl, const char *key, long value)
{
CORBA_Environment ev;
@@ -405,10 +491,14 @@ e_config_listener_set_string (EConfigListener *cl, const char *key, const char *
g_return_if_fail (key != NULL);
/* check that the value is not the same */
- s1 = value;
+ s1 = (char *) value;
s2 = e_config_listener_get_string_with_default (cl, key, NULL, NULL);
- if (!strcmp (s1 ? s1 : "", s2 ? s2 : ""))
+ if (!strcmp (s1 ? s1 : "", s2 ? s2 : "")) {
+ g_free (s2);
return;
+ }
+
+ g_free (s2);
CORBA_exception_init (&ev);
diff --git a/e-util/e-config-listener.h b/e-util/e-config-listener.h
index 9ac2f522e6..cc526e8735 100644
--- a/e-util/e-config-listener.h
+++ b/e-util/e-config-listener.h
@@ -43,6 +43,10 @@ gboolean e_config_listener_get_boolean_with_default (EConfigListene
const char *key,
gboolean def,
gboolean *used_default);
+float e_config_listener_get_float_with_default (EConfigListener *cl,
+ const char *key,
+ float def,
+ gboolean *used_default);
long e_config_listener_get_long_with_default (EConfigListener *cl,
const char *key,
long def,
@@ -51,6 +55,12 @@ char *e_config_listener_get_string_with_default (EConfigListener
const char *key,
const char *def,
gboolean *used_default);
+void e_config_listener_set_boolean (EConfigListener *cl,
+ const char *key,
+ gboolean value);
+void e_config_listener_set_float (EConfigListener *cl,
+ const char *key,
+ float value);
void e_config_listener_set_long (EConfigListener *cl,
const char *key,
long value);