- G_IMPLEMENT_INTERFACE (G_TYPE_ACTION_GROUP, g_dbus_action_group_iface_init))
-
-static gchar **
-g_dbus_action_group_list_actions (GActionGroup *g_group)
-{
- GDBusActionGroup *group = G_DBUS_ACTION_GROUP (g_group);
- GHashTableIter iter;
- gint n, i = 0;
- gchar **keys;
- gpointer key;
-
- n = g_hash_table_size (group->actions);
- keys = g_new (gchar *, n + 1);
-
- g_hash_table_iter_init (&iter, group->actions);
- while (g_hash_table_iter_next (&iter, &key, NULL))
- keys[i++] = g_strdup (key);
- g_assert_cmpint (i, ==, n);
- keys[n] = NULL;
-
- group->strict = TRUE;
-
- return keys;
-}
-
-static gboolean
-g_dbus_action_group_query_action (GActionGroup *g_group,
- const gchar *action_name,
- gboolean *enabled,
- const GVariantType **parameter_type,
- const GVariantType **state_type,
- GVariant **state_hint,
- GVariant **state)
-{
- GDBusActionGroup *group = G_DBUS_ACTION_GROUP (g_group);
- ActionInfo *info;
-
- info = g_hash_table_lookup (group->actions, action_name);
-
- if (info == NULL)
- {
- group->strict = TRUE;
- return FALSE;
- }
-
- if (enabled)
- *enabled = info->enabled;
-
- if (parameter_type)
- *parameter_type = info->parameter_type;
-
- if (state_type)
- *state_type = info->state ? g_variant_get_type (info->state) : NULL;
-
- if (state_hint)
- *state_hint = NULL;
-
- if (state)
- *state = info->state ? g_variant_ref (info->state) : NULL;
-
- return TRUE;
-}
-
-static void
-g_dbus_action_group_change_state (GActionGroup *g_group,
- const gchar *action_name,
- GVariant *value)
-{
- GDBusActionGroup *group = G_DBUS_ACTION_GROUP (g_group);
-
- /* Don't bother with the checks. The other side will do it again. */
- g_dbus_connection_call (group->connection, group->bus_name, group->object_path, "org.gtk.Actions", "SetState",
- g_variant_new ("(sva{sv})", action_name, value, NULL),
- NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL);
-}
-
-static void
-g_dbus_action_group_activate (GActionGroup *g_group,
- const gchar *action_name,
- GVariant *parameter)
-{
- GDBusActionGroup *group = G_DBUS_ACTION_GROUP (g_group);
- GVariantBuilder builder;
-
- g_variant_builder_init (&builder, G_VARIANT_TYPE ("av"));
-
- if (parameter)
- g_variant_builder_add (&builder, "v", parameter);
-
- g_dbus_connection_call (group->connection, group->bus_name, group->object_path, "org.gtk.Actions", "Activate",
- g_variant_new ("(sava{sv})", action_name, &builder, NULL),
- NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, NULL);
-}
-
-static void
-g_dbus_action_group_finalize (GObject *object)
-{
- GDBusActionGroup *group = G_DBUS_ACTION_GROUP (object);
-
- g_dbus_connection_signal_unsubscribe (group->connection, group->subscription_id);
- g_hash_table_unref (group->actions);
- g_object_unref (group->connection);
- g_free (group->object_path);
- g_free (group->bus_name);
-
- G_OBJECT_CLASS (g_dbus_action_group_parent_class)
- ->finalize (object);
-}
-
-static void
-g_dbus_action_group_init (GDBusActionGroup *group)
-{
- group->actions = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, action_info_free);
-}
-
-static void
-g_dbus_action_group_class_init (GDBusActionGroupClass *class)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (class);
-
- object_class->finalize = g_dbus_action_group_finalize;
-}
-
-static void
-g_dbus_action_group_iface_init (GActionGroupInterface *iface)
-{
- iface->list_actions = g_dbus_action_group_list_actions;
- iface->query_action = g_dbus_action_group_query_action;
- iface->change_action_state = g_dbus_action_group_change_state;
- iface->activate_action = g_dbus_action_group_activate;
-}