aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Gould <ted@gould.cx>2010-10-14 16:00:38 -0500
committerTed Gould <ted@gould.cx>2010-10-14 16:00:38 -0500
commit92942cc10074b24d7e0c13e76754ab149c27b923 (patch)
tree4d5f1d7b2296570e1839c5a20f3c63c027d0e917
parenta7ec487bdcf1383fc5ccbd69af543b1f6f93fd1a (diff)
downloadlibdbusmenu-92942cc10074b24d7e0c13e76754ab149c27b923.tar.gz
libdbusmenu-92942cc10074b24d7e0c13e76754ab149c27b923.tar.bz2
libdbusmenu-92942cc10074b24d7e0c13e76754ab149c27b923.zip
Adding a helper function to get the menuitem properties as a variant
-rw-r--r--libdbusmenu-glib/menuitem-private.h1
-rw-r--r--libdbusmenu-glib/menuitem.c44
2 files changed, 45 insertions, 0 deletions
diff --git a/libdbusmenu-glib/menuitem-private.h b/libdbusmenu-glib/menuitem-private.h
index 3a0c026..2028464 100644
--- a/libdbusmenu-glib/menuitem-private.h
+++ b/libdbusmenu-glib/menuitem-private.h
@@ -36,6 +36,7 @@ G_BEGIN_DECLS
void dbusmenu_menuitem_buildxml (DbusmenuMenuitem * mi, GPtrArray * array);
gboolean dbusmenu_menuitem_realized (DbusmenuMenuitem * mi);
void dbusmenu_menuitem_set_realized (DbusmenuMenuitem * mi);
+GVariant * dbusmenu_menuitem_properties_variant (DbusmenuMenuitem * mi);
G_END_DECLS
diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c
index 73b765b..5e700a5 100644
--- a/libdbusmenu-glib/menuitem.c
+++ b/libdbusmenu-glib/menuitem.c
@@ -1220,6 +1220,50 @@ dbusmenu_menuitem_properties_copy (DbusmenuMenuitem * mi)
return ret;
}
+/* Looks at each value in the hashtable and tries to convert it
+ into a variant and add it to our variant builder */
+static void
+variant_helper (gpointer in_key, gpointer in_value, gpointer user_data)
+{
+ GValue vval = {0};
+ g_value_init(&vval, G_TYPE_VARIANT);
+
+ if (!g_value_transform((GValue *)in_value, &vval)) {
+ g_warning("Unable to convert property '%s' of type '%s'", (gchar *)in_key, G_VALUE_TYPE_NAME(in_value));
+ return;
+ }
+
+ g_variant_builder_add((GVariantBuilder *)user_data, "{sv}", in_key, g_value_get_variant(&vval));
+ g_value_unset(&vval);
+
+ return;
+}
+
+/**
+ dbusmenu_menuitem_properties_variant:
+ @mi: #DbusmenuMenuitem to get properties from
+
+ Grabs the properties of the menuitem as a GVariant with the
+ type "a{sv}".
+
+ Return Value: A GVariant of type "a{sv}" or NULL on error.
+*/
+GVariant *
+dbusmenu_menuitem_properties_variant (DbusmenuMenuitem * mi)
+{
+ g_return_val_if_fail(DBUSMENU_IS_MENUITEM(mi), NULL);
+
+ DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi);
+
+ GVariantBuilder * builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+
+ g_hash_table_foreach(priv->properties, variant_helper, builder);
+
+ GVariant * final_variant = g_variant_builder_end(builder);
+ g_variant_builder_unref(builder);
+ return final_variant;
+}
+
/**
dbusmenu_menuitem_set_root:
@mi: #DbusmenuMenuitem to set whether it's root