From 3f3aa147ac8ee224f40d9c4e9800b4c5825fde59 Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Wed, 22 May 2013 22:51:19 -0400 Subject: Add IdoMenuItemFactory It's implementing the GtkMenuItemFactory extension point (only available in Ubuntu's version of gtk+). It doesn't create any menu items yet. The extension point must be registered before calling gtk_menu_new_from_model() with a menu model that references any of the custom menu items ido will provide. Registering means the type must exist in the type system. This patch adds an ido_init() which does that. Consumers of libido are required to call this function from now on. --- src/idomenuitemfactory.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/idomenuitemfactory.c (limited to 'src/idomenuitemfactory.c') diff --git a/src/idomenuitemfactory.c b/src/idomenuitemfactory.c new file mode 100644 index 0000000..3eb8049 --- /dev/null +++ b/src/idomenuitemfactory.c @@ -0,0 +1,60 @@ +/* + * 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 + +#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);) + +static GtkMenuItem * +ido_menu_item_factory_create_menu_item (GtkMenuItemFactory *factory, + const gchar *type, + GMenuItem *menuitem, + GActionGroup *actions) +{ + return NULL; +} + +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) +{ +} -- cgit v1.2.3 From 424d5f429eb4a85943ce318aa5041d96e9f8731a Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Thu, 23 May 2013 08:58:55 -0400 Subject: Create IdoUserMenuItems for indicator.user-menu-item Only used by the indicator-session/ng branch right now. Doesn't create guest menu items yet. --- src/idomenuitemfactory.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 1 deletion(-) (limited to 'src/idomenuitemfactory.c') 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 +#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 -- cgit v1.2.3 From 2c0fa18b2452ab23f70ffb3feae21a88b8f05053 Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Fri, 24 May 2013 15:17:47 -0400 Subject: GtkMenuItemFactory -> UbuntuMenuItemFactory --- src/idomenuitemfactory.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'src/idomenuitemfactory.c') diff --git a/src/idomenuitemfactory.c b/src/idomenuitemfactory.c index 7f8273d..c8e61f4 100644 --- a/src/idomenuitemfactory.c +++ b/src/idomenuitemfactory.c @@ -18,6 +18,7 @@ */ #include +#include #include "idoactionhelper.h" #include "idousermenuitem.h" @@ -30,11 +31,11 @@ typedef GObject IdoMenuItemFactory; typedef GObjectClass IdoMenuItemFactoryClass; GType ido_menu_item_factory_get_type (void); -static void ido_menu_item_factory_interface_init (GtkMenuItemFactoryInterface *iface); +static void ido_menu_item_factory_interface_init (UbuntuMenuItemFactoryInterface *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_IMPLEMENT_INTERFACE (UBUNTU_TYPE_MENU_ITEM_FACTORY, ido_menu_item_factory_interface_init) + g_io_extension_point_implement (UBUNTU_MENU_ITEM_FACTORY_EXTENSION_POINT_NAME, g_define_type_id, "ido", 0);) /** @@ -134,10 +135,10 @@ create_user_menu_item (GMenuItem *menuitem, } static GtkMenuItem * -ido_menu_item_factory_create_menu_item (GtkMenuItemFactory *factory, - const gchar *type, - GMenuItem *menuitem, - GActionGroup *actions) +ido_menu_item_factory_create_menu_item (UbuntuMenuItemFactory *factory, + const gchar *type, + GMenuItem *menuitem, + GActionGroup *actions) { GtkMenuItem *item = NULL; @@ -153,7 +154,7 @@ ido_menu_item_factory_class_init (IdoMenuItemFactoryClass *class) } static void -ido_menu_item_factory_interface_init (GtkMenuItemFactoryInterface *iface) +ido_menu_item_factory_interface_init (UbuntuMenuItemFactoryInterface *iface) { iface->create_menu_item = ido_menu_item_factory_create_menu_item; } -- cgit v1.2.3 From e863f12e806f60b3592ca09211d8dd96d6dde810 Mon Sep 17 00:00:00 2001 From: Lars Uebernickel Date: Mon, 27 May 2013 12:04:11 -0400 Subject: 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. --- src/idomenuitemfactory.c | 99 +----------------------------------------------- 1 file changed, 1 insertion(+), 98 deletions(-) (limited to 'src/idomenuitemfactory.c') 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 #include -#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; } -- cgit v1.2.3