/* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Lars Uebernickel */ #include #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)) typedef GObject IdoMenuItemFactory; typedef GObjectClass IdoMenuItemFactoryClass; GType ido_menu_item_factory_get_type (void); static void ido_menu_item_factory_interface_init (GtkMenuItemFactoryInterface *iface); G_DEFINE_TYPE_WITH_CODE (IdoMenuItemFactory, ido_menu_item_factory, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GTK_TYPE_MENU_ITEM_FACTORY, ido_menu_item_factory_interface_init) 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) { GtkMenuItem *item = NULL; if (g_str_equal (type, "indicator.user-menu-item")) item = create_user_menu_item (menuitem, actions); return item; } static void ido_menu_item_factory_class_init (IdoMenuItemFactoryClass *class) { } static void ido_menu_item_factory_interface_init (GtkMenuItemFactoryInterface *iface) { iface->create_menu_item = ido_menu_item_factory_create_menu_item; } static void ido_menu_item_factory_init (IdoMenuItemFactory *factory) { }