aboutsummaryrefslogtreecommitdiff
path: root/libdbusmenu-glib/defaults.c
diff options
context:
space:
mode:
authorTed Gould <ted@gould.cx>2011-02-21 17:29:13 -0600
committerTed Gould <ted@gould.cx>2011-02-21 17:29:13 -0600
commitc89e30d70bcd342837af4633f393a26c7fb3bdc9 (patch)
tree7f65e087ecc5fb4a1278194e0dc151b38602cbb0 /libdbusmenu-glib/defaults.c
parent6c544a4f41d713878667418cd14411e5fc6c1f3f (diff)
downloadlibdbusmenu-c89e30d70bcd342837af4633f393a26c7fb3bdc9.tar.gz
libdbusmenu-c89e30d70bcd342837af4633f393a26c7fb3bdc9.tar.bz2
libdbusmenu-c89e30d70bcd342837af4633f393a26c7fb3bdc9.zip
Create a basic setter function and fix our hashtables so they work with it.
Diffstat (limited to 'libdbusmenu-glib/defaults.c')
-rw-r--r--libdbusmenu-glib/defaults.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/libdbusmenu-glib/defaults.c b/libdbusmenu-glib/defaults.c
index 53ef09d..9fde682 100644
--- a/libdbusmenu-glib/defaults.c
+++ b/libdbusmenu-glib/defaults.c
@@ -54,7 +54,7 @@ static void dbusmenu_defaults_init (DbusmenuDefaults *self);
static void dbusmenu_defaults_dispose (GObject *object);
static void dbusmenu_defaults_finalize (GObject *object);
-static DefaultEntry * entry_create (GVariantType * type, GVariant * variant);
+static DefaultEntry * entry_create (const GVariantType * type, GVariant * variant);
static void entry_destroy (gpointer entry);
G_DEFINE_TYPE (DbusmenuDefaults, dbusmenu_defaults, G_TYPE_OBJECT);
@@ -76,7 +76,7 @@ dbusmenu_defaults_init (DbusmenuDefaults *self)
{
self->priv = DBUSMENU_DEFAULTS_GET_PRIVATE(self);
- self->priv->types = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, entry_destroy);
+ self->priv->types = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_hash_table_destroy);
/* Standard defaults */
dbusmenu_defaults_default_set(self, DBUSMENU_CLIENT_TYPES_DEFAULT, DBUSMENU_MENUITEM_PROP_VISIBLE, G_VARIANT_TYPE_BOOLEAN, g_variant_new_boolean(TRUE));
@@ -118,7 +118,7 @@ dbusmenu_defaults_finalize (GObject *object)
/* Create a new entry based on the info provided */
static DefaultEntry *
-entry_create (GVariantType * type, GVariant * variant)
+entry_create (const GVariantType * type, GVariant * variant)
{
DefaultEntry * defentry = g_new0(DefaultEntry, 1);
@@ -189,6 +189,26 @@ dbusmenu_defaults_ref_default (void)
void
dbusmenu_defaults_default_set (DbusmenuDefaults * defaults, const gchar * type, const gchar * property, const GVariantType * prop_type, GVariant * value)
{
+ g_return_if_fail(DBUSMENU_IS_DEFAULTS(defaults));
+ g_return_if_fail(property != NULL);
+ g_return_if_fail(prop_type != NULL || value != NULL);
+
+ if (type == NULL) {
+ type = DBUSMENU_CLIENT_TYPES_DEFAULT;
+ }
+
+ GHashTable * prop_table = (GHashTable *)g_hash_table_lookup(defaults->priv->types, type);
+
+ /* We've never had a default for this type, so we need
+ to create a table for it. */
+ if (prop_table == NULL) {
+ prop_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, entry_destroy);
+
+ g_hash_table_insert(prop_table, g_strdup(property), entry_create(prop_type, value));
+ g_hash_table_insert(defaults->priv->types, g_strdup(type), prop_table);
+ } else {
+ g_hash_table_replace(prop_table, g_strdup(property), entry_create(prop_type, value));
+ }
return;
}