aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dbus-shared-names.h2
-rw-r--r--src/indicator-session.c19
-rw-r--r--src/session-service.c16
-rw-r--r--src/user-widget.c119
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);
+
}
/**