aboutsummaryrefslogtreecommitdiff
path: root/src/im-application-list.c
diff options
context:
space:
mode:
authorLars Uebernickel <lars.uebernickel@canonical.com>2012-11-30 18:35:53 +0100
committerLars Uebernickel <lars.uebernickel@canonical.com>2012-11-30 18:35:53 +0100
commit16aeadbeb7f0b108c2ba5e68a6ad0d96766380ba (patch)
tree497ac42c0625e631c3d76fb7b0cdb204c33d0b88 /src/im-application-list.c
parente6930c0df67ab53fcb2f7183741dee1bc0d599d4 (diff)
downloadayatana-indicator-messages-16aeadbeb7f0b108c2ba5e68a6ad0d96766380ba.tar.gz
ayatana-indicator-messages-16aeadbeb7f0b108c2ba5e68a6ad0d96766380ba.tar.bz2
ayatana-indicator-messages-16aeadbeb7f0b108c2ba5e68a6ad0d96766380ba.zip
Expose message actions on the bus (as GActions)
Diffstat (limited to 'src/im-application-list.c')
-rw-r--r--src/im-application-list.c81
1 files changed, 80 insertions, 1 deletions
diff --git a/src/im-application-list.c b/src/im-application-list.c
index c446d12..70d288c 100644
--- a/src/im-application-list.c
+++ b/src/im-application-list.c
@@ -59,6 +59,7 @@ typedef struct
GActionMuxer *actions;
GSimpleActionGroup *source_actions;
GSimpleActionGroup *message_actions;
+ GActionMuxer *message_sub_actions;
GCancellable *cancellable;
} Application;
@@ -87,6 +88,7 @@ application_free (gpointer data)
g_object_unref (app->actions);
g_object_unref (app->source_actions);
g_object_unref (app->message_actions);
+ g_object_unref (app->message_sub_actions);
}
g_slice_free (Application, app);
@@ -134,6 +136,7 @@ im_application_list_message_removed (Application *app,
const gchar *id)
{
g_simple_action_group_remove (app->message_actions, id);
+ g_action_muxer_remove (app->message_sub_actions, id);
g_signal_emit (app->list, signals[MESSAGE_REMOVED], 0, app->id, id);
}
@@ -169,6 +172,34 @@ im_application_list_message_activated (GSimpleAction *action,
}
static void
+im_application_list_sub_message_activated (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
+{
+ Application *app = user_data;
+ const gchar *message_id;
+ const gchar *action_id;
+ GVariantBuilder builder;
+
+ message_id = g_object_get_data (G_OBJECT (action), "message");
+ action_id = g_action_get_name (G_ACTION (action));
+
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("av"));
+ if (parameter)
+ g_variant_builder_add (&builder, "v", parameter);
+
+ indicator_messages_application_call_activate_message (app->proxy,
+ message_id,
+ action_id,
+ g_variant_builder_end (&builder),
+ app->cancellable,
+ NULL, NULL);
+
+ im_application_list_message_removed (app, message_id);
+}
+
+
+static void
im_application_list_remove_all (GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
@@ -395,9 +426,11 @@ im_application_list_add (ImApplicationList *list,
app->actions = g_action_muxer_new ();
app->source_actions = g_simple_action_group_new ();
app->message_actions = g_simple_action_group_new ();
+ app->message_sub_actions = g_action_muxer_new ();
g_action_muxer_insert (app->actions, "src", G_ACTION_GROUP (app->source_actions));
g_action_muxer_insert (app->actions, "msg", G_ACTION_GROUP (app->message_actions));
+ g_action_muxer_insert (app->actions, "msg-actions", G_ACTION_GROUP (app->message_sub_actions));
g_hash_table_insert (list->applications, (gpointer) app->id, app);
g_action_muxer_insert (list->muxer, app->id, G_ACTION_GROUP (app->actions));
@@ -527,9 +560,52 @@ im_application_list_message_added (Application *app,
action = g_simple_action_new (id, G_VARIANT_TYPE_BOOLEAN);
g_signal_connect (action, "activate", G_CALLBACK (im_application_list_message_activated), app);
-
g_simple_action_group_insert (app->message_actions, G_ACTION (action));
+ {
+ GVariantIter iter;
+ GVariant *entry;
+ GSimpleActionGroup *action_group;
+
+ action_group = g_simple_action_group_new ();
+
+ g_variant_iter_init (&iter, actions);
+ while ((entry = g_variant_iter_next_value (&iter)))
+ {
+ const gchar *name;
+ GSimpleAction *action;
+ GVariant *label;
+ const gchar *type = NULL;
+ GVariant *hint;
+
+ if (!g_variant_lookup (entry, "name", "&s", &name))
+ {
+ g_warning ("action dictionary for message '%s' is missing 'name' key", id);
+ continue;
+ }
+
+ label = g_variant_lookup_value (entry, "label", G_VARIANT_TYPE_STRING);
+ g_variant_lookup (entry, "parameter-type", "&g", &type);
+ hint = g_variant_lookup_value (entry, "parameter-hint", NULL);
+
+ action = g_simple_action_new (name, type ? G_VARIANT_TYPE (type) : NULL);
+ g_object_set_data_full (G_OBJECT (action), "message", g_strdup (id), g_free);
+ g_signal_connect (action, "activate", G_CALLBACK (im_application_list_sub_message_activated), app);
+ g_simple_action_group_insert (action_group, G_ACTION (action));
+
+ g_object_unref (action);
+ if (label)
+ g_variant_unref (label);
+ if (hint)
+ g_variant_unref (hint);
+ g_variant_unref (entry);
+ }
+
+ g_action_muxer_insert (app->message_sub_actions, id, G_ACTION_GROUP (action_group));
+
+ g_object_unref (action_group);
+ }
+
g_signal_emit (app->list, signals[MESSAGE_ADDED], 0,
app->id, app_iconstr, id, iconstr, title, subtitle, body, actions, time, draws_attention);
@@ -586,10 +662,13 @@ im_application_list_unset_remote (Application *app)
* the muxer */
g_object_unref (app->source_actions);
g_object_unref (app->message_actions);
+ g_object_unref (app->message_sub_actions);
app->source_actions = g_simple_action_group_new ();
app->message_actions = g_simple_action_group_new ();
+ app->message_sub_actions = g_action_muxer_new ();
g_action_muxer_insert (app->actions, "src", G_ACTION_GROUP (app->source_actions));
g_action_muxer_insert (app->actions, "msg", G_ACTION_GROUP (app->message_actions));
+ g_action_muxer_insert (app->actions, "msg-actions", G_ACTION_GROUP (app->message_sub_actions));
if (was_running)
g_signal_emit (app->list, signals[APP_STOPPED], 0, app->id);