From 44d14782870339fb1702ba42d26f43755c064e0d Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Thu, 5 Sep 2013 18:17:58 +0200 Subject: Use serialized icons for messages and sources The D-Bus protocol is not part of the public API, so it's okay to change it. --- ...om.canonical.indicator.messages.application.xml | 10 ++--- libmessaging-menu/messaging-menu-app.c | 31 ++++++++------ libmessaging-menu/messaging-menu-message.c | 27 ++++++------ src/im-application-list.c | 50 ++++++++++++++++------ src/im-desktop-menu.c | 14 +++--- src/im-phone-menu.c | 6 +-- src/im-phone-menu.h | 2 +- 7 files changed, 82 insertions(+), 58 deletions(-) diff --git a/common/com.canonical.indicator.messages.application.xml b/common/com.canonical.indicator.messages.application.xml index 6f038e6..af2f1f6 100644 --- a/common/com.canonical.indicator.messages.application.xml +++ b/common/com.canonical.indicator.messages.application.xml @@ -2,10 +2,10 @@ - + - + @@ -21,16 +21,16 @@ - + - + - + diff --git a/libmessaging-menu/messaging-menu-app.c b/libmessaging-menu/messaging-menu-app.c index 421a09f..689a388 100644 --- a/libmessaging-menu/messaging-menu-app.c +++ b/libmessaging-menu/messaging-menu-app.c @@ -173,19 +173,24 @@ static GVariant * source_to_variant (Source *source) { GVariant *v; - gchar *iconstr; - - iconstr = source->icon ? g_icon_to_string (source->icon) : NULL; + GVariant *serialized_icon; + GVariantBuilder builder; - v = g_variant_new ("(sssuxsb)", source->id, - source->label, - iconstr ? iconstr : "", - source->count, - source->time, - source->string ? source->string : "", - source->draws_attention); + serialized_icon = source->icon ? g_icon_serialize (source->icon) : NULL; + g_variant_builder_init (&builder, G_VARIANT_TYPE ("av")); + if (serialized_icon) + { + g_variant_builder_add (&builder, "v", serialized_icon); + g_variant_unref (serialized_icon); + } - g_free (iconstr); + v = g_variant_new ("(ssavuxsb)", source->id, + source->label, + &builder, + source->count, + source->time, + source->string ? source->string : "", + source->draws_attention); return v; } @@ -459,7 +464,7 @@ messaging_menu_app_list_sources (IndicatorMessagesApplication *app_interface, GVariantBuilder builder; GList *it; - g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(sssuxsb)")); + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(ssavuxsb)")); for (it = app->sources; it; it = it->next) g_variant_builder_add_value (&builder, source_to_variant (it->data)); @@ -533,7 +538,7 @@ messaging_menu_app_list_messages (IndicatorMessagesApplication *app_interface, GHashTableIter iter; MessagingMenuMessage *message; - g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(sssssxaa{sv}b)")); + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(savsssxaa{sv}b)")); g_hash_table_iter_init (&iter, app->messages); while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &message)) diff --git a/libmessaging-menu/messaging-menu-message.c b/libmessaging-menu/messaging-menu-message.c index 5b9ebf5..165c545 100644 --- a/libmessaging-menu/messaging-menu-message.c +++ b/libmessaging-menu/messaging-menu-message.c @@ -495,10 +495,10 @@ action_to_variant (Action *action) * _messaging_menu_message_to_variant: * @msg: a #MessagingMenuMessage * - * Serializes @msg to a #GVariant of the form (sssssxaa{sv}b): + * Serializes @msg to a #GVariant of the form (savsssxaa{sv}b): * * id - * icon + * icon (fake-maybe) * title * subtitle * body @@ -513,25 +513,22 @@ _messaging_menu_message_to_variant (MessagingMenuMessage *msg) { GVariantBuilder builder; GSList *it; + GVariant *serialized_icon; + GVariantBuilder icon_builder; g_return_val_if_fail (MESSAGING_MENU_IS_MESSAGE (msg), NULL); - g_variant_builder_init (&builder, G_VARIANT_TYPE ("(sssssxaa{sv}b)")); - - g_variant_builder_add (&builder, "s", msg->id); - - if (msg->icon) + serialized_icon = msg->icon ? g_icon_serialize (msg->icon) : NULL; + g_variant_builder_init (&icon_builder, G_VARIANT_TYPE ("av")); + if (serialized_icon) { - gchar *iconstr; - - iconstr = g_icon_to_string (msg->icon); - g_variant_builder_add (&builder, "s", iconstr); - - g_free (iconstr); + g_variant_builder_add (&icon_builder, "v", serialized_icon); + g_variant_unref (serialized_icon); } - else - g_variant_builder_add (&builder, "s", ""); + g_variant_builder_init (&builder, G_VARIANT_TYPE ("(savsssxaa{sv}b)")); + g_variant_builder_add (&builder, "s", msg->id); + g_variant_builder_add (&builder, "av", &icon_builder); g_variant_builder_add (&builder, "s", msg->title ? msg->title : ""); g_variant_builder_add (&builder, "s", msg->subtitle ? msg->subtitle : ""); g_variant_builder_add (&builder, "s", msg->body ? msg->body : ""); diff --git a/src/im-application-list.c b/src/im-application-list.c index bbe4be3..96ef5fd 100644 --- a/src/im-application-list.c +++ b/src/im-application-list.c @@ -467,7 +467,7 @@ im_application_list_class_init (ImApplicationListClass *klass) G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING); + G_TYPE_VARIANT); signals[SOURCE_CHANGED] = g_signal_new ("source-changed", IM_TYPE_APPLICATION_LIST, @@ -505,7 +505,7 @@ im_application_list_class_init (ImApplicationListClass *klass) G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING, + G_TYPE_VARIANT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, @@ -768,16 +768,20 @@ im_application_list_source_added (Application *app, { const gchar *id; const gchar *label; - const gchar *iconstr; + GVariant *maybe_serialized_icon; guint32 count; gint64 time; const gchar *string; gboolean draws_attention; + GVariant *serialized_icon = NULL; GVariant *state; GSimpleAction *action; - g_variant_get (source, "(&s&s&sux&sb)", - &id, &label, &iconstr, &count, &time, &string, &draws_attention); + g_variant_get (source, "(&s&s@avux&sb)", + &id, &label, &maybe_serialized_icon, &count, &time, &string, &draws_attention); + + if (g_variant_n_children (maybe_serialized_icon) == 1) + g_variant_get_child (maybe_serialized_icon, 0, "v", &serialized_icon); state = g_variant_new ("(uxsb)", count, time, string, draws_attention); action = g_simple_action_new_stateful (id, G_VARIANT_TYPE_BOOLEAN, state); @@ -785,7 +789,7 @@ im_application_list_source_added (Application *app, g_action_map_add_action (G_ACTION_MAP(app->source_actions), G_ACTION (action)); - g_signal_emit (app->list, signals[SOURCE_ADDED], 0, app->id, id, label, iconstr); + g_signal_emit (app->list, signals[SOURCE_ADDED], 0, app->id, id, label, serialized_icon); if (draws_attention) app->draws_attention = TRUE; @@ -793,6 +797,9 @@ im_application_list_source_added (Application *app, im_application_list_update_draws_attention (app->list); g_object_unref (action); + if (serialized_icon) + g_variant_unref (serialized_icon); + g_variant_unref (maybe_serialized_icon); } static void @@ -801,25 +808,33 @@ im_application_list_source_changed (Application *app, { const gchar *id; const gchar *label; - const gchar *iconstr; + GVariant *maybe_serialized_icon; guint32 count; gint64 time; const gchar *string; gboolean draws_attention; + GVariant *serialized_icon = NULL; gboolean visible; - g_variant_get (source, "(&s&s&sux&sb)", - &id, &label, &iconstr, &count, &time, &string, &draws_attention); + g_variant_get (source, "(&s&s@avux&sb)", + &id, &label, &maybe_serialized_icon, &count, &time, &string, &draws_attention); + + if (g_variant_n_children (maybe_serialized_icon) == 1) + g_variant_get_child (maybe_serialized_icon, 0, "v", &serialized_icon); g_action_group_change_action_state (G_ACTION_GROUP (app->source_actions), id, g_variant_new ("(uxsb)", count, time, string, draws_attention)); visible = count > 0; - g_signal_emit (app->list, signals[SOURCE_CHANGED], 0, app->id, id, label, iconstr, visible); + g_signal_emit (app->list, signals[SOURCE_CHANGED], 0, app->id, id, label, serialized_icon, visible); app->draws_attention = visible && draws_attention; im_application_list_update_draws_attention (app->list); + + if (serialized_icon) + g_variant_unref (serialized_icon); + g_variant_unref (maybe_serialized_icon); } static void @@ -885,20 +900,24 @@ im_application_list_message_added (Application *app, GVariant *message) { const gchar *id; - const gchar *iconstr; + GVariant *maybe_serialized_icon; const gchar *title; const gchar *subtitle; const gchar *body; gint64 time; GVariantIter *action_iter; gboolean draws_attention; + GVariant *serialized_icon = NULL; GSimpleAction *action; GIcon *app_icon; gchar *app_iconstr = NULL; GVariant *actions = NULL; - g_variant_get (message, "(&s&s&s&s&sxaa{sv}b)", - &id, &iconstr, &title, &subtitle, &body, &time, &action_iter, &draws_attention); + g_variant_get (message, "(&s@av&s&s&sxaa{sv}b)", + &id, &maybe_serialized_icon, &title, &subtitle, &body, &time, &action_iter, &draws_attention); + + if (g_variant_n_children (maybe_serialized_icon) == 1) + serialized_icon = g_variant_get_child_value (maybe_serialized_icon, 0); app_icon = g_app_info_get_icon (G_APP_INFO (app->info)); if (app_icon) @@ -981,12 +1000,15 @@ im_application_list_message_added (Application *app, im_application_list_update_draws_attention (app->list); g_signal_emit (app->list, signals[MESSAGE_ADDED], 0, - app->id, app_iconstr, id, iconstr, title, + app->id, app_iconstr, id, serialized_icon, title, subtitle, body, actions, time, draws_attention); g_variant_iter_free (action_iter); g_free (app_iconstr); g_object_unref (action); + if (serialized_icon) + g_object_unref (serialized_icon); + g_variant_unref (maybe_serialized_icon); } static void diff --git a/src/im-desktop-menu.c b/src/im-desktop-menu.c index 5707390..923ad91 100644 --- a/src/im-desktop-menu.c +++ b/src/im-desktop-menu.c @@ -109,7 +109,7 @@ static void im_desktop_menu_source_section_insert_source (GMenu *source_section, const gchar *source_id, const gchar *label, - const gchar *icon, + GVariant *serialized_icon, gint pos) { GMenuItem *item; @@ -119,8 +119,8 @@ im_desktop_menu_source_section_insert_source (GMenu *source_section, item = g_menu_item_new (label, NULL); g_menu_item_set_action_and_target_value (item, action, NULL); g_menu_item_set_attribute (item, "x-canonical-type", "s", "com.canonical.indicator.messages.source"); - if (icon && *icon) - g_menu_item_set_attribute (item, "icon", "s", icon); + if (serialized_icon) + g_menu_item_set_attribute_value (item, "icon", serialized_icon); if (pos >= 0) g_menu_insert_item (source_section, pos, item); @@ -169,7 +169,7 @@ im_desktop_menu_source_added (ImApplicationList *applist, const gchar *app_id, const gchar *source_id, const gchar *label, - const gchar *icon, + GVariant *serialized_icon, gpointer user_data) { ImDesktopMenu *menu = user_data; @@ -178,7 +178,7 @@ im_desktop_menu_source_added (ImApplicationList *applist, source_section = g_hash_table_lookup (menu->source_sections, app_id); g_return_if_fail (source_section != NULL); - im_desktop_menu_source_section_insert_source (source_section, source_id, label, icon, -1); + im_desktop_menu_source_section_insert_source (source_section, source_id, label, serialized_icon, -1); } static void @@ -204,7 +204,7 @@ im_desktop_menu_source_changed (ImApplicationList *applist, const gchar *app_id, const gchar *source_id, const gchar *label, - const gchar *icon, + GVariant *serialized_icon, gboolean visible, gpointer user_data) { @@ -221,7 +221,7 @@ im_desktop_menu_source_changed (ImApplicationList *applist, g_menu_remove (section, pos); if (visible) - im_desktop_menu_source_section_insert_source (section, source_id, label, icon, pos); + im_desktop_menu_source_section_insert_source (section, source_id, label, serialized_icon, pos); } static void diff --git a/src/im-phone-menu.c b/src/im-phone-menu.c index a9c5977..54e32be 100644 --- a/src/im-phone-menu.c +++ b/src/im-phone-menu.c @@ -153,7 +153,7 @@ im_phone_menu_add_message (ImPhoneMenu *menu, const gchar *app_id, const gchar *app_icon, const gchar *id, - const gchar *iconstr, + GVariant *serialized_icon, const gchar *title, const gchar *subtitle, const gchar *body, @@ -179,8 +179,8 @@ im_phone_menu_add_message (ImPhoneMenu *menu, g_menu_item_set_attribute (item, "x-canonical-text", "s", body); g_menu_item_set_attribute (item, "x-canonical-time", "x", time); - if (iconstr) - g_menu_item_set_attribute (item, "icon", "s", iconstr); + if (serialized_icon) + g_menu_item_set_attribute_value (item, "icon", serialized_icon); if (app_icon) g_menu_item_set_attribute (item, "x-canonical-app-icon", "s", app_icon); diff --git a/src/im-phone-menu.h b/src/im-phone-menu.h index 9742f61..728ecaa 100644 --- a/src/im-phone-menu.h +++ b/src/im-phone-menu.h @@ -39,7 +39,7 @@ void im_phone_menu_add_message (ImPhoneMenu *men const gchar *app_id, const gchar *app_icon, const gchar *id, - const gchar *iconstr, + GVariant *serialized_icon, const gchar *title, const gchar *subtitle, const gchar *body, -- cgit v1.2.3