From a7ca54762c465cd5d26f9eafe11beb3e205a97ab Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Thu, 22 Nov 2012 11:58:58 +0100 Subject: ImApplicationList: use specified state for source actions (uxsb) --- src/im-application-list.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/im-application-list.c b/src/im-application-list.c index 732a117..acd6e2b 100644 --- a/src/im-application-list.c +++ b/src/im-application-list.c @@ -261,12 +261,14 @@ im_application_list_source_added (Application *app, gint64 time; const gchar *string; gboolean draws_attention; + GVariant *state; GSimpleAction *action; g_variant_get (source, "(&s&s&sux&sb)", &id, &label, &iconstr, &count, &time, &string, &draws_attention); - action = g_simple_action_new_stateful (id, NULL, g_variant_new_uint32 (count)); + state = g_variant_new ("(uxsb)", count, time, string, draws_attention); + action = g_simple_action_new_stateful (id, NULL, state); g_simple_action_group_insert (app->actions, G_ACTION (action)); g_signal_emit (app->list, signals[SOURCE_ADDED], 0, app->info, id, label, iconstr); @@ -290,7 +292,7 @@ im_application_list_source_changed (Application *app, &id, &label, &iconstr, &count, &time, &string, &draws_attention); g_action_group_change_action_state (G_ACTION_GROUP (app->actions), id, - g_variant_new_uint32 (count)); + g_variant_new ("(uxsb)", count, time, string, draws_attention)); g_signal_emit (app->list, signals[SOURCE_CHANGED], 0, app->info, id, label, iconstr); } -- cgit v1.2.3 From e5985f89f62fdac65d4f80037835691630cc3d2c Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Thu, 22 Nov 2012 12:03:01 +0100 Subject: ImPhoneMenu: expose application icon on message items --- src/im-phone-menu.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src') diff --git a/src/im-phone-menu.c b/src/im-phone-menu.c index 0ba41c4..9fd52df 100644 --- a/src/im-phone-menu.c +++ b/src/im-phone-menu.c @@ -124,6 +124,7 @@ im_phone_menu_add_message (ImPhoneMenu *menu, const gchar *app_id; GMenuItem *item; gchar *action_name; + GIcon *app_icon; g_return_if_fail (IM_IS_PHONE_MENU (menu)); g_return_if_fail (G_IS_DESKTOP_APP_INFO (app)); @@ -143,6 +144,17 @@ im_phone_menu_add_message (ImPhoneMenu *menu, if (iconstr) g_menu_item_set_attribute (item, "x-canonical-icon", "s", iconstr); + app_icon = g_app_info_get_icon (G_APP_INFO (app)); + if (app_icon) + { + gchar *app_iconstr; + + app_iconstr = g_icon_to_string (app_icon); + g_menu_item_set_attribute (item, "x-canonical-app-icon", "s", app_iconstr); + + g_free (app_iconstr); + } + g_menu_append_item (menu->message_section, item); g_free (action_name); -- cgit v1.2.3 From 979a9b32a625adb29af3b5bd6bfe324268a51b2c Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Mon, 26 Nov 2012 11:34:50 +0100 Subject: Canonicalize application ids Remove trailing '.desktop' and replace all dots by underscores to make GActionMuxer work (which uses the dot as a separator). In order to contain the canonicalization to ImApplicationList, its signals now contain string parameters to id and icon name instead of GDesktopAppInfo pointers. --- src/im-application-list.c | 87 ++++++++++++++++++++++++++++++++++------------- src/im-phone-menu.c | 48 ++++++++++---------------- src/im-phone-menu.h | 14 ++++---- 3 files changed, 88 insertions(+), 61 deletions(-) (limited to 'src') diff --git a/src/im-application-list.c b/src/im-application-list.c index acd6e2b..24df19e 100644 --- a/src/im-application-list.c +++ b/src/im-application-list.c @@ -23,6 +23,7 @@ #include "gactionmuxer.h" #include +#include typedef GObjectClass ImApplicationListClass; @@ -53,6 +54,7 @@ typedef struct { ImApplicationList *list; GDesktopAppInfo *info; + gchar *id; IndicatorMessagesApplication *proxy; GSimpleActionGroup *actions; GCancellable *cancellable; @@ -66,7 +68,8 @@ application_free (gpointer data) if (!app) return; - g_clear_object (&app->info); + g_object_unref (app->info); + g_free (app->id); if (app->cancellable) { @@ -116,7 +119,7 @@ im_application_list_class_init (ImApplicationListClass *klass) g_cclosure_marshal_generic, G_TYPE_NONE, 4, - G_TYPE_DESKTOP_APP_INFO, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); @@ -129,7 +132,7 @@ im_application_list_class_init (ImApplicationListClass *klass) g_cclosure_marshal_generic, G_TYPE_NONE, 4, - G_TYPE_DESKTOP_APP_INFO, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); @@ -142,7 +145,7 @@ im_application_list_class_init (ImApplicationListClass *klass) g_cclosure_marshal_generic, G_TYPE_NONE, 2, - G_TYPE_DESKTOP_APP_INFO, + G_TYPE_STRING, G_TYPE_STRING); signals[MESSAGE_ADDED] = g_signal_new ("message-added", @@ -153,7 +156,7 @@ im_application_list_class_init (ImApplicationListClass *klass) g_cclosure_marshal_generic, G_TYPE_NONE, 8, - G_TYPE_DESKTOP_APP_INFO, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, @@ -170,7 +173,7 @@ im_application_list_class_init (ImApplicationListClass *klass) g_cclosure_marshal_generic, G_TYPE_NONE, 2, - G_TYPE_DESKTOP_APP_INFO, + G_TYPE_STRING, G_TYPE_STRING); signals[APP_STOPPED] = g_signal_new ("app-stopped", @@ -181,7 +184,7 @@ im_application_list_class_init (ImApplicationListClass *klass) g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, - G_TYPE_DESKTOP_APP_INFO); + G_TYPE_STRING); } static void @@ -197,6 +200,37 @@ im_application_list_new (void) return g_object_new (IM_TYPE_APPLICATION_LIST, NULL); } +static gchar * +im_application_list_canonical_id (const gchar *id) +{ + gchar *str; + gchar *p; + + str = g_strndup (id, strlen (id) - g_str_has_suffix (id, ".desktop") ? 7 : 0); + + for (p = str; *p; p++) + { + if (*p == '.') + *p = '_'; + } + + return str; +} + +static Application * +im_application_list_lookup (ImApplicationList *list, + const gchar *desktop_id) +{ + gchar *id; + Application *app; + + id = im_application_list_canonical_id (desktop_id); + app = g_hash_table_lookup (list->applications, id); + + g_free (id); + return app; +} + void im_application_list_add (ImApplicationList *list, const gchar *desktop_id) @@ -208,8 +242,7 @@ im_application_list_add (ImApplicationList *list, g_return_if_fail (IM_IS_APPLICATION_LIST (list)); g_return_if_fail (desktop_id != NULL); - app = g_hash_table_lookup (list->applications, desktop_id); - if (app) + if (im_application_list_lookup (list, desktop_id)) return; info = g_desktop_app_info_new (desktop_id); @@ -220,14 +253,16 @@ im_application_list_add (ImApplicationList *list, } id = g_app_info_get_id (G_APP_INFO (info)); + g_return_if_fail (id != NULL); app = g_slice_new0 (Application); - app->list = list; app->info = info; + app->id = im_application_list_canonical_id (id); + app->list = list; app->actions = g_simple_action_group_new (); - g_hash_table_insert (list->applications, (gpointer) id, app); - g_action_muxer_insert (list->muxer, id, G_ACTION_GROUP (app->actions)); + g_hash_table_insert (list->applications, (gpointer) app->id, app); + g_action_muxer_insert (list->muxer, app->id, G_ACTION_GROUP (app->actions)); } void @@ -238,11 +273,11 @@ im_application_list_remove (ImApplicationList *list, g_return_if_fail (IM_IS_APPLICATION_LIST (list)); - app = g_hash_table_lookup (list->applications, id); + app = im_application_list_lookup (list, id); if (app) { if (app->proxy || app->cancellable) - g_signal_emit (app->list, signals[APP_STOPPED], 0, app->info); + g_signal_emit (app->list, signals[APP_STOPPED], 0, app->id); g_hash_table_remove (list->applications, id); g_action_muxer_remove (list->muxer, id); @@ -271,7 +306,7 @@ im_application_list_source_added (Application *app, action = g_simple_action_new_stateful (id, NULL, state); g_simple_action_group_insert (app->actions, G_ACTION (action)); - g_signal_emit (app->list, signals[SOURCE_ADDED], 0, app->info, id, label, iconstr); + g_signal_emit (app->list, signals[SOURCE_ADDED], 0, app->id, id, label, iconstr); g_object_unref (action); } @@ -294,7 +329,7 @@ im_application_list_source_changed (Application *app, g_action_group_change_action_state (G_ACTION_GROUP (app->actions), id, g_variant_new ("(uxsb)", count, time, string, draws_attention)); - g_signal_emit (app->list, signals[SOURCE_CHANGED], 0, app->info, id, label, iconstr); + g_signal_emit (app->list, signals[SOURCE_CHANGED], 0, app->id, id, label, iconstr); } static void @@ -303,7 +338,7 @@ im_application_list_source_removed (Application *app, { g_simple_action_group_remove (app->actions, id); - g_signal_emit (app->list, signals[SOURCE_REMOVED], 0, app->info, id); + g_signal_emit (app->list, signals[SOURCE_REMOVED], 0, app->id, id); } static void @@ -349,16 +384,22 @@ im_application_list_message_added (Application *app, gint64 time; gboolean draws_attention; GSimpleAction *action; + GIcon *app_icon; + gchar *app_iconstr; g_variant_get (message, "(&s&s&s&s&sxb)", &id, &iconstr, &title, &subtitle, &body, &time, &draws_attention); + app_icon = g_app_info_get_icon (G_APP_INFO (app->info)); + app_iconstr = app_icon ? g_icon_to_string (app_icon) : NULL; + action = g_simple_action_new (id, NULL); g_simple_action_group_insert (G_SIMPLE_ACTION_GROUP (app->actions), G_ACTION (action)); g_signal_emit (app->list, signals[MESSAGE_ADDED], 0, - app->info, id, iconstr, title, subtitle, body, time, draws_attention); + app->id, app_iconstr, id, iconstr, title, subtitle, body, time, draws_attention); + g_free (app_iconstr); g_object_unref (action); } @@ -368,7 +409,7 @@ im_application_list_message_removed (Application *app, { g_simple_action_group_remove (app->actions, id); - g_signal_emit (app->list, signals[MESSAGE_REMOVED], 0, app->info, id); + g_signal_emit (app->list, signals[MESSAGE_REMOVED], 0, app->id, id); } static void @@ -419,12 +460,10 @@ im_application_list_unset_remote (Application *app) * the muxer */ g_object_unref (app->actions); app->actions = g_simple_action_group_new (); - g_action_muxer_insert (app->list->muxer, - g_app_info_get_id (G_APP_INFO (app->info)), - G_ACTION_GROUP (app->actions)); + g_action_muxer_insert (app->list->muxer, app->id, G_ACTION_GROUP (app->actions)); if (was_running) - g_signal_emit (app->list, signals[APP_STOPPED], 0, app->info); + g_signal_emit (app->list, signals[APP_STOPPED], 0, app->id); } static void @@ -482,7 +521,7 @@ im_application_list_set_remote (ImApplicationList *list, g_return_if_fail (IM_IS_APPLICATION_LIST (list)); - app = g_hash_table_lookup (list->applications, id); + app = im_application_list_lookup (list, id); if (!app) { g_warning ("'%s' is not a registered application", id); diff --git a/src/im-phone-menu.c b/src/im-phone-menu.c index 9fd52df..65718be 100644 --- a/src/im-phone-menu.c +++ b/src/im-phone-menu.c @@ -113,7 +113,8 @@ im_phone_menu_get_model (ImPhoneMenu *menu) void im_phone_menu_add_message (ImPhoneMenu *menu, - GDesktopAppInfo *app, + const gchar *app_id, + const gchar *app_icon, const gchar *id, const gchar *iconstr, const gchar *title, @@ -121,15 +122,10 @@ im_phone_menu_add_message (ImPhoneMenu *menu, const gchar *body, gint64 time) { - const gchar *app_id; GMenuItem *item; gchar *action_name; - GIcon *app_icon; g_return_if_fail (IM_IS_PHONE_MENU (menu)); - g_return_if_fail (G_IS_DESKTOP_APP_INFO (app)); - - app_id = g_app_info_get_id (G_APP_INFO (app)); g_return_if_fail (app_id); action_name = g_strconcat (app_id, ".", id, NULL); @@ -144,16 +140,8 @@ im_phone_menu_add_message (ImPhoneMenu *menu, if (iconstr) g_menu_item_set_attribute (item, "x-canonical-icon", "s", iconstr); - app_icon = g_app_info_get_icon (G_APP_INFO (app)); if (app_icon) - { - gchar *app_iconstr; - - app_iconstr = g_icon_to_string (app_icon); - g_menu_item_set_attribute (item, "x-canonical-app-icon", "s", app_iconstr); - - g_free (app_iconstr); - } + g_menu_item_set_attribute (item, "x-canonical-app-icon", "s", app_icon); g_menu_append_item (menu->message_section, item); @@ -163,15 +151,15 @@ im_phone_menu_add_message (ImPhoneMenu *menu, void im_phone_menu_remove_message (ImPhoneMenu *menu, - GDesktopAppInfo *app, + const gchar *app_id, const gchar *id) { gchar *action_name; g_return_if_fail (IM_IS_PHONE_MENU (menu)); - g_return_if_fail (G_IS_DESKTOP_APP_INFO (app)); + g_return_if_fail (app_id != NULL); - action_name = g_strconcat (g_app_info_get_id (G_APP_INFO (app)), ".", id, NULL); + action_name = g_strconcat (app_id, ".", id, NULL); im_phone_menu_foreach_item_with_action (G_MENU_MODEL (menu->message_section), action_name, (ImMenuForeachFunc) g_menu_remove); @@ -181,7 +169,7 @@ im_phone_menu_remove_message (ImPhoneMenu *menu, void im_phone_menu_add_source (ImPhoneMenu *menu, - GDesktopAppInfo *app, + const gchar *app_id, const gchar *id, const gchar *label, const gchar *iconstr) @@ -190,9 +178,9 @@ im_phone_menu_add_source (ImPhoneMenu *menu, gchar *action_name; g_return_if_fail (IM_IS_PHONE_MENU (menu)); - g_return_if_fail (G_IS_DESKTOP_APP_INFO (app)); + g_return_if_fail (app_id != NULL); - action_name = g_strconcat (g_app_info_get_id (G_APP_INFO (app)), ".", id, NULL); + action_name = g_strconcat (app_id, ".", id, NULL); item = g_menu_item_new (label, action_name); g_menu_item_set_attribute (item, "x-canonical-type", "s", "com.canonical.indicator.messages.sourceitem"); @@ -208,15 +196,15 @@ im_phone_menu_add_source (ImPhoneMenu *menu, void im_phone_menu_remove_source (ImPhoneMenu *menu, - GDesktopAppInfo *app, + const gchar *app_id, const gchar *id) { gchar *action_name; g_return_if_fail (IM_IS_PHONE_MENU (menu)); - g_return_if_fail (G_IS_DESKTOP_APP_INFO (app)); + g_return_if_fail (app_id != NULL); - action_name = g_strconcat (g_app_info_get_id (G_APP_INFO (app)), ".", id, NULL); + action_name = g_strconcat (app_id, ".", id, NULL); im_phone_menu_foreach_item_with_action (G_MENU_MODEL (menu->source_section), action_name, (ImMenuForeachFunc) g_menu_remove); @@ -226,13 +214,13 @@ im_phone_menu_remove_source (ImPhoneMenu *menu, static void im_phone_menu_remove_all_for_app (GMenu *menu, - GDesktopAppInfo *app) + const gchar *app_id) { gchar *prefix; gint n_items; gint i = 0; - prefix = g_strconcat (g_app_info_get_id (G_APP_INFO (app)), ".", NULL); + prefix = g_strconcat (app_id, ".", NULL); n_items = g_menu_model_get_n_items (G_MENU_MODEL (menu)); while (i < n_items) @@ -258,11 +246,11 @@ im_phone_menu_remove_all_for_app (GMenu *menu, void im_phone_menu_remove_application (ImPhoneMenu *menu, - GDesktopAppInfo *app) + const gchar *app_id) { g_return_if_fail (IM_IS_PHONE_MENU (menu)); - g_return_if_fail (G_IS_DESKTOP_APP_INFO (app)); + g_return_if_fail (app_id != NULL); - im_phone_menu_remove_all_for_app (menu->source_section, app); - im_phone_menu_remove_all_for_app (menu->message_section, app); + im_phone_menu_remove_all_for_app (menu->source_section, app_id); + im_phone_menu_remove_all_for_app (menu->message_section, app_id); } diff --git a/src/im-phone-menu.h b/src/im-phone-menu.h index b0b6b4f..f6a6118 100644 --- a/src/im-phone-menu.h +++ b/src/im-phone-menu.h @@ -21,7 +21,6 @@ #define __IM_PHONE_MENU_H__ #include -#include #define IM_TYPE_PHONE_MENU (im_phone_menu_get_type ()) #define IM_PHONE_MENU(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), IM_TYPE_PHONE_MENU, ImPhoneMenu)) @@ -39,7 +38,8 @@ ImPhoneMenu * im_phone_menu_new (void); GMenuModel * im_phone_menu_get_model (ImPhoneMenu *menu); void im_phone_menu_add_message (ImPhoneMenu *menu, - GDesktopAppInfo *app, + const gchar *app_id, + const gchar *app_icon, const gchar *id, const gchar *iconstr, const gchar *title, @@ -48,20 +48,20 @@ void im_phone_menu_add_message (ImPhoneMenu *men gint64 time); void im_phone_menu_remove_message (ImPhoneMenu *menu, - GDesktopAppInfo *app, + const gchar *app_id, const gchar *id); void im_phone_menu_add_source (ImPhoneMenu *menu, - GDesktopAppInfo *app, + const gchar *app_id, const gchar *id, const gchar *label, const gchar *iconstr); void im_phone_menu_remove_source (ImPhoneMenu *menu, - GDesktopAppInfo *app, + const gchar *app_id, const gchar *id); -void im_phone_menu_remove_application (ImPhoneMenu *menu, - GDesktopAppInfo *app); +void im_phone_menu_remove_application (ImPhoneMenu *menu, + const gchar *app_id); #endif -- cgit v1.2.3 From 629b28e7f86d13eb78274c51a9164bdcac4e2cd7 Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Mon, 26 Nov 2012 11:49:17 +0100 Subject: ImApplicationList: listen to activate signal --- src/im-application-list.c | 76 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 58 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/im-application-list.c b/src/im-application-list.c index 24df19e..dc8c146 100644 --- a/src/im-application-list.c +++ b/src/im-application-list.c @@ -86,6 +86,60 @@ application_free (gpointer data) g_slice_free (Application, app); } +static void +im_application_list_source_removed (Application *app, + const gchar *id) +{ + g_simple_action_group_remove (app->actions, id); + + g_signal_emit (app->list, signals[SOURCE_REMOVED], 0, app->id, id); +} + +static void +im_application_list_source_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + Application *app = user_data; + const gchar *source_id; + + source_id = g_action_get_name (G_ACTION (action)); + + indicator_messages_application_call_activate_source (app->proxy, + source_id, + app->cancellable, + NULL, NULL); + + im_application_list_source_removed (app, source_id); +} + +static void +im_application_list_message_removed (Application *app, + const gchar *id) +{ + g_simple_action_group_remove (app->actions, id); + + g_signal_emit (app->list, signals[MESSAGE_REMOVED], 0, app->id, id); +} + +static void +im_application_list_message_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + Application *app = user_data; + const gchar *message_id; + + message_id = g_action_get_name (G_ACTION (action)); + + indicator_messages_application_call_activate_message (app->proxy, + message_id, + app->cancellable, + NULL, NULL); + + im_application_list_message_removed (app, message_id); +} + static void im_application_list_dispose (GObject *object) { @@ -304,6 +358,8 @@ im_application_list_source_added (Application *app, state = g_variant_new ("(uxsb)", count, time, string, draws_attention); action = g_simple_action_new_stateful (id, NULL, state); + g_signal_connect (action, "activate", G_CALLBACK (im_application_list_source_activated), app); + g_simple_action_group_insert (app->actions, G_ACTION (action)); g_signal_emit (app->list, signals[SOURCE_ADDED], 0, app->id, id, label, iconstr); @@ -332,15 +388,6 @@ im_application_list_source_changed (Application *app, g_signal_emit (app->list, signals[SOURCE_CHANGED], 0, app->id, id, label, iconstr); } -static void -im_application_list_source_removed (Application *app, - const gchar *id) -{ - g_simple_action_group_remove (app->actions, id); - - g_signal_emit (app->list, signals[SOURCE_REMOVED], 0, app->id, id); -} - static void im_application_list_sources_listed (GObject *source_object, GAsyncResult *result, @@ -394,6 +441,8 @@ im_application_list_message_added (Application *app, app_iconstr = app_icon ? g_icon_to_string (app_icon) : NULL; action = g_simple_action_new (id, NULL); + g_signal_connect (action, "activate", G_CALLBACK (im_application_list_message_activated), app); + g_simple_action_group_insert (G_SIMPLE_ACTION_GROUP (app->actions), G_ACTION (action)); g_signal_emit (app->list, signals[MESSAGE_ADDED], 0, @@ -403,15 +452,6 @@ im_application_list_message_added (Application *app, g_object_unref (action); } -static void -im_application_list_message_removed (Application *app, - const gchar *id) -{ - g_simple_action_group_remove (app->actions, id); - - g_signal_emit (app->list, signals[MESSAGE_REMOVED], 0, app->id, id); -} - static void im_application_list_messages_listed (GObject *source_object, GAsyncResult *result, -- cgit v1.2.3 From eeb48cb2ecc059080ef6c079d1527eebe88da42f Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Mon, 26 Nov 2012 13:36:43 +0100 Subject: ImApplicationList: give message and source actions a boolean parameter The application will only be notified about the activation when this parameter is true. False denotes a dismissed item. --- src/im-application-list.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/im-application-list.c b/src/im-application-list.c index dc8c146..644051f 100644 --- a/src/im-application-list.c +++ b/src/im-application-list.c @@ -105,10 +105,13 @@ im_application_list_source_activated (GSimpleAction *action, source_id = g_action_get_name (G_ACTION (action)); - indicator_messages_application_call_activate_source (app->proxy, - source_id, - app->cancellable, - NULL, NULL); + if (g_variant_get_boolean (parameter)) + { + indicator_messages_application_call_activate_source (app->proxy, + source_id, + app->cancellable, + NULL, NULL); + } im_application_list_source_removed (app, source_id); } @@ -132,10 +135,13 @@ im_application_list_message_activated (GSimpleAction *action, message_id = g_action_get_name (G_ACTION (action)); - indicator_messages_application_call_activate_message (app->proxy, - message_id, - app->cancellable, - NULL, NULL); + if (g_variant_get_boolean (parameter)) + { + indicator_messages_application_call_activate_message (app->proxy, + message_id, + app->cancellable, + NULL, NULL); + } im_application_list_message_removed (app, message_id); } @@ -357,7 +363,7 @@ im_application_list_source_added (Application *app, &id, &label, &iconstr, &count, &time, &string, &draws_attention); state = g_variant_new ("(uxsb)", count, time, string, draws_attention); - action = g_simple_action_new_stateful (id, NULL, state); + action = g_simple_action_new_stateful (id, G_VARIANT_TYPE_BOOLEAN, state); g_signal_connect (action, "activate", G_CALLBACK (im_application_list_source_activated), app); g_simple_action_group_insert (app->actions, G_ACTION (action)); @@ -440,7 +446,7 @@ im_application_list_message_added (Application *app, app_icon = g_app_info_get_icon (G_APP_INFO (app->info)); app_iconstr = app_icon ? g_icon_to_string (app_icon) : NULL; - action = g_simple_action_new (id, NULL); + 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 (G_SIMPLE_ACTION_GROUP (app->actions), G_ACTION (action)); -- cgit v1.2.3 From 76da35f3747a9efaa509d54d92b5511e6a0b69d0 Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Mon, 26 Nov 2012 16:15:55 +0100 Subject: Namespace actions with 'src' and 'msg' for sources and messages --- src/im-application-list.c | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/im-application-list.c b/src/im-application-list.c index 644051f..71100d4 100644 --- a/src/im-application-list.c +++ b/src/im-application-list.c @@ -56,7 +56,9 @@ typedef struct GDesktopAppInfo *info; gchar *id; IndicatorMessagesApplication *proxy; - GSimpleActionGroup *actions; + GActionMuxer *actions; + GSimpleActionGroup *source_actions; + GSimpleActionGroup *message_actions; GCancellable *cancellable; } Application; @@ -81,7 +83,11 @@ application_free (gpointer data) g_object_unref (app->proxy); if (app->actions) - g_object_unref (app->actions); + { + g_object_unref (app->actions); + g_object_unref (app->source_actions); + g_object_unref (app->message_actions); + } g_slice_free (Application, app); } @@ -90,7 +96,7 @@ static void im_application_list_source_removed (Application *app, const gchar *id) { - g_simple_action_group_remove (app->actions, id); + g_simple_action_group_remove (app->source_actions, id); g_signal_emit (app->list, signals[SOURCE_REMOVED], 0, app->id, id); } @@ -120,7 +126,7 @@ static void im_application_list_message_removed (Application *app, const gchar *id) { - g_simple_action_group_remove (app->actions, id); + g_simple_action_group_remove (app->message_actions, id); g_signal_emit (app->list, signals[MESSAGE_REMOVED], 0, app->id, id); } @@ -319,7 +325,12 @@ im_application_list_add (ImApplicationList *list, app->info = info; app->id = im_application_list_canonical_id (id); app->list = list; - app->actions = g_simple_action_group_new (); + app->actions = g_action_muxer_new (); + app->source_actions = g_simple_action_group_new (); + app->message_actions = g_simple_action_group_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_hash_table_insert (list->applications, (gpointer) app->id, app); g_action_muxer_insert (list->muxer, app->id, G_ACTION_GROUP (app->actions)); @@ -366,7 +377,7 @@ im_application_list_source_added (Application *app, action = g_simple_action_new_stateful (id, G_VARIANT_TYPE_BOOLEAN, state); g_signal_connect (action, "activate", G_CALLBACK (im_application_list_source_activated), app); - g_simple_action_group_insert (app->actions, G_ACTION (action)); + g_simple_action_group_insert (app->source_actions, G_ACTION (action)); g_signal_emit (app->list, signals[SOURCE_ADDED], 0, app->id, id, label, iconstr); @@ -388,7 +399,7 @@ im_application_list_source_changed (Application *app, g_variant_get (source, "(&s&s&sux&sb)", &id, &label, &iconstr, &count, &time, &string, &draws_attention); - g_action_group_change_action_state (G_ACTION_GROUP (app->actions), id, + g_action_group_change_action_state (G_ACTION_GROUP (app->source_actions), id, g_variant_new ("(uxsb)", count, time, string, draws_attention)); g_signal_emit (app->list, signals[SOURCE_CHANGED], 0, app->id, id, label, iconstr); @@ -449,7 +460,7 @@ 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 (G_SIMPLE_ACTION_GROUP (app->actions), G_ACTION (action)); + g_simple_action_group_insert (G_SIMPLE_ACTION_GROUP (app->message_actions), G_ACTION (action)); g_signal_emit (app->list, signals[MESSAGE_ADDED], 0, app->id, app_iconstr, id, iconstr, title, subtitle, body, time, draws_attention); @@ -504,9 +515,12 @@ im_application_list_unset_remote (Application *app) /* clear actions by creating a new action group and overriding it in * the muxer */ - g_object_unref (app->actions); - app->actions = g_simple_action_group_new (); - g_action_muxer_insert (app->list->muxer, app->id, G_ACTION_GROUP (app->actions)); + g_object_unref (app->source_actions); + g_object_unref (app->message_actions); + app->source_actions = g_simple_action_group_new (); + app->message_actions = g_simple_action_group_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)); if (was_running) g_signal_emit (app->list, signals[APP_STOPPED], 0, app->id); -- cgit v1.2.3 From f758143a4c818e23b2e410d5bf63305c84a07590 Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Mon, 26 Nov 2012 16:26:25 +0100 Subject: Add "Clear All" --- src/im-application-list.c | 44 +++++++++++++++++++++++++++++++++++++++++++- src/im-phone-menu.c | 8 ++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/im-application-list.c b/src/im-application-list.c index 71100d4..c3be647 100644 --- a/src/im-application-list.c +++ b/src/im-application-list.c @@ -152,6 +152,33 @@ im_application_list_message_activated (GSimpleAction *action, im_application_list_message_removed (app, message_id); } +static void +im_application_list_remove_all (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + ImApplicationList *list = user_data; + GHashTableIter iter; + Application *app; + + g_hash_table_iter_init (&iter, list->applications); + while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &app)) + { + gchar **actions; + gchar **it; + + actions = g_action_group_list_actions (G_ACTION_GROUP (app->source_actions)); + for (it = actions; *it; it++) + im_application_list_source_removed (app, *it); + g_strfreev (actions); + + actions = g_action_group_list_actions (G_ACTION_GROUP (app->message_actions)); + for (it = actions; *it; it++) + im_application_list_message_removed (app, *it); + g_strfreev (actions); + } +} + static void im_application_list_dispose (GObject *object) { @@ -256,8 +283,23 @@ im_application_list_class_init (ImApplicationListClass *klass) static void im_application_list_init (ImApplicationList *list) { + GSimpleActionGroup *actions; + GSimpleAction *remove_all_action; + list->applications = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, application_free); list->muxer = g_action_muxer_new (); + + actions = g_simple_action_group_new (); + + remove_all_action = g_simple_action_new ("remove-all", NULL); + g_signal_connect (remove_all_action, "activate", G_CALLBACK (im_application_list_remove_all), list); + + g_simple_action_group_insert (actions, G_ACTION (remove_all_action)); + + g_action_muxer_insert (list->muxer, NULL, G_ACTION_GROUP (actions)); + + g_object_unref (remove_all_action); + g_object_unref (actions); } ImApplicationList * @@ -460,7 +502,7 @@ 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 (G_SIMPLE_ACTION_GROUP (app->message_actions), G_ACTION (action)); + g_simple_action_group_insert (app->message_actions, G_ACTION (action)); g_signal_emit (app->list, signals[MESSAGE_ADDED], 0, app->id, app_iconstr, id, iconstr, title, subtitle, body, time, draws_attention); diff --git a/src/im-phone-menu.c b/src/im-phone-menu.c index 65718be..f1a5074 100644 --- a/src/im-phone-menu.c +++ b/src/im-phone-menu.c @@ -89,12 +89,20 @@ im_phone_menu_class_init (ImPhoneMenuClass *klass) static void im_phone_menu_init (ImPhoneMenu *menu) { + GMenuItem *item; + menu->message_section = g_menu_new (); menu->source_section = g_menu_new (); menu->toplevel_menu = g_menu_new (); g_menu_append_section (menu->toplevel_menu, NULL, G_MENU_MODEL (menu->message_section)); g_menu_append_section (menu->toplevel_menu, NULL, G_MENU_MODEL (menu->source_section)); + + item = g_menu_item_new ("Clear All", "remove-all"); + g_menu_item_set_attribute (item, "x-canonical-type", "s", "com.canonical.indicator.button"); + g_menu_append_item (menu->toplevel_menu, item); + + g_object_unref (item); } ImPhoneMenu * -- cgit v1.2.3 From abdb9c6e7bd033e8a9aa29a467e9f2e69cb6af2b Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Mon, 26 Nov 2012 17:10:04 +0100 Subject: Remove sections and "Clear All" when no sources or messages are available --- src/im-phone-menu.c | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/im-phone-menu.c b/src/im-phone-menu.c index f1a5074..7842920 100644 --- a/src/im-phone-menu.c +++ b/src/im-phone-menu.c @@ -59,6 +59,33 @@ im_phone_menu_foreach_item_with_action (GMenuModel *menu, } } +static void +im_phone_menu_update_toplevel (ImPhoneMenu *menu) +{ + if (g_menu_model_get_n_items (G_MENU_MODEL (menu->message_section)) || + g_menu_model_get_n_items (G_MENU_MODEL (menu->source_section))) + { + if (g_menu_model_get_n_items (G_MENU_MODEL (menu->toplevel_menu)) == 0) + { + GMenuItem *item; + + g_menu_append_section (menu->toplevel_menu, NULL, G_MENU_MODEL (menu->message_section)); + g_menu_append_section (menu->toplevel_menu, NULL, G_MENU_MODEL (menu->source_section)); + + item = g_menu_item_new ("Clear All", "remove-all"); + g_menu_item_set_attribute (item, "x-canonical-type", "s", "com.canonical.indicator.button"); + g_menu_append_item (menu->toplevel_menu, item); + + g_object_unref (item); + } + } + else + { + while (g_menu_model_get_n_items (G_MENU_MODEL (menu->toplevel_menu))) + g_menu_remove (menu->toplevel_menu, 0); + } +} + static void im_phone_menu_dispose (GObject *object) { @@ -89,20 +116,16 @@ im_phone_menu_class_init (ImPhoneMenuClass *klass) static void im_phone_menu_init (ImPhoneMenu *menu) { - GMenuItem *item; - + menu->toplevel_menu = g_menu_new (); menu->message_section = g_menu_new (); menu->source_section = g_menu_new (); - menu->toplevel_menu = g_menu_new (); - g_menu_append_section (menu->toplevel_menu, NULL, G_MENU_MODEL (menu->message_section)); - g_menu_append_section (menu->toplevel_menu, NULL, G_MENU_MODEL (menu->source_section)); - - item = g_menu_item_new ("Clear All", "remove-all"); - g_menu_item_set_attribute (item, "x-canonical-type", "s", "com.canonical.indicator.button"); - g_menu_append_item (menu->toplevel_menu, item); + g_signal_connect_swapped (menu->message_section, "items-changed", + G_CALLBACK (im_phone_menu_update_toplevel), menu); + g_signal_connect_swapped (menu->source_section, "items-changed", + G_CALLBACK (im_phone_menu_update_toplevel), menu); - g_object_unref (item); + im_phone_menu_update_toplevel (menu); } ImPhoneMenu * -- cgit v1.2.3 From b2c6b50cdfc1cc9a288516cef102ad2943b0e950 Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Mon, 26 Nov 2012 20:06:47 +0100 Subject: Use namespaced action names (src. and msg.) in phone menu --- src/im-phone-menu.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/im-phone-menu.c b/src/im-phone-menu.c index 7842920..728c08b 100644 --- a/src/im-phone-menu.c +++ b/src/im-phone-menu.c @@ -159,7 +159,7 @@ im_phone_menu_add_message (ImPhoneMenu *menu, g_return_if_fail (IM_IS_PHONE_MENU (menu)); g_return_if_fail (app_id); - action_name = g_strconcat (app_id, ".", id, NULL); + action_name = g_strconcat (app_id, ".msg.", id, NULL); item = g_menu_item_new (title, action_name); g_menu_item_set_attribute (item, "x-canonical-type", "s", "com.canonical.indicator.messages.messageitem"); @@ -190,7 +190,7 @@ im_phone_menu_remove_message (ImPhoneMenu *menu, g_return_if_fail (IM_IS_PHONE_MENU (menu)); g_return_if_fail (app_id != NULL); - action_name = g_strconcat (app_id, ".", id, NULL); + action_name = g_strconcat (app_id, ".msg.", id, NULL); im_phone_menu_foreach_item_with_action (G_MENU_MODEL (menu->message_section), action_name, (ImMenuForeachFunc) g_menu_remove); @@ -211,7 +211,7 @@ im_phone_menu_add_source (ImPhoneMenu *menu, g_return_if_fail (IM_IS_PHONE_MENU (menu)); g_return_if_fail (app_id != NULL); - action_name = g_strconcat (app_id, ".", id, NULL); + action_name = g_strconcat (app_id, ".src.", id, NULL); item = g_menu_item_new (label, action_name); g_menu_item_set_attribute (item, "x-canonical-type", "s", "com.canonical.indicator.messages.sourceitem"); @@ -235,7 +235,7 @@ im_phone_menu_remove_source (ImPhoneMenu *menu, g_return_if_fail (IM_IS_PHONE_MENU (menu)); g_return_if_fail (app_id != NULL); - action_name = g_strconcat (app_id, ".", id, NULL); + action_name = g_strconcat (app_id, ".src.", id, NULL); im_phone_menu_foreach_item_with_action (G_MENU_MODEL (menu->source_section), action_name, (ImMenuForeachFunc) g_menu_remove); -- cgit v1.2.3 From 9287c2e6577e71d8f68d9c9e7d393a4f8524ab10 Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Mon, 26 Nov 2012 20:12:13 +0100 Subject: Tell applications when messages and sources are dismissed Right now, this is only used to clean up internal data structures in libmessaging-menu. It's not exposed to the application itself. --- src/im-application-list.c | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/im-application-list.c b/src/im-application-list.c index c3be647..d766f24 100644 --- a/src/im-application-list.c +++ b/src/im-application-list.c @@ -118,6 +118,13 @@ im_application_list_source_activated (GSimpleAction *action, app->cancellable, NULL, NULL); } + else + { + const gchar *sources[] = { source_id, NULL }; + const gchar *messages[] = { NULL }; + indicator_messages_application_call_dismiss (app->proxy, sources, messages, + app->cancellable, NULL, NULL); + } im_application_list_source_removed (app, source_id); } @@ -148,6 +155,13 @@ im_application_list_message_activated (GSimpleAction *action, app->cancellable, NULL, NULL); } + else + { + const gchar *sources[] = { NULL }; + const gchar *messages[] = { message_id, NULL }; + indicator_messages_application_call_dismiss (app->proxy, sources, messages, + app->cancellable, NULL, NULL); + } im_application_list_message_removed (app, message_id); } @@ -164,18 +178,25 @@ im_application_list_remove_all (GSimpleAction *action, g_hash_table_iter_init (&iter, list->applications); while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &app)) { - gchar **actions; + gchar **source_actions; + gchar **message_actions; gchar **it; - actions = g_action_group_list_actions (G_ACTION_GROUP (app->source_actions)); - for (it = actions; *it; it++) + source_actions = g_action_group_list_actions (G_ACTION_GROUP (app->source_actions)); + for (it = source_actions; *it; it++) im_application_list_source_removed (app, *it); - g_strfreev (actions); - actions = g_action_group_list_actions (G_ACTION_GROUP (app->message_actions)); - for (it = actions; *it; it++) + message_actions = g_action_group_list_actions (G_ACTION_GROUP (app->message_actions)); + for (it = message_actions; *it; it++) im_application_list_message_removed (app, *it); - g_strfreev (actions); + + indicator_messages_application_call_dismiss (app->proxy, + (const gchar * const *) source_actions, + (const gchar * const *) message_actions, + app->cancellable, NULL, NULL); + + g_strfreev (source_actions); + g_strfreev (message_actions); } } -- cgit v1.2.3