From fc6ee128cb49aaa96d433442d326db4c6141d48d Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Mon, 7 Apr 2014 11:48:50 +0200 Subject: desktop menu: don't show status section when no apps supports it --- src/im-desktop-menu.c | 94 ++++++++++++++++++++++++--------------------------- src/im-menu.c | 14 ++++++++ src/im-menu.h | 3 ++ 3 files changed, 62 insertions(+), 49 deletions(-) diff --git a/src/im-desktop-menu.c b/src/im-desktop-menu.c index 11e3d41..bfae137 100644 --- a/src/im-desktop-menu.c +++ b/src/im-desktop-menu.c @@ -27,11 +27,53 @@ struct _ImDesktopMenu { ImMenu parent; + gboolean status_section_visible; GHashTable *source_sections; }; G_DEFINE_TYPE (ImDesktopMenu, im_desktop_menu, IM_TYPE_MENU); +static void +menu_append_status (GMenu *menu, + const gchar *label, + const gchar *detailed_action, + const gchar *icon_name) +{ + GMenuItem *item; + GIcon *icon; + + icon = g_themed_icon_new (icon_name); + + item = g_menu_item_new (label, detailed_action); + g_menu_item_set_icon (item, icon); + g_menu_append_item (menu, item); + + g_object_unref (icon); + g_object_unref (item); +} + +static void +im_desktop_menu_show_chat_section (ImDesktopMenu *menu) +{ + GMenu *status_section; + + if (menu->status_section_visible) + return; + + status_section = g_menu_new (); + + menu_append_status (status_section, _("Available"), "indicator.status::available", "user-available"); + menu_append_status (status_section, _("Away"), "indicator.status::away", "user-away"); + menu_append_status (status_section, _("Busy"), "indicator.status::busy", "user-busy"); + menu_append_status (status_section, _("Invisible"), "indicator.status::invisible", "user-invisible"); + menu_append_status (status_section, _("Offline"), "indicator.status::offline", "user-offline"); + + im_menu_prepend_section (IM_MENU (menu), G_MENU_MODEL (status_section)); + menu->status_section_visible = TRUE; + + g_object_unref (status_section); +} + static void im_desktop_menu_app_added (ImApplicationList *applist, const gchar *app_id, @@ -94,6 +136,9 @@ im_desktop_menu_app_added (ImApplicationList *applist, g_clear_object(&shortcuts); } + if (g_desktop_app_info_get_boolean (app_info, "X-MessagingMenu-UsesChatSection")) + im_desktop_menu_show_chat_section (menu); + source_section = g_menu_new (); section = g_menu_new (); @@ -261,61 +306,12 @@ im_desktop_menu_app_stopped (ImApplicationList *applist, g_menu_remove (section, 0); } -static GMenu * -create_status_section (void) -{ - GMenu *menu; - GMenuItem *item; - struct status_item { - gchar *label; - gchar *action; - gchar *icon_name; - } status_items[] = { - { _("Available"), "indicator.status::available", "user-available" }, - { _("Away"), "indicator.status::away", "user-away" }, - { _("Busy"), "indicator.status::busy", "user-busy" }, - { _("Invisible"), "indicator.status::invisible", "user-invisible" }, - { _("Offline"), "indicator.status::offline", "user-offline" } - }; - int i; - - menu = g_menu_new (); - - item = g_menu_item_new (NULL, NULL); - - for (i = 0; i < G_N_ELEMENTS (status_items); i++) { - GIcon *icon; - - g_menu_item_set_label (item, status_items[i].label); - g_menu_item_set_detailed_action (item, status_items[i].action); - - icon = g_themed_icon_new (status_items[i].icon_name); - g_menu_item_set_icon (item, icon); - - g_menu_append_item (menu, item); - - g_object_unref (icon); - } - - g_object_unref (item); - return menu; -} - static void im_desktop_menu_constructed (GObject *object) { ImDesktopMenu *menu = IM_DESKTOP_MENU (object); ImApplicationList *applist; - { - GMenu *status_section; - - status_section = create_status_section(); - im_menu_append_section (IM_MENU (menu), G_MENU_MODEL (status_section)); - - g_object_unref (status_section); - } - { GMenu *clear_section; diff --git a/src/im-menu.c b/src/im-menu.c index 55ea99c..57cf957 100644 --- a/src/im-menu.c +++ b/src/im-menu.c @@ -148,6 +148,20 @@ im_menu_export (ImMenu *menu, error) > 0; } +void +im_menu_prepend_section (ImMenu *menu, + GMenuModel *section) +{ + ImMenuPrivate *priv; + + g_return_if_fail (IM_IS_MENU (menu)); + g_return_if_fail (G_IS_MENU_MODEL (section)); + + priv = im_menu_get_instance_private (menu); + + g_menu_prepend_section (priv->menu, NULL, section); +} + void im_menu_append_section (ImMenu *menu, GMenuModel *section) diff --git a/src/im-menu.h b/src/im-menu.h index 7c15eb7..57815b5 100644 --- a/src/im-menu.h +++ b/src/im-menu.h @@ -53,6 +53,9 @@ gboolean im_menu_export (ImMenu const gchar *object_path, GError **error); +void im_menu_prepend_section (ImMenu *menu, + GMenuModel *section); + void im_menu_append_section (ImMenu *menu, GMenuModel *section); -- cgit v1.2.3 From de9c80835a2facd1957d580f01e81209294406f6 Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Mon, 7 Apr 2014 12:00:10 +0200 Subject: Only show the menu when there are apps registered to use it --- src/im-application-list.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/im-application-list.c b/src/im-application-list.c index d285fda..4f5903a 100644 --- a/src/im-application-list.c +++ b/src/im-application-list.c @@ -155,7 +155,7 @@ application_draws_attention (gpointer key, } static void -im_application_list_update_draws_attention (ImApplicationList *list) +im_application_list_update_root_action (ImApplicationList *list) { const gchar *base_icon_name; const gchar *accessible_name; @@ -164,6 +164,7 @@ im_application_list_update_draws_attention (ImApplicationList *list) GVariant *serialized_icon; GVariantBuilder builder; GVariant *state; + guint n_applications; /* Figure out what type of icon we should be drawing */ if (g_hash_table_find (list->applications, application_draws_attention, NULL)) { @@ -202,10 +203,8 @@ im_application_list_update_draws_attention (ImApplicationList *list) g_variant_builder_close(&builder); /* visibility */ - g_variant_builder_open(&builder, G_VARIANT_TYPE_DICT_ENTRY); - g_variant_builder_add_value(&builder, g_variant_new_string("visible")); - g_variant_builder_add_value(&builder, g_variant_new_variant(g_variant_new_boolean(TRUE))); - g_variant_builder_close(&builder); + n_applications = g_hash_table_size (list->applications); + g_variant_builder_add (&builder, "{sv}", "visible", g_variant_new_boolean (n_applications > 0)); /* Set the state */ g_action_group_change_action_state (G_ACTION_GROUP(list->globalactions), "messages", g_variant_builder_end(&builder)); @@ -294,7 +293,7 @@ im_application_list_source_removed (Application *app, g_signal_emit (app->list, signals[SOURCE_REMOVED], 0, app->id, id); if (application_update_draws_attention(app)) - im_application_list_update_draws_attention (app->list); + im_application_list_update_root_action (app->list); } static void @@ -333,7 +332,7 @@ im_application_list_message_removed (Application *app, g_action_muxer_remove (app->message_sub_actions, id); if (application_update_draws_attention(app)) - im_application_list_update_draws_attention (app->list); + im_application_list_update_root_action (app->list); g_signal_emit (app->list, signals[MESSAGE_REMOVED], 0, app->id, id); } @@ -435,7 +434,7 @@ im_application_list_remove_all (GSimpleAction *action, g_strfreev (message_actions); } - im_application_list_update_draws_attention (list); + im_application_list_update_root_action (list); } static void @@ -601,7 +600,7 @@ im_application_list_init (ImApplicationList *list) list->muxer = g_action_muxer_new (); g_action_muxer_insert (list->muxer, NULL, G_ACTION_GROUP (list->globalactions)); - im_application_list_update_draws_attention (list); + im_application_list_update_root_action (list); } ImApplicationList * @@ -744,6 +743,8 @@ im_application_list_add (ImApplicationList *list, g_hash_table_insert (list->applications, (gpointer) app->id, app); g_action_muxer_insert (list->muxer, app->id, G_ACTION_GROUP (app->muxer)); + im_application_list_update_root_action (list); + g_signal_emit (app->list, signals[APP_ADDED], 0, app->id, app->info); g_object_unref (launch_action); @@ -769,7 +770,7 @@ im_application_list_remove (ImApplicationList *list, g_hash_table_remove (list->applications, id); g_action_muxer_remove (list->muxer, id); - im_application_list_update_draws_attention (list); + im_application_list_update_root_action (list); } } @@ -809,7 +810,7 @@ im_application_list_source_added (Application *app, if (visible && draws_attention && app->draws_attention == FALSE) { app->draws_attention = TRUE; - im_application_list_update_draws_attention (app->list); + im_application_list_update_root_action (app->list); } g_object_unref (action); @@ -846,7 +847,7 @@ im_application_list_source_changed (Application *app, g_signal_emit (app->list, signals[SOURCE_CHANGED], 0, app->id, id, label, serialized_icon, visible); if (application_update_draws_attention (app)) - im_application_list_update_draws_attention (app->list); + im_application_list_update_root_action (app->list); if (serialized_icon) g_variant_unref (serialized_icon); @@ -1010,7 +1011,7 @@ im_application_list_message_added (Application *app, if (draws_attention && !app->draws_attention) { app->draws_attention = TRUE; - im_application_list_update_draws_attention (app->list); + im_application_list_update_root_action (app->list); } app_icon = get_symbolic_app_icon (G_APP_INFO (app->info)); @@ -1084,7 +1085,7 @@ im_application_list_unset_remote (Application *app) g_action_muxer_insert (app->muxer, "msg-actions", G_ACTION_GROUP (app->message_sub_actions)); app->draws_attention = FALSE; - im_application_list_update_draws_attention (app->list); + im_application_list_update_root_action (app->list); g_action_group_change_action_state (G_ACTION_GROUP (app->muxer), "launch", g_variant_new_boolean (FALSE)); @@ -1229,7 +1230,7 @@ status_activated (GSimpleAction * action, GVariant * param, gpointer user_data) g_signal_emit (list, signals[STATUS_SET], 0, status); - im_application_list_update_draws_attention(list); + im_application_list_update_root_action(list); return; } @@ -1276,7 +1277,7 @@ im_application_list_set_status (ImApplicationList * list, const gchar * id, cons g_simple_action_set_state(list->statusaction, g_variant_new_string(status_ids[final_status])); - im_application_list_update_draws_attention(list); + im_application_list_update_root_action(list); return; } -- cgit v1.2.3