aboutsummaryrefslogtreecommitdiff
path: root/src/indicator-session.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/indicator-session.c')
-rw-r--r--src/indicator-session.c554
1 files changed, 322 insertions, 232 deletions
diff --git a/src/indicator-session.c b/src/indicator-session.c
index c9617c4..23d7f37 100644
--- a/src/indicator-session.c
+++ b/src/indicator-session.c
@@ -20,6 +20,7 @@ You should have received a copy of the GNU General Public License along
with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+//TODO - remember to reinsert Ted's comments.
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
@@ -61,8 +62,8 @@ struct _IndicatorSessionClass {
struct _IndicatorSession {
IndicatorObject parent;
IndicatorServiceManager * service;
- GtkImage * status_image;
- DbusmenuGtkMenu * menu;
+ IndicatorObjectEntry users;
+ IndicatorObjectEntry devices;
GCancellable * service_proxy_cancel;
GDBusProxy * service_proxy;
};
@@ -74,15 +75,25 @@ INDICATOR_SET_VERSION
INDICATOR_SET_TYPE(INDICATOR_SESSION_TYPE)
/* Prototypes */
-static GtkLabel * get_label (IndicatorObject * io);
-static GtkImage * get_icon (IndicatorObject * io);
-static GtkMenu * get_menu (IndicatorObject * io);
-static const gchar * get_accessible_desc (IndicatorObject * io);
-static gboolean build_menu_switch (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client, gpointer user_data);
-static gboolean new_user_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client, gpointer user_data);
-static void icon_changed (IndicatorSession * session, const gchar * icon_name);
+static gboolean build_menu_switch (DbusmenuMenuitem * newitem,
+ DbusmenuMenuitem * parent,
+ DbusmenuClient * client,
+ gpointer user_data);
+static gboolean new_user_item (DbusmenuMenuitem * newitem,
+ DbusmenuMenuitem * parent,
+ DbusmenuClient * client,
+ gpointer user_data);
+static void user_property_change (DbusmenuMenuitem * item,
+ const gchar * property,
+ GVariant * variant,
+ gpointer user_data);
+static gboolean build_restart_item (DbusmenuMenuitem * newitem,
+ DbusmenuMenuitem * parent,
+ DbusmenuClient * client,
+ gpointer user_data);
+static void indicator_session_update_users_label (IndicatorSession* self,
+ GVariant * variant);
static void service_connection_cb (IndicatorServiceManager * sm, gboolean connected, gpointer user_data);
-static gboolean build_restart_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client, gpointer user_data);
static void receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name, GVariant * parameters, gpointer user_data);
static void service_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data);
@@ -90,10 +101,11 @@ static void indicator_session_class_init (IndicatorSessionClass *klass);
static void indicator_session_init (IndicatorSession *self);
static void indicator_session_dispose (GObject *object);
static void indicator_session_finalize (GObject *object);
+static GList* indicator_session_get_entries (IndicatorObject* obj);
G_DEFINE_TYPE (IndicatorSession, indicator_session, INDICATOR_OBJECT_TYPE);
-static void
+static void
indicator_session_class_init (IndicatorSessionClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -102,81 +114,71 @@ indicator_session_class_init (IndicatorSessionClass *klass)
object_class->finalize = indicator_session_finalize;
IndicatorObjectClass * io_class = INDICATOR_OBJECT_CLASS(klass);
- io_class->get_label = get_label;
- io_class->get_image = get_icon;
- io_class->get_menu = get_menu;
- io_class->get_accessible_desc = get_accessible_desc;
-
+ io_class->get_entries = indicator_session_get_entries;
return;
}
static void
indicator_session_init (IndicatorSession *self)
{
- /* Set good defaults */
self->service = NULL;
self->service_proxy_cancel = NULL;
self->service_proxy = NULL;
-
+
/* Now let's fire these guys up. */
- self->service = indicator_service_manager_new_version(INDICATOR_SESSION_DBUS_NAME, INDICATOR_SESSION_DBUS_VERSION);
- g_signal_connect(G_OBJECT(self->service), INDICATOR_SERVICE_MANAGER_SIGNAL_CONNECTION_CHANGE, G_CALLBACK(service_connection_cb), self);
-
- self->status_image = indicator_image_helper(ICON_DEFAULT);
- self->menu = dbusmenu_gtkmenu_new(INDICATOR_SESSION_DBUS_NAME, INDICATOR_SESSION_DBUS_OBJECT);
-
- DbusmenuClient * client = DBUSMENU_CLIENT(dbusmenu_gtkmenu_get_client(self->menu));
- dbusmenu_client_add_type_handler(client, MENU_SWITCH_TYPE, build_menu_switch);
- dbusmenu_client_add_type_handler(client, USER_ITEM_TYPE, new_user_item);
- dbusmenu_client_add_type_handler(client, RESTART_ITEM_TYPE, build_restart_item);
-
+ self->service = indicator_service_manager_new_version(INDICATOR_SESSION_DBUS_NAME,
+ INDICATOR_SESSION_DBUS_VERSION);
+ g_signal_connect(G_OBJECT(self->service),
+ INDICATOR_SERVICE_MANAGER_SIGNAL_CONNECTION_CHANGE,
+ G_CALLBACK(service_connection_cb), self);
+ // users
+ self->users.menu = GTK_MENU (dbusmenu_gtkmenu_new (INDICATOR_USERS_DBUS_NAME,
+ INDICATOR_USERS_DBUS_OBJECT));
+ self->users.image = indicator_image_helper (USER_ITEM_ICON_DEFAULT);
+ self->users.label = GTK_LABEL (gtk_label_new (NULL));
+ // Only show once we have a valid username
+ gtk_widget_hide (GTK_WIDGET(self->users.label));
+
+ // devices
+ self->devices.menu = GTK_MENU (dbusmenu_gtkmenu_new(INDICATOR_SESSION_DBUS_NAME,
+ INDICATOR_SESSION_DBUS_OBJECT));
+ self->devices.image = indicator_image_helper (ICON_DEFAULT);
+
+ gtk_widget_show (GTK_WIDGET(self->devices.menu));
+ gtk_widget_show (GTK_WIDGET(self->devices.image));
+ gtk_widget_show (GTK_WIDGET(self->users.image));
+ gtk_widget_show (GTK_WIDGET(self->users.menu));
+
+ g_object_ref (self->users.menu);
+ g_object_ref (self->users.image);
+ g_object_ref (self->devices.menu);
+ g_object_ref (self->devices.image);
+
+ // 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);
+
+ // Setup the handlers for devices
+ DbusmenuClient * devices_client = DBUSMENU_CLIENT(dbusmenu_gtkmenu_get_client(DBUSMENU_GTKMENU(self->devices.menu)));
+ dbusmenu_client_add_type_handler (devices_client,
+ RESTART_ITEM_TYPE,
+ build_restart_item);
+
GtkAccelGroup * agroup = gtk_accel_group_new();
- dbusmenu_gtkclient_set_accel_group(DBUSMENU_GTKCLIENT(client), agroup);
+ dbusmenu_gtkclient_set_accel_group(DBUSMENU_GTKCLIENT(devices_client), agroup);
self->service_proxy_cancel = g_cancellable_new();
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
- G_DBUS_PROXY_FLAGS_NONE,
- NULL,
- INDICATOR_SESSION_DBUS_NAME,
- INDICATOR_SESSION_SERVICE_DBUS_OBJECT,
- INDICATOR_SESSION_SERVICE_DBUS_IFACE,
- self->service_proxy_cancel,
- service_proxy_cb,
- self);
-
- return;
-}
-
-/* Callback from trying to create the proxy for the serivce, this
- could include starting the service. Sometime it'll fail and
- we'll try to start that dang service again! */
-static void
-service_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data)
-{
- GError * error = NULL;
-
- IndicatorSession * self = INDICATOR_SESSION(user_data);
- g_return_if_fail(self != NULL);
-
- GDBusProxy * proxy = g_dbus_proxy_new_for_bus_finish(res, &error);
-
- if (self->service_proxy_cancel != NULL) {
- g_object_unref(self->service_proxy_cancel);
- self->service_proxy_cancel = NULL;
- }
-
- if (error != NULL) {
- g_warning("Could not grab DBus proxy for %s: %s", INDICATOR_SESSION_DBUS_NAME, error->message);
- g_error_free(error);
- return;
- }
-
- /* Okay, we're good to grab the proxy at this point, we're
- sure that it's ours. */
- self->service_proxy = proxy;
-
- g_signal_connect(proxy, "g-signal", G_CALLBACK(receive_signal), self);
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ INDICATOR_SESSION_DBUS_NAME,
+ INDICATOR_SESSION_SERVICE_DBUS_OBJECT,
+ INDICATOR_SESSION_SERVICE_DBUS_IFACE,
+ self->service_proxy_cancel,
+ service_proxy_cb,
+ self);
return;
}
@@ -201,6 +203,14 @@ indicator_session_dispose (GObject *object)
g_object_unref(self->service_proxy_cancel);
self->service_proxy_cancel = NULL;
}
+
+ if (self->users.menu != NULL) {
+ g_object_unref (self->users.menu);
+ }
+
+ if (self->devices.menu != NULL) {
+ g_object_unref (self->devices.menu);
+ }
G_OBJECT_CLASS (indicator_session_parent_class)->dispose (object);
return;
@@ -214,105 +224,65 @@ indicator_session_finalize (GObject *object)
return;
}
+/* Callback from trying to create the proxy for the service, this
+ could include starting the service. Sometime it'll fail and
+ we'll try to start that dang service again! */
static void
-icon_name_get_cb (GObject * obj, GAsyncResult * res, gpointer user_data)
+service_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data)
{
- IndicatorSession * self = INDICATOR_SESSION(user_data);
GError * error = NULL;
- gchar * name;
- GVariant * result;
- result = g_dbus_proxy_call_finish(self->service_proxy, res, &error);
+ IndicatorSession * self = INDICATOR_SESSION(user_data);
+ g_return_if_fail(self != NULL);
- if (error != NULL) {
- return;
- }
+ GDBusProxy * proxy = g_dbus_proxy_new_for_bus_finish(res, &error);
- g_variant_get(result, "(&s)", &name);
+ if (self->service_proxy_cancel != NULL) {
+ g_object_unref(self->service_proxy_cancel);
+ self->service_proxy_cancel = NULL;
+ }
- if (name == NULL || name[0] == '\0') {
+ if (error != NULL) {
+ g_warning("Could not grab DBus proxy for %s: %s", INDICATOR_SESSION_DBUS_NAME, error->message);
+ g_error_free(error);
return;
}
- indicator_image_helper_update(self->status_image, name);
- return;
-}
-
-static void
-service_connection_cb (IndicatorServiceManager * sm, gboolean connected, gpointer user_data)
-{
- IndicatorSession * self = INDICATOR_SESSION(user_data);
+ /* Okay, we're good to grab the proxy at this point, we're
+ sure that it's ours. */
+ self->service_proxy = proxy;
- if (connected) {
- g_dbus_proxy_call(self->service_proxy, "GetIcon", NULL,
- G_DBUS_CALL_FLAGS_NONE, -1, NULL,
- icon_name_get_cb, user_data);
- } else {
- indicator_image_helper_update(self->status_image, ICON_DEFAULT);
- }
+ g_signal_connect(proxy, "g-signal", G_CALLBACK(receive_signal), self);
return;
}
-static GtkLabel *
-get_label (IndicatorObject * io)
-{
- return NULL;
-}
-static const gchar *
-get_accessible_desc (IndicatorObject * io)
+static GList*
+indicator_session_get_entries (IndicatorObject* obj)
{
- return _("Session");
-}
+ g_return_val_if_fail(IS_INDICATOR_SESSION(obj), NULL);
+ IndicatorSession* self = INDICATOR_SESSION (obj);
+
+ GList * retval = NULL;
-static void
-icon_changed (IndicatorSession * session, const gchar * icon_name)
-{
- indicator_image_helper_update(session->status_image, icon_name);
- return;
-}
+ retval = g_list_prepend (retval, &self->users);
+ retval = g_list_prepend (retval, &self->devices);
-/* Receives all signals from the service, routed to the appropriate functions */
-static void
-receive_signal (GDBusProxy * proxy, gchar * sender_name, gchar * signal_name,
- GVariant * parameters, gpointer user_data)
-{
- IndicatorSession * self = INDICATOR_SESSION(user_data);
-
- if (g_strcmp0(signal_name, "IconUpdated") == 0) {
- const gchar *name;
- g_variant_get (parameters, "(&s)", &name);
- icon_changed(self, name);
+ if (retval != NULL) {
+ retval = g_list_reverse(retval);
}
-
- return;
-}
-
-static GtkImage *
-get_icon (IndicatorObject * io)
-{
- gtk_widget_show(GTK_WIDGET(INDICATOR_SESSION(io)->status_image));
- return INDICATOR_SESSION(io)->status_image;
-}
-
-static void
-user_property_change (DbusmenuMenuitem * item, const gchar * property, GVariant * variant, gpointer user_data)
-{
- if (g_strcmp0(property, USER_ITEM_PROP_LOGGED_IN) == 0) {
- if (g_variant_get_boolean(variant)) {
- gtk_widget_show(GTK_WIDGET(user_data));
- } else {
- gtk_widget_hide(GTK_WIDGET(user_data));
- }
- }
- return;
+ return retval;
}
/* Builds an item with a hip little logged in icon. */
static gboolean
-new_user_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client, gpointer user_data)
+new_user_item (DbusmenuMenuitem * newitem,
+ DbusmenuMenuitem * parent,
+ DbusmenuClient * client,
+ gpointer user_data)
{
+ g_debug ("new user item called ");
GtkMenuItem * gmi = GTK_MENU_ITEM(gtk_menu_item_new());
gint padding = 0;
gtk_widget_style_get(GTK_WIDGET(gmi), "horizontal-padding", &padding, NULL);
@@ -369,101 +339,178 @@ new_user_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuCl
dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, gmi, parent);
- g_signal_connect(G_OBJECT(newitem), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(user_property_change), icon);
+ g_signal_connect (G_OBJECT(newitem),
+ DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED,
+ G_CALLBACK(user_property_change), icon);
return TRUE;
}
-/* Indicator based function to get the menu for the whole
- applet. This starts up asking for the parts of the menu
- from the various services. */
-static GtkMenu *
-get_menu (IndicatorObject * io)
+static void
+user_property_change (DbusmenuMenuitem * item,
+ const gchar * property,
+ GVariant * variant,
+ gpointer user_data)
{
- return GTK_MENU(INDICATOR_SESSION(io)->menu);
+ if (g_strcmp0(property, USER_ITEM_PROP_LOGGED_IN) == 0) {
+ if (g_variant_get_boolean(variant)) {
+ gtk_widget_show(GTK_WIDGET(user_data));
+ } else {
+ gtk_widget_hide(GTK_WIDGET(user_data));
+ }
+ }
+ return;
}
static void
-switch_property_change (DbusmenuMenuitem * item, const gchar * property, GVariant * variant, gpointer user_data)
+icon_name_get_cb (GObject * obj, GAsyncResult * res, gpointer user_data)
{
- if (g_strcmp0(property, MENU_SWITCH_USER) != 0) {
+ IndicatorSession * self = INDICATOR_SESSION(user_data);
+ GError * error = NULL;
+ gchar * name;
+ GVariant * result;
+
+ result = g_dbus_proxy_call_finish(self->service_proxy, res, &error);
+
+ if (error != NULL) {
return;
}
-
- GtkMenuItem * gmi = dbusmenu_gtkclient_menuitem_get(DBUSMENU_GTKCLIENT(user_data), item);
- gchar * finalstring = NULL;
- gboolean set_ellipsize = FALSE;
- gboolean no_name_in_lang = FALSE;
-
- /* TRANSLATORS: Translate the '1' below into anything other than
- '1' if "Switch From %s..." doesn't make sense in your language.
- Instead, the string "Switch User..." will be used. */
- const gchar * translate = C_("session_menu:switchfrom", "1");
- if (g_strcmp0(translate, "1") != 0) {
- no_name_in_lang = TRUE;
- }
- /* If there's a NULL string of some type, then we want to
- go back to our old 'Switch User' which isn't great but
- eh, this error condition should never happen. */
- 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;
- }
+ g_variant_get(result, "(&s)", &name);
- if (finalstring == NULL) {
- const gchar * username = g_variant_get_string(variant, NULL);
- GtkStyle * style = gtk_widget_get_style(GTK_WIDGET(gmi));
+ if (name == NULL || name[0] == '\0') {
+ return;
+ }
- PangoLayout * layout = pango_layout_new(gtk_widget_get_pango_context(GTK_WIDGET(gmi)));
- pango_layout_set_text(layout, username, -1);
- pango_layout_set_font_description(layout, style->font_desc);
+ indicator_image_helper_update(self->users.image, name);
+ return;
+}
- gint width;
- pango_layout_get_pixel_size(layout, &width, NULL);
- g_object_unref(layout);
- g_debug("Username width %dpx", width);
+static void
+service_connection_cb (IndicatorServiceManager * sm, gboolean connected, gpointer user_data)
+{
+ IndicatorSession * self = INDICATOR_SESSION (user_data);
- gint point = pango_font_description_get_size(style->font_desc);
- g_debug("Font size %f pt", (gfloat)point / PANGO_SCALE);
+ if (connected) {
+ g_dbus_proxy_call(self->service_proxy, "GetIcon", NULL,
+ G_DBUS_CALL_FLAGS_NONE, -1, NULL,
+ icon_name_get_cb, user_data);
+ }
+ else {
+ indicator_image_helper_update (self->users.image,
+ USER_ITEM_ICON_DEFAULT);
+ }
+ return;
+}
- gdouble dpi = gdk_screen_get_resolution(gdk_screen_get_default());
- g_debug("Screen DPI %f", dpi);
+static void
+icon_changed (IndicatorSession * session, const gchar * icon_name)
+{
+ indicator_image_helper_update(session->users.image, icon_name);
+ return;
+}
- gdouble pixels_per_em = ((point * dpi) / 72.0f) / PANGO_SCALE;
- gdouble ems = width / pixels_per_em;
- g_debug("Username width %fem", ems);
+/* Receives all signals from the service, routed to the appropriate functions */
+static void
+receive_signal (GDBusProxy * proxy,
+ gchar * sender_name,
+ gchar * signal_name,
+ GVariant * parameters,
+ gpointer user_data)
+{
+ IndicatorSession * self = INDICATOR_SESSION(user_data);
- /* TODO: We need some way to remove the elipsis from appearing
- twice in the label. Not sure how to do that yet. */
- finalstring = g_strdup_printf(_("Switch From %s..."), username);
- if (ems >= 20.0f) {
- set_ellipsize = TRUE;
- } else {
- set_ellipsize = FALSE;
- }
+ if (g_strcmp0(signal_name, "IconUpdated") == 0) {
+ const gchar *name;
+ g_variant_get (parameters, "(&s)", &name);
+ icon_changed(self, name);
}
+ return;
+}
- gtk_menu_item_set_label(gmi, finalstring);
-
- GtkLabel * label = GTK_LABEL(gtk_bin_get_child(GTK_BIN(gmi)));
- if (label != NULL) {
- if (set_ellipsize) {
- gtk_label_set_ellipsize(label, PANGO_ELLIPSIZE_END);
- } else {
- gtk_label_set_ellipsize(label, PANGO_ELLIPSIZE_NONE);
- }
- }
+static void
+switch_property_change (DbusmenuMenuitem * item,
+ const gchar * property,
+ GVariant * variant,
+ gpointer user_data)
+{
+ if (g_strcmp0 (property, MENU_SWITCH_USER) != 0) {
+ return;
+ }
+
+ GtkMenuItem * gmi = dbusmenu_gtkclient_menuitem_get(DBUSMENU_GTKCLIENT(user_data), item);
+ gchar * finalstring = NULL;
+ gboolean set_ellipsize = FALSE;
+ gboolean no_name_in_lang = FALSE;
+
+ const gchar * translate = C_("session_menu:switchfrom", "1");
+ if (g_strcmp0(translate, "1") != 0) {
+ 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) {
+ finalstring = _("Switch User...");
+ set_ellipsize = FALSE;
+ indicator_session_update_users_label (INDICATOR_SESSION (user_data),
+ NULL);
+ }
+ else{
+ indicator_session_update_users_label (INDICATOR_SESSION (user_data),
+ variant);
+ }
+
+ if (finalstring == NULL) {
+ const gchar * username = g_variant_get_string(variant, NULL);
+ GtkStyle * style = gtk_widget_get_style(GTK_WIDGET(gmi));
+
+ PangoLayout * layout = pango_layout_new(gtk_widget_get_pango_context(GTK_WIDGET(gmi)));
+ pango_layout_set_text (layout, username, -1);
+ pango_layout_set_font_description(layout, style->font_desc);
+
+ gint width;
+ pango_layout_get_pixel_size(layout, &width, NULL);
+ g_object_unref(layout);
+ g_debug("Username width %dpx", width);
+
+ gint point = pango_font_description_get_size(style->font_desc);
+ g_debug("Font size %f pt", (gfloat)point / PANGO_SCALE);
+
+ gdouble dpi = gdk_screen_get_resolution(gdk_screen_get_default());
+ g_debug("Screen DPI %f", dpi);
+
+ gdouble pixels_per_em = ((point * dpi) / 72.0f) / PANGO_SCALE;
+ gdouble ems = width / pixels_per_em;
+ g_debug("Username width %fem", ems);
+
+ finalstring = g_strdup_printf(_("Switch From %s..."), username);
+ if (ems >= 20.0f) {
+ set_ellipsize = TRUE;
+ } else {
+ set_ellipsize = FALSE;
+ }
+
+ }
+ gtk_menu_item_set_label(gmi, finalstring);
+
+ GtkLabel * label = GTK_LABEL(gtk_bin_get_child(GTK_BIN(gmi)));
+ if (label != NULL) {
+ if (set_ellipsize) {
+ gtk_label_set_ellipsize(label, PANGO_ELLIPSIZE_END);
+ } else {
+ gtk_label_set_ellipsize(label, PANGO_ELLIPSIZE_NONE);
+ }
+ }
return;
}
static const gchar * dbusmenu_item_data = "dbusmenu-item";
-/* IF the label or icon changes we need to grab that and update
- the menu item */
static void
-restart_property_change (DbusmenuMenuitem * item, const gchar * property, GVariant * variant, gpointer user_data)
+restart_property_change (DbusmenuMenuitem * item,
+ const gchar * property,
+ GVariant * variant,
+ gpointer user_data)
{
DbusmenuGtkClient * client = DBUSMENU_GTKCLIENT(user_data);
GtkMenuItem * gmi = dbusmenu_gtkclient_menuitem_get(client, item);
@@ -482,14 +529,14 @@ restart_property_change (DbusmenuMenuitem * item, const gchar * property, GVaria
}
g_object_unref(G_OBJECT(gicon));
}
-
return;
}
-/* Builds the restart item which is a more traditional GTK image
- menu item that puts the graphic into the gutter. */
static gboolean
-build_restart_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client, gpointer user_data)
+build_restart_item (DbusmenuMenuitem * newitem,
+ DbusmenuMenuitem * parent,
+ DbusmenuClient * client,
+ gpointer user_data)
{
GtkMenuItem * gmi = GTK_MENU_ITEM(gtk_image_menu_item_new());
if (gmi == NULL) {
@@ -500,7 +547,6 @@ build_restart_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusm
g_signal_connect(G_OBJECT(newitem), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(restart_property_change), client);
- /* Grab the inital variants and put them into the item */
GVariant * variant;
variant = dbusmenu_menuitem_property_get_variant(newitem, RESTART_ITEM_LABEL);
if (variant != NULL) {
@@ -515,36 +561,80 @@ build_restart_item (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, Dbusm
return TRUE;
}
-
-/* Callback for when the style changes so we can reevaluate the
- size of the user name with the potentially new font. */
static void
-switch_style_set (GtkWidget * widget, GtkStyle * prev_style, gpointer user_data)
+switch_style_set (GtkWidget * widget,
+ GtkStyle * prev_style,
+ gpointer user_data)
{
DbusmenuGtkClient * client = DBUSMENU_GTKCLIENT(user_data);
- DbusmenuMenuitem * mi = DBUSMENU_MENUITEM(g_object_get_data(G_OBJECT(widget), dbusmenu_item_data));
+ DbusmenuMenuitem * mi = DBUSMENU_MENUITEM(g_object_get_data(G_OBJECT(widget),
+ dbusmenu_item_data));
- switch_property_change(mi, MENU_SWITCH_USER, dbusmenu_menuitem_property_get_variant(mi, MENU_SWITCH_USER), client);
+ switch_property_change (mi,
+ MENU_SWITCH_USER,
+ dbusmenu_menuitem_property_get_variant(mi, MENU_SWITCH_USER),
+ client);
return;
}
-/* This function checks to see if the user name is short enough
- to not need ellipsing itself, or if, it will get ellipsed by
- the standard label processor. */
static gboolean
-build_menu_switch (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client, gpointer user_data)
+build_menu_switch (DbusmenuMenuitem * newitem,
+ DbusmenuMenuitem * parent,
+ DbusmenuClient * client,
+ gpointer user_data)
{
GtkMenuItem * gmi = GTK_MENU_ITEM(gtk_menu_item_new());
if (gmi == NULL) {
return FALSE;
}
- g_object_set_data(G_OBJECT(gmi), dbusmenu_item_data, newitem);
+
+ IndicatorSession* self = INDICATOR_SESSION (user_data);
+
+ g_object_set_data(G_OBJECT(gmi), dbusmenu_item_data, newitem);
dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, gmi, parent);
- g_signal_connect(G_OBJECT(newitem), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(switch_property_change), client);
- g_signal_connect(G_OBJECT(gmi), "style-set", G_CALLBACK(switch_style_set), client);
- switch_property_change(newitem, MENU_SWITCH_USER, dbusmenu_menuitem_property_get_variant(newitem, MENU_SWITCH_USER), client);
+ g_signal_connect (G_OBJECT(newitem),
+ DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED,
+ G_CALLBACK(switch_property_change),
+ client);
+ g_signal_connect (G_OBJECT(gmi),
+ "style-set",
+ G_CALLBACK(switch_style_set),
+ client);
+
+ switch_property_change (newitem,
+ MENU_SWITCH_USER,
+ dbusmenu_menuitem_property_get_variant(newitem, MENU_SWITCH_USER), client);
+
+ indicator_session_update_users_label (self,
+ dbusmenu_menuitem_property_get_variant(newitem, MENU_SWITCH_USER));
+
+ return TRUE;
+}
- return TRUE;
+static void
+indicator_session_update_users_label (IndicatorSession* self,
+ GVariant * variant)
+{
+ const gchar* username = NULL;
+ if (variant == NULL || g_variant_get_string(variant, NULL) == NULL ||
+ g_variant_get_string(variant, NULL)[0] == '\0'){
+ // either way set the user label to blank
+ gtk_label_set_text (self->users.label, "");
+ return;
+ }
+
+ username = g_variant_get_string(variant, NULL);
+
+ // Just in case protect again.
+ if (username != NULL) {
+ g_debug ("Updating username label ");
+ gtk_label_set_text (self->users.label, username);
+ gtk_widget_show(GTK_WIDGET(self->users.label));
+ }
+ else {
+ gtk_widget_hide(GTK_WIDGET(self->users.label));
+ }
}
+