aboutsummaryrefslogtreecommitdiff
path: root/src/messages-service.c
diff options
context:
space:
mode:
authorLars Uebernickel <lars.uebernickel@canonical.com>2012-06-27 20:50:22 +0200
committerLars Uebernickel <lars.uebernickel@canonical.com>2012-06-27 20:50:22 +0200
commit579f3cbd04bed13dae44dc87e83cae3092a90d49 (patch)
tree1886b93232ad801447ed517bd8dbe342d978a192 /src/messages-service.c
parent9ebfba3cde97027e4db9e220886760b802b8a213 (diff)
downloadayatana-indicator-messages-579f3cbd04bed13dae44dc87e83cae3092a90d49.tar.gz
ayatana-indicator-messages-579f3cbd04bed13dae44dc87e83cae3092a90d49.tar.bz2
ayatana-indicator-messages-579f3cbd04bed13dae44dc87e83cae3092a90d49.zip
Add toplevel menu
The toplevel menu represents the indicator itself. It has one item with a submenu, which is the indicator's popup menu. The action that is set on the toplevel will never be activated, but its state is used to indicate "draws-attention".
Diffstat (limited to 'src/messages-service.c')
-rw-r--r--src/messages-service.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/messages-service.c b/src/messages-service.c
index e892aef..4bd7e0c 100644
--- a/src/messages-service.c
+++ b/src/messages-service.c
@@ -38,6 +38,7 @@ static GHashTable *applications;
static GSimpleActionGroup *actions;
static GActionMuxer *action_muxer;
+static GMenu *toplevel_menu;
static GMenu *menu;
static GSettings *settings;
@@ -88,13 +89,17 @@ draws_attention_changed (GObject *object,
GParamSpec *pspec,
gpointer user_data)
{
+ GSimpleAction *messages;
GSimpleAction *clear;
gboolean attention;
+ messages = G_SIMPLE_ACTION (g_simple_action_group_lookup (actions, "messages"));
clear = G_SIMPLE_ACTION (g_simple_action_group_lookup (actions, "clear"));
- g_return_if_fail (clear != NULL);
+ g_return_if_fail (messages != NULL && clear != NULL);
attention = g_hash_table_find (applications, app_section_draws_attention, NULL) != NULL;
+
+ g_simple_action_set_state (messages, g_variant_new_boolean (attention));
g_simple_action_set_enabled (clear, attention);
}
@@ -294,11 +299,16 @@ GSimpleActionGroup *
create_action_group ()
{
GSimpleActionGroup *actions;
+ GSimpleAction *messages;
GSimpleAction *clear;
GSimpleAction *status;
actions = g_simple_action_group_new ();
+ /* state of the messages action mirrors "draws-attention" */
+ messages = g_simple_action_new_stateful ("messages", G_VARIANT_TYPE ("b"),
+ g_variant_new_boolean (FALSE));
+
status = g_simple_action_new_stateful ("status", G_VARIANT_TYPE ("s"),
g_variant_new ("s", "offline"));
g_signal_connect (status, "activate", G_CALLBACK (radio_item_activate), NULL);
@@ -308,6 +318,7 @@ create_action_group ()
g_simple_action_set_enabled (clear, FALSE);
g_signal_connect (clear, "activate", G_CALLBACK (clear_action_activate), NULL);
+ g_simple_action_group_insert (actions, G_ACTION (messages));
g_simple_action_group_insert (actions, G_ACTION (status));
g_simple_action_group_insert (actions, G_ACTION (clear));
@@ -353,7 +364,7 @@ got_bus (GObject *object,
}
g_dbus_connection_export_menu_model (bus, INDICATOR_MESSAGES_DBUS_OBJECT,
- G_MENU_MODEL (menu), &error);
+ G_MENU_MODEL (toplevel_menu), &error);
if (error) {
g_warning ("unable to export menu on dbus: %s", error->message);
g_error_free (error);
@@ -370,6 +381,7 @@ main (int argc, char ** argv)
IndicatorService * service = NULL;
MessageServiceDbus * dbus_interface = NULL;
GMenuModel *status_items;
+ GMenuItem *header;
/* Glib init */
g_type_init();
@@ -406,6 +418,13 @@ main (int argc, char ** argv)
g_menu_append_section (menu, _("Status"), status_items);
g_menu_append (menu, _("Clear"), "clear");
+ toplevel_menu = g_menu_new ();
+ header = g_menu_item_new (NULL, "messages");
+ g_menu_item_set_submenu (header, G_MENU_MODEL (menu));
+ g_menu_item_set_attribute (header, INDICATOR_MENU_ATTRIBUTE_ICON_NAME, "s", "indicator-messages");
+ g_menu_append_item (toplevel_menu, header);
+ g_object_unref (header);
+
settings = g_settings_new ("com.canonical.indicator.messages");
applications = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);