diff options
author | Ryan Lortie <desrt@desrt.ca> | 2011-05-18 17:53:07 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2011-05-20 23:50:55 -0400 |
commit | 89908908d50c5a5d3c7d73fc9a63a19d9a681cf3 (patch) | |
tree | bfea762d71886b99e554e579ff5fbe130972c3b1 | |
parent | bb488d4c4ff5d18f5f0f45ca8aae1863b3ca8b1a (diff) |
GApplication: fix remote action states
Fix up remote_action_info_new_from_iter() to do its job better and use
it from all places that it's appropriate.
Closes #650236.
-rw-r--r-- | gio/gapplicationimpl-dbus.c | 55 |
1 files changed, 31 insertions, 24 deletions
diff --git a/gio/gapplicationimpl-dbus.c b/gio/gapplicationimpl-dbus.c index 406b8390d..6290bd4ae 100644 --- a/gio/gapplicationimpl-dbus.c +++ b/gio/gapplicationimpl-dbus.c @@ -417,27 +417,50 @@ g_application_impl_destroy (GApplicationImpl *impl) g_slice_free (GApplicationImpl, impl); } +static void +unwrap_fake_maybe (GVariant **value) +{ + GVariant *tmp; + + if (g_variant_n_children (*value)) + g_variant_get_child (*value, 0, "v", &tmp); + else + tmp = NULL; + + g_variant_unref (*value); + *value = tmp; +} + RemoteActionInfo * remote_action_info_new_from_iter (GVariantIter *iter) { RemoteActionInfo *info; - const gchar *name; GVariant *param_type; gboolean enabled; GVariant *state; + gchar *name; if (!g_variant_iter_next (iter, "(s@avb@av)", &name, ¶m_type, &enabled, &state)) return NULL; + unwrap_fake_maybe (¶m_type); + unwrap_fake_maybe (&state); + info = g_slice_new (RemoteActionInfo); - info->parameter_type = g_variant_type_copy ( - g_variant_type_element ( - g_variant_get_type (param_type))); + info->name = name; info->enabled = enabled; info->state = state; - g_variant_unref (param_type); + if (param_type != NULL) + { + info->parameter_type = g_variant_type_copy ( + g_variant_type_element ( + g_variant_get_type (param_type))); + g_variant_unref (param_type); + } + else + info->parameter_type = NULL; return info; } @@ -705,32 +728,16 @@ g_application_impl_register (GApplication *application, /* Create and populate the hashtable */ { + RemoteActionInfo *info; GVariant *descriptions; GVariantIter iter; - GVariant *param_type; - gboolean enabled; - GVariant *state; - gchar *name; *remote_actions = g_hash_table_new (g_str_hash, g_str_equal); descriptions = g_variant_get_child_value (reply, 0); g_variant_iter_init (&iter, descriptions); - while (g_variant_iter_next (&iter, "(s@avb@av)", &name, - ¶m_type, &enabled, &state)) - { - RemoteActionInfo *action; - - action = g_slice_new (RemoteActionInfo); - action->parameter_type = g_variant_type_copy ( - g_variant_type_element ( - g_variant_get_type (param_type))); - action->enabled = enabled; - action->state = state; - - g_hash_table_insert (*remote_actions, name, action); - g_variant_unref (param_type); - } + while ((info = remote_action_info_new_from_iter (&iter))) + g_hash_table_insert (*remote_actions, info->name, info); g_variant_unref (descriptions); } |