aboutsummaryrefslogtreecommitdiff
path: root/src/idomenuitemfactory.c
diff options
context:
space:
mode:
authorLars Uebernickel <lars.uebernickel@canonical.com>2013-05-23 08:58:55 -0400
committerLars Uebernickel <lars.uebernickel@canonical.com>2013-05-23 08:58:55 -0400
commit424d5f429eb4a85943ce318aa5041d96e9f8731a (patch)
tree7d81c5b010408371b8bb4eacc231b82b6941d01a /src/idomenuitemfactory.c
parent1856933496d5c21e49abf9d2382f73ad504da077 (diff)
downloadayatana-ido-424d5f429eb4a85943ce318aa5041d96e9f8731a.tar.gz
ayatana-ido-424d5f429eb4a85943ce318aa5041d96e9f8731a.tar.bz2
ayatana-ido-424d5f429eb4a85943ce318aa5041d96e9f8731a.zip
Create IdoUserMenuItems for indicator.user-menu-item
Only used by the indicator-session/ng branch right now. Doesn't create guest menu items yet.
Diffstat (limited to 'src/idomenuitemfactory.c')
-rw-r--r--src/idomenuitemfactory.c106
1 files changed, 105 insertions, 1 deletions
diff --git a/src/idomenuitemfactory.c b/src/idomenuitemfactory.c
index 3eb8049..7f8273d 100644
--- a/src/idomenuitemfactory.c
+++ b/src/idomenuitemfactory.c
@@ -19,6 +19,9 @@
#include <gtk/gtk.h>
+#include "idoactionhelper.h"
+#include "idousermenuitem.h"
+
#define IDO_TYPE_MENU_ITEM_FACTORY (ido_menu_item_factory_get_type ())
#define IDO_MENU_ITEM_FACTORY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), IDO_TYPE_MENU_ITEM_FACTORY, IdoMenuItemFactory))
#define IDO_IS_MENU_ITEM_FACTORY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), IDO_TYPE_MENU_ITEM_FACTORY))
@@ -34,13 +37,114 @@ G_DEFINE_TYPE_WITH_CODE (IdoMenuItemFactory, ido_menu_item_factory, G_TYPE_OBJEC
g_io_extension_point_implement (GTK_MENU_ITEM_FACTORY_EXTENSION_POINT_NAME,
g_define_type_id, "ido", 0);)
+/**
+ * user_menu_item_state_changed:
+ *
+ * Updates an IdoUserMenuItem from @state. The state contains a
+ * dictionary with keys 'active-user' (for the user that the current
+ * session belongs too) and 'logged-in-users' (a list of all currently
+ * logged in users).
+ */
+static void
+user_menu_item_state_changed (IdoActionHelper *helper,
+ GVariant *state,
+ gpointer user_data)
+{
+ IdoUserMenuItem *item;
+ GVariant *target;
+ GVariant *v;
+
+ item = IDO_USER_MENU_ITEM (ido_action_helper_get_widget (helper));
+
+ ido_user_menu_item_set_current_user (item, FALSE);
+ ido_user_menu_item_set_logged_in (item, FALSE);
+
+ target = ido_action_helper_get_action_target (helper);
+ g_return_if_fail (g_variant_is_of_type (target, G_VARIANT_TYPE_STRING));
+
+ if ((v = g_variant_lookup_value (state, "active-user", G_VARIANT_TYPE_STRING)))
+ {
+ if (g_variant_equal (v, target))
+ ido_user_menu_item_set_current_user (item, TRUE);
+
+ g_variant_unref (v);
+ }
+
+ if ((v = g_variant_lookup_value (state, "logged-in-users", G_VARIANT_TYPE_STRING_ARRAY)))
+ {
+ GVariantIter it;
+ GVariant *user;
+
+ g_variant_iter_init (&it, v);
+ while ((user = g_variant_iter_next_value (&it)))
+ {
+ if (g_variant_equal (user, target))
+ ido_user_menu_item_set_logged_in (item, TRUE);
+ g_variant_unref (user);
+ }
+
+ g_variant_unref (v);
+ }
+}
+
+/**
+ * create_user_menu_item:
+ *
+ * Creates an IdoUserMenuItem. If @menuitem contains an action, the
+ * widget is bound to that action in @actions.
+ */
+static GtkMenuItem *
+create_user_menu_item (GMenuItem *menuitem,
+ GActionGroup *actions)
+{
+ IdoUserMenuItem *item;
+ gchar *label;
+ gchar *action;
+
+ item = IDO_USER_MENU_ITEM (ido_user_menu_item_new ());
+
+ if (g_menu_item_get_attribute (menuitem, "label", "s", &label))
+ {
+ ido_user_menu_item_set_label (item, label);
+ g_free (label);
+ }
+
+ if (g_menu_item_get_attribute (menuitem, "action", "s", &action))
+ {
+ IdoActionHelper *helper;
+ GVariant *target;
+
+ target = g_menu_item_get_attribute_value (menuitem, "target", G_VARIANT_TYPE_ANY);
+
+ helper = ido_action_helper_new (GTK_WIDGET (item), actions, action, target);
+ g_signal_connect (helper, "action-state-changed",
+ G_CALLBACK (user_menu_item_state_changed), NULL);
+
+ g_signal_connect_object (item, "activate",
+ G_CALLBACK (ido_action_helper_activate),
+ helper, G_CONNECT_SWAPPED);
+ g_signal_connect_swapped (item, "destroy", G_CALLBACK (g_object_unref), helper);
+
+ if (target)
+ g_variant_unref (target);
+ g_free (action);
+ }
+
+ return GTK_MENU_ITEM (item);
+}
+
static GtkMenuItem *
ido_menu_item_factory_create_menu_item (GtkMenuItemFactory *factory,
const gchar *type,
GMenuItem *menuitem,
GActionGroup *actions)
{
- return NULL;
+ GtkMenuItem *item = NULL;
+
+ if (g_str_equal (type, "indicator.user-menu-item"))
+ item = create_user_menu_item (menuitem, actions);
+
+ return item;
}
static void