aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Uebernickel <lars.uebernickel@canonical.com>2013-05-27 12:04:11 -0400
committerLars Uebernickel <lars.uebernickel@canonical.com>2013-05-27 12:04:11 -0400
commite863f12e806f60b3592ca09211d8dd96d6dde810 (patch)
tree25702afdc6dece82b1e4616f9f24d368f21c3f4a
parent07f79077388bda20a28fcd38a9e5b60631794ffe (diff)
downloadayatana-ido-e863f12e806f60b3592ca09211d8dd96d6dde810.tar.gz
ayatana-ido-e863f12e806f60b3592ca09211d8dd96d6dde810.tar.bz2
ayatana-ido-e863f12e806f60b3592ca09211d8dd96d6dde810.zip
Move crate_user_menu_item into idousermenuitem.c
We expect to have quite a few custom widgets. Having them all in idomenuitemfactory.c would clutter that file up too much.
-rw-r--r--src/idomenuitemfactory.c99
-rw-r--r--src/idousermenuitem.c98
-rw-r--r--src/idousermenuitem.h3
3 files changed, 102 insertions, 98 deletions
diff --git a/src/idomenuitemfactory.c b/src/idomenuitemfactory.c
index c8e61f4..59f3630 100644
--- a/src/idomenuitemfactory.c
+++ b/src/idomenuitemfactory.c
@@ -20,7 +20,6 @@
#include <gtk/gtk.h>
#include <gtk/ubuntu-private.h>
-#include "idoactionhelper.h"
#include "idousermenuitem.h"
#define IDO_TYPE_MENU_ITEM_FACTORY (ido_menu_item_factory_get_type ())
@@ -38,102 +37,6 @@ G_DEFINE_TYPE_WITH_CODE (IdoMenuItemFactory, ido_menu_item_factory, G_TYPE_OBJEC
g_io_extension_point_implement (UBUNTU_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 (UbuntuMenuItemFactory *factory,
const gchar *type,
@@ -143,7 +46,7 @@ ido_menu_item_factory_create_menu_item (UbuntuMenuItemFactory *factory,
GtkMenuItem *item = NULL;
if (g_str_equal (type, "indicator.user-menu-item"))
- item = create_user_menu_item (menuitem, actions);
+ item = ido_user_menu_item_new_from_model (menuitem, actions);
return item;
}
diff --git a/src/idousermenuitem.c b/src/idousermenuitem.c
index cb405e8..42b3c7b 100644
--- a/src/idousermenuitem.c
+++ b/src/idousermenuitem.c
@@ -26,6 +26,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <gtk/gtk.h>
#include "idousermenuitem.h"
+#include "idoactionhelper.h"
#define FALLBACK_ICON_NAME "avatar-default"
@@ -355,3 +356,100 @@ ido_user_menu_item_new (void)
{
return GTK_WIDGET (g_object_new (IDO_USER_MENU_ITEM_TYPE, NULL));
}
+
+/**
+ * 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);
+ }
+}
+
+/**
+ * ido_user_menu_item_create:
+ *
+ * Creates an IdoUserMenuItem. If @menuitem contains an action, the
+ * widget is bound to that action in @actions.
+ */
+GtkMenuItem *
+ido_user_menu_item_new_from_model (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);
+}
+
diff --git a/src/idousermenuitem.h b/src/idousermenuitem.h
index b9a3d00..d51f6c7 100644
--- a/src/idousermenuitem.h
+++ b/src/idousermenuitem.h
@@ -61,6 +61,9 @@ void ido_user_menu_item_set_logged_in (IdoUserMenuItem * self, gboolean i
void ido_user_menu_item_set_current_user (IdoUserMenuItem * self, gboolean is_current_user);
void ido_user_menu_item_set_label (IdoUserMenuItem * self, const char * label);
+GtkMenuItem * ido_user_menu_item_new_from_model (GMenuItem *menuitem,
+ GActionGroup *actions);
+
G_END_DECLS
#endif