diff options
-rw-r--r-- | src/dbus-shared-names.h | 2 | ||||
-rw-r--r-- | src/indicator-session.c | 19 | ||||
-rw-r--r-- | src/session-service.c | 16 | ||||
-rw-r--r-- | src/user-widget.c | 119 |
4 files changed, 109 insertions, 47 deletions
diff --git a/src/dbus-shared-names.h b/src/dbus-shared-names.h index b69c6ad..2e8e959 100644 --- a/src/dbus-shared-names.h +++ b/src/dbus-shared-names.h @@ -36,9 +36,11 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #define INDICATOR_SESSION_SERVICE_DBUS_OBJECT "/com/canonical/indicator/session/service" #define INDICATOR_SESSION_SERVICE_DBUS_IFACE "com.canonical.indicator.session.service" +// TODO change the logged in prop to 'has-sessions' in keeping with the spec. #define USER_ITEM_TYPE "x-canonical-user-item" #define USER_ITEM_PROP_NAME "user-item-name" #define USER_ITEM_PROP_LOGGED_IN "user-item-logged-in" +#define USER_ITEM_PROP_IS_CURRENT_USER "user-item-is-current-user" #define USER_ITEM_PROP_ICON "user-item-icon-path" #define USER_ITEM_ICON_DEFAULT "user-offline" diff --git a/src/indicator-session.c b/src/indicator-session.c index 35a55e0..f254957 100644 --- a/src/indicator-session.c +++ b/src/indicator-session.c @@ -153,8 +153,13 @@ indicator_session_init (IndicatorSession *self) // Setup the handlers for users DbusmenuClient * users_client = DBUSMENU_CLIENT(dbusmenu_gtkmenu_get_client(DBUSMENU_GTKMENU(self->users.menu))); - dbusmenu_client_add_type_handler(users_client, USER_ITEM_TYPE, new_user_item); - dbusmenu_client_add_type_handler_full (users_client, MENU_SWITCH_TYPE, build_menu_switch, self, NULL); + dbusmenu_client_add_type_handler (users_client, + USER_ITEM_TYPE, + new_user_item); + dbusmenu_client_add_type_handler_full (users_client, + MENU_SWITCH_TYPE, + build_menu_switch, + self, NULL); // Setup the handlers for devices DbusmenuClient * devices_client = DBUSMENU_CLIENT(dbusmenu_gtkmenu_get_client(DBUSMENU_GTKMENU(self->devices.menu))); @@ -290,11 +295,16 @@ new_user_item (DbusmenuMenuitem * newitem, GtkMenuItem *user_widget = GTK_MENU_ITEM(user_item); - gtk_widget_show_all (user_item); dbusmenu_gtkclient_newitem_base (DBUSMENU_GTKCLIENT(client), newitem, user_widget, parent); + + g_debug ("%s (\"%s\")", __func__, + dbusmenu_menuitem_property_get (newitem, + USER_ITEM_PROP_NAME)); + gtk_widget_show_all (user_item); + return TRUE; /*g_debug ("new user item called "); @@ -466,7 +476,8 @@ switch_property_change (DbusmenuMenuitem * item, no_name_in_lang = TRUE; } - if (variant == NULL || g_variant_get_string(variant, NULL) == NULL || g_variant_get_string(variant, NULL)[0] == '\0' || no_name_in_lang) { + if (variant == NULL || g_variant_get_string(variant, NULL) == NULL || + g_variant_get_string(variant, NULL)[0] == '\0' || no_name_in_lang) { finalstring = _("Switch User..."); set_ellipsize = FALSE; indicator_session_update_users_label (INDICATOR_SESSION (user_data), diff --git a/src/session-service.c b/src/session-service.c index fb5c7a9..c1fad59 100644 --- a/src/session-service.c +++ b/src/session-service.c @@ -506,7 +506,9 @@ rebuild_user_items (DbusmenuMenuitem *root, /* Check to see if the guest has sessions and so therefore should get a check mark. */ if (user->sessions != NULL) { - dbusmenu_menuitem_property_set_bool (guest_mi, USER_ITEM_PROP_LOGGED_IN, TRUE); + dbusmenu_menuitem_property_set_bool (guest_mi, + USER_ITEM_PROP_LOGGED_IN, + TRUE); } /* If we're showing user accounts, keep going through the list */ if (user_count > MINIMUM_USERS && user_count < MAXIMUM_USERS) { @@ -526,12 +528,20 @@ rebuild_user_items (DbusmenuMenuitem *root, } else { dbusmenu_menuitem_property_set (mi, USER_ITEM_PROP_NAME, user->real_name); } - dbusmenu_menuitem_property_set_bool (mi, USER_ITEM_PROP_LOGGED_IN, user->sessions != NULL); + dbusmenu_menuitem_property_set_bool (mi, + USER_ITEM_PROP_LOGGED_IN, + user->sessions != NULL); if (user->icon_file != NULL && user->icon_file[0] != '\0') { dbusmenu_menuitem_property_set(mi, USER_ITEM_PROP_ICON, user->icon_file); } else { dbusmenu_menuitem_property_set(mi, USER_ITEM_PROP_ICON, USER_ITEM_ICON_DEFAULT); } + + gboolean logged_in = g_strcmp0 (user->user_name, g_get_user_name()) == 0; + dbusmenu_menuitem_property_set_bool (mi, + USER_ITEM_PROP_IS_CURRENT_USER, + logged_in); + dbusmenu_menuitem_child_append (root, mi); g_signal_connect (G_OBJECT (mi), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, @@ -573,7 +583,7 @@ activate_online_accounts (DbusmenuMenuitem *mi, gpointer user_data) { GError * error = NULL; - if (!g_spawn_command_line_async("gnome-control-center", &error)) + if (!g_spawn_command_line_async("gnome-control-center online-accounts", &error)) { g_warning("Unable to show control centre: %s", error->message); g_error_free(error); diff --git a/src/user-widget.c b/src/user-widget.c index bd6634a..22f611c 100644 --- a/src/user-widget.c +++ b/src/user-widget.c @@ -26,6 +26,8 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include <glib.h> #include <libindicator/indicator-image-helper.h> #include "user-widget.h" +#include "dbus-shared-names.h" + typedef struct _UserWidgetPrivate UserWidgetPrivate; @@ -34,6 +36,8 @@ struct _UserWidgetPrivate DbusmenuMenuitem* twin_item; GtkWidget* user_image; GtkWidget* user_name; + GtkWidget* container; + GtkWidget* tick_icon; gboolean logged_in; gboolean sessions_active; }; @@ -86,11 +90,21 @@ static void user_widget_init (UserWidget *self) { UserWidgetPrivate * priv = USER_WIDGET_GET_PRIVATE(self); + + gint padding = 0; + gtk_widget_style_get (GTK_WIDGET(self), + "horizontal-padding", + &padding, + NULL); + priv->user_image = NULL; priv->user_name = NULL; priv->logged_in = FALSE; priv->sessions_active = FALSE; + priv->container = NULL; + priv->tick_icon = NULL; + // Create the UI elements. priv->user_image = gtk_image_new (); // Just for now set the image to the default avator image @@ -98,7 +112,7 @@ user_widget_init (UserWidget *self) GError* error = NULL; pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), "avatar-default", - 12, + 32, GTK_ICON_LOOKUP_FORCE_SIZE, &error); @@ -109,9 +123,35 @@ user_widget_init (UserWidget *self) gtk_image_set_from_pixbuf (GTK_IMAGE(priv->user_image), pixbuf); g_object_unref (pixbuf); } - + priv->user_name = gtk_label_new (""); + priv->container = gtk_hbox_new (FALSE, 0); + // TODO: + // Delete tick icon and draw primitively. + priv->tick_icon = gtk_image_new_from_icon_name ("account-logged-in", + GTK_ICON_SIZE_MENU); + gtk_misc_set_alignment(GTK_MISC(priv->tick_icon), 1.0, 0.5); + + // Pack it together + gtk_box_pack_start (GTK_BOX (priv->container), + priv->user_image, + FALSE, + FALSE, + 0); + gtk_box_pack_start (GTK_BOX (priv->container), + priv->user_name, + FALSE, + FALSE, + 3); + gtk_box_pack_start (GTK_BOX(priv->container), + priv->tick_icon, + FALSE, + FALSE, 5); + + gtk_widget_show_all (priv->container); + gtk_container_add (GTK_CONTAINER (self), priv->container); + // Fetch the drawing context. #if GTK_CHECK_VERSION(3, 0, 0) g_signal_connect_after (GTK_WIDGET(self), "draw", G_CALLBACK(user_widget_primitive_draw_cb_gtk_3), @@ -145,58 +185,43 @@ user_widget_finalize (GObject *object) #if GTK_CHECK_VERSION(3, 0, 0) -// Draw the triangle if the player is running ... +// Draw the radio dot and/or green check mark +// TODO handle drawing of green check mark static gboolean user_widget_primitive_draw_cb_gtk_3 (GtkWidget *widget, cairo_t* cr, gpointer user_data) { - /* + g_return_val_if_fail(IS_USER_WIDGET(user_data), FALSE); UserWidget* meta = USER_WIDGET(user_data); UserWidgetPrivate * priv = USER_WIDGET_GET_PRIVATE(meta); + // Draw dot only when user is the current user. + if (!dbusmenu_menuitem_property_get_bool (priv->twin_item, + USER_ITEM_PROP_IS_CURRENT_USER)){ + return FALSE; + } + + GtkStyle *style; - int x, y, arrow_width, arrow_height; - - gint offset = 3; - arrow_width = 5; - arrow_height = 9; + gdouble x, y; + gdouble offset = 15.0; style = gtk_widget_get_style (widget); GtkAllocation allocation; gtk_widget_get_allocation (widget, &allocation); - x = allocation.x; - y = 0; - - // Draw player icon - if (priv->icon_buf != NULL){ - gdk_cairo_set_source_pixbuf (cr, - priv->icon_buf, - x + arrow_width + 1, - y + offset); - cairo_paint (cr); - } - - // Draw triangle but only if the player is running. - if (dbusmenu_menuitem_property_get_bool (priv->twin_item, - DBUSMENU_METADATA_MENUITEM_PLAYER_RUNNING)){ - y += (double)arrow_height/2.0 + offset; - cairo_set_line_width (cr, 1.0); - - //g_debug ("triangle drawing"); - - cairo_move_to (cr, x, y); - cairo_line_to (cr, x, y + arrow_height); - cairo_line_to (cr, x + arrow_width, y + (double)arrow_height/2.0); - cairo_close_path (cr); - cairo_set_source_rgb (cr, style->fg[gtk_widget_get_state(widget)].red/65535.0, - style->fg[gtk_widget_get_state(widget)].green/65535.0, - style->fg[gtk_widget_get_state(widget)].blue/65535.0); - cairo_fill (cr); - }*/ + x = allocation.x + 13; + y = offset; + + cairo_arc (cr, x, y, 3.0, 0.0, 2 * G_PI);; + cairo_set_source_rgb (cr, style->fg[gtk_widget_get_state(widget)].red/65535.0, + style->fg[gtk_widget_get_state(widget)].green/65535.0, + style->fg[gtk_widget_get_state(widget)].blue/65535.0); + cairo_fill (cr); + return FALSE; } @@ -275,7 +300,7 @@ user_widget_property_update (DbusmenuMenuitem* item, gchar* property, GVariant* value, gpointer userdata) { g_return_if_fail (IS_USER_WIDGET (userdata)); - + //gtk_widget_queue_redraw (GTK_WIDGET(userdata)); } @@ -287,7 +312,21 @@ user_widget_set_twin_item (UserWidget* self, priv->twin_item = twin_item; g_signal_connect( G_OBJECT(priv->twin_item), "property-changed", G_CALLBACK(user_widget_property_update), self); - + + const gchar * icon_name = dbusmenu_menuitem_property_get (twin_item, + USER_ITEM_PROP_ICON); + gtk_label_set_label (GTK_LABEL (priv->user_name), + dbusmenu_menuitem_property_get (twin_item, USER_ITEM_PROP_NAME)); + + //if (dbusmenu_menuitem_property_get_bool (twin_item, USER_ITEM_PROP_LOGGED_IN)) { + // gtk_widget_show(priv->tick_icon); + //} else { + gtk_widget_show(priv->tick_icon); + //} + + g_debug("Using user icon for '%s' from file: %s", + dbusmenu_menuitem_property_get(twin_item, USER_ITEM_PROP_NAME), icon_name); + } /** |