← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~cjcurran/indicator-session/guest-item into lp:indicator-session

 

Conor Curran has proposed merging lp:~cjcurran/indicator-session/guest-item into lp:indicator-session.

Requested reviews:
  Indicator Applet Developers (indicator-applet-developers)
Related bugs:
  Bug #811852 in Session Menu: "Top-right bar shows "nvalid UTF-8]""
  https://bugs.launchpad.net/indicator-session/+bug/811852
  Bug #827909 in Session Menu: "guest item in user menu"
  https://bugs.launchpad.net/indicator-session/+bug/827909
  Bug #827932 in Session Menu: "user menu shows all users with active sessions"
  https://bugs.launchpad.net/indicator-session/+bug/827932

For more details, see:
https://code.launchpad.net/~cjcurran/indicator-session/guest-item/+merge/72044
-- 
https://code.launchpad.net/~cjcurran/indicator-session/guest-item/+merge/72044
Your team ayatana-commits is subscribed to branch lp:indicator-session.
=== modified file 'src/Makefile.am'
--- src/Makefile.am	2011-07-26 17:23:59 +0000
+++ src/Makefile.am	2011-08-18 14:16:41 +0000
@@ -25,19 +25,26 @@
 libsession_la_LIBADD = $(APPLET_LIBS)
 libsession_la_LDFLAGS = -module -avoid-version
 
-consolekit-manager-client.h: $(srcdir)/consolekit-manager.xml
+consolekit-manager-client.h: $(srcdir)/org.freedesktop.ConsoleKit.Manager.xml
 	dbus-binding-tool \
 		--prefix=_consolekit_manager_client \
 		--mode=glib-client \
 		--output=consolekit-manager-client.h \
-		$(srcdir)/consolekit-manager.xml
-
-consolekit-session-client.h: $(srcdir)/consolekit-session.xml
+		$(srcdir)/org.freedesktop.ConsoleKit.Manager.xml
+
+consolekit-seat-client.h: $(srcdir)/org.freedesktop.ConsoleKit.Seat.xml
+	dbus-binding-tool \
+		--prefix=_consolekit_seat_client \
+		--mode=glib-client \
+		--output=consolekit-seat-client.h \
+		$(srcdir)/org.freedesktop.ConsoleKit.Seat.xml
+
+consolekit-session-client.h: $(srcdir)/org.freedesktop.ConsoleKit.Session.xml
 	dbus-binding-tool \
 		--prefix=_consolekit_session_client \
 		--mode=glib-client \
 		--output=consolekit-session-client.h \
-		$(srcdir)/consolekit-session.xml
+		$(srcdir)/org.freedesktop.ConsoleKit.Session.xml
 
 display-manager-client.h: $(srcdir)/display-manager.xml
 	dbus-binding-tool \
@@ -143,6 +150,7 @@
 
 BUILT_SOURCES = \
 	consolekit-manager-client.h \
+	consolekit-seat-client.h \
 	consolekit-session-client.h \
 	display-manager-client.h \
 	gen-session-dbus.xml.c \
@@ -152,8 +160,9 @@
 	accounts-service-user-client.h
 
 EXTRA_DIST = \
-	consolekit-manager.xml \
-	consolekit-session.xml \
+	org.freedesktop.ConsoleKit.Manager.xml \
+	org.freedesktop.ConsoleKit.Seat.xml \
+	org.freedesktop.ConsoleKit.Session.xml \
 	display-manager.xml \
 	session-dbus.xml \
 	upower.xml \

=== modified file 'src/lock-helper.c'
--- src/lock-helper.c	2010-08-06 15:57:11 +0000
+++ src/lock-helper.c	2011-08-18 14:16:41 +0000
@@ -20,12 +20,12 @@
 */
 
 #include <glib/gi18n.h>
-#include <gconf/gconf-client.h>
+#include <gio/gio.h>
 #include <dbus/dbus-glib.h>
 #include "lock-helper.h"
 
-#define GCONF_DIR  "/apps/gnome-screensaver"
-#define GCONF_KEY  GCONF_DIR "/lock_enabled"
+#define SCREENSAVER_SCHEMA            "org.gnome.desktop.screensaver"
+#define SCREENSAVER_LOCK_ENABLED_KEY  "lock-enabled"
 
 static DBusGProxy * gss_proxy = NULL;
 static GMainLoop * gss_mainloop = NULL;
@@ -34,7 +34,7 @@
 
 static gboolean is_guest = FALSE;
 
-static GConfClient * gconf_client = NULL;
+static GSettings * settings = NULL;
 
 void build_gss_proxy (void);
 
@@ -131,11 +131,11 @@
 		return FALSE;
 	}
 
-	if (gconf_client == NULL) {
-		gconf_client = gconf_client_get_default();
+	if (settings == NULL) {
+		settings = g_settings_new (SCREENSAVER_SCHEMA);
 	}
 
-	return gconf_client_get_bool (gconf_client, GCONF_KEY, NULL);
+	return g_settings_get_boolean (settings, SCREENSAVER_LOCK_ENABLED_KEY);
 }
 
 /* When the screensave go active, if we've got a mainloop
@@ -150,11 +150,22 @@
 	return;
 }
 
+static gboolean
+get_greeter_mode (void)
+{
+	const gchar *var;
+	var = g_getenv("INDICATOR_GREETER_MODE");
+	return (g_strcmp0(var, "1") == 0);
+}
+
 /* Build the gss proxy and set up it's signals */
 void
 build_gss_proxy (void)
 {
 	if (gss_proxy == NULL) {
+		if (get_greeter_mode ())
+			return; /* Don't start/lock the screensaver from the login screen */
+
 		DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, NULL);
 		g_return_if_fail(session_bus != NULL);
 

=== renamed file 'src/consolekit-manager.xml' => 'src/org.freedesktop.ConsoleKit.Manager.xml'
=== added file 'src/org.freedesktop.ConsoleKit.Seat.xml'
--- src/org.freedesktop.ConsoleKit.Seat.xml	1970-01-01 00:00:00 +0000
+++ src/org.freedesktop.ConsoleKit.Seat.xml	2011-08-18 14:16:41 +0000
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<node xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd";>
+
+  <interface name="org.freedesktop.ConsoleKit.Seat">
+    <doc:doc>
+      <doc:description>
+        <doc:para>A seat is a collection of sessions and a set of hardware (usually at
+least a keyboard and mouse).  Only one session may be active on a
+seat at a time.</doc:para>
+      </doc:description>
+    </doc:doc>
+
+    <method name="GetId">
+      <arg name="sid" direction="out" type="o">
+        <doc:doc>
+          <doc:summary>Seat ID</doc:summary>
+        </doc:doc>
+      </arg>
+      <doc:doc>
+        <doc:description>
+          <doc:para>Returns the ID for Seat.</doc:para>
+        </doc:description>
+      </doc:doc>
+    </method>
+
+    <method name="GetSessions">
+      <arg name="sessions" direction="out" type="ao">
+        <doc:doc>
+          <doc:summary>an array of Session IDs</doc:summary>
+        </doc:doc>
+      </arg>
+      <doc:doc>
+        <doc:description>
+          <doc:para>This gets a list of all the <doc:ref type="interface" to="Session">Sessions</doc:ref>
+          that are currently attached to this seat.</doc:para>
+          <doc:para>Each Session ID is an D-Bus object path for the object that implements the
+          <doc:ref type="interface" to="Session">Session</doc:ref> interface.</doc:para>
+        </doc:description>
+      </doc:doc>
+    </method>
+
+    <method name="GetDevices">
+      <arg name="devices" direction="out" type="a(ss)">
+        <doc:doc>
+          <doc:summary>an array of devices</doc:summary>
+        </doc:doc>
+      </arg>
+      <doc:doc>
+        <doc:description>
+          <doc:para>This gets a list of all the devices
+          that are currently associated with this seat.</doc:para>
+          <doc:para>Each device is an D-Bus structure that represents
+          the device type and the device id.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+    </method>
+
+    <method name="GetActiveSession">
+      <arg name="ssid" direction="out" type="o">
+        <doc:doc>
+          <doc:summary>Session ID</doc:summary>
+        </doc:doc>
+      </arg>
+      <doc:doc>
+        <doc:description>
+          <doc:para>Gets the Session ID that is currently active on this Seat.</doc:para>
+          <doc:para>Returns NULL if there is no active session.</doc:para>
+        </doc:description>
+      </doc:doc>
+    </method>
+
+    <method name="CanActivateSessions">
+      <arg name="can_activate" direction="out" type="b">
+        <doc:doc>
+          <doc:summary>TRUE if seat supports session activation</doc:summary>
+        </doc:doc>
+      </arg>
+      <doc:doc>
+        <doc:description><doc:para>Used to determine whether the seat supports session activation.</doc:para>
+        </doc:description>
+      </doc:doc>
+    </method>
+
+    <method name="ActivateSession">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg name="ssid" direction="in" type="o">
+        <doc:doc>
+          <doc:summary>Session ID</doc:summary>
+        </doc:doc>
+      </arg>
+      <doc:doc>
+        <doc:description>
+          <doc:para>Attempt to activate the specified session.  In most
+          cases, if successful, this will cause the session to
+          become visible and take control of the hardware that is
+          associated with this seat.</doc:para>
+        </doc:description>
+        <doc:seealso><doc:ref type="method" to="Session.Activate">Activate()</doc:ref></doc:seealso>
+      </doc:doc>
+    </method>
+
+    <signal name="ActiveSessionChanged">
+      <arg name="ssid" type="o">
+        <doc:doc>
+          <doc:summary>Session ID</doc:summary>
+        </doc:doc>
+      </arg>
+      <doc:doc>
+        <doc:description>
+          <doc:para>Emitted when the active session has changed.</doc:para>
+        </doc:description>
+      </doc:doc>
+    </signal>
+    <signal name="SessionAdded">
+      <arg name="ssid" type="o">
+        <doc:doc>
+          <doc:summary>Session ID</doc:summary>
+        </doc:doc>
+      </arg>
+      <doc:doc>
+        <doc:description>
+          <doc:para>Emitted when a session has been added to the seat.</doc:para>
+        </doc:description>
+      </doc:doc>
+    </signal>
+    <signal name="SessionRemoved">
+      <arg name="ssid" type="o">
+        <doc:doc>
+          <doc:summary>Session ID</doc:summary>
+        </doc:doc>
+      </arg>
+      <doc:doc>
+        <doc:description>
+          <doc:para>Emitted when a session has been removed from the seat.</doc:para>
+        </doc:description>
+      </doc:doc>
+    </signal>
+    <signal name="DeviceAdded">
+      <arg name="device" type="(ss)">
+        <doc:doc>
+          <doc:summary>Device structure</doc:summary>
+        </doc:doc>
+      </arg>
+      <doc:doc>
+        <doc:description>
+          <doc:para>Emitted when a device has been associated with the seat.</doc:para>
+        </doc:description>
+      </doc:doc>
+    </signal>
+    <signal name="DeviceRemoved">
+      <arg name="device" type="(ss)">
+        <doc:doc>
+          <doc:summary>Device structure</doc:summary>
+        </doc:doc>
+      </arg>
+      <doc:doc>
+        <doc:description>
+          <doc:para>Emitted when a device has been dissociated from the seat.</doc:para>
+        </doc:description>
+      </doc:doc>
+    </signal>
+  </interface>
+</node>

=== renamed file 'src/consolekit-session.xml' => 'src/org.freedesktop.ConsoleKit.Session.xml'
=== modified file 'src/session-service.c'
--- src/session-service.c	2011-08-03 15:31:25 +0000
+++ src/session-service.c	2011-08-18 14:16:41 +0000
@@ -118,7 +118,7 @@
     
   if (!greeter_mode) {
     // Users
-    UserMenuMgr* user_mgr = user_menu_mgr_new (session_dbus);    
+    UserMenuMgr* user_mgr = user_menu_mgr_new (session_dbus, greeter_mode);    
     DbusmenuServer* users_server = dbusmenu_server_new (INDICATOR_USERS_DBUS_OBJECT);
     dbusmenu_server_set_root (users_server, user_mgr_get_root_item (user_mgr));
   }

=== modified file 'src/udev-mgr.c'
--- src/udev-mgr.c	2011-08-09 11:35:18 +0000
+++ src/udev-mgr.c	2011-08-18 14:16:41 +0000
@@ -254,7 +254,7 @@
               GUdevDevice* device,
               UdevMgrDeviceAction action)
 {
-  const gchar* vendor;
+  /*const gchar* vendor;
   const gchar* product;
   const gchar* number;
   const gchar* name;
@@ -269,7 +269,7 @@
            g_strdup(product),
            g_strdup(number),
            g_strdup(name));
-           
+         
   const gchar *const *list;
   const gchar *const *iter;  
   char propstr[500];
@@ -290,7 +290,7 @@
            strcat(propstr, " ");
     strcat(propstr, g_udev_device_get_property(device, *iter));
     g_debug("%s", propstr);
-  }   
+  }*/  
 }
 
 static void udev_mgr_handle_scsi_device (UdevMgr* self,

=== modified file 'src/user-menu-mgr.c'
--- src/user-menu-mgr.c	2011-08-04 16:25:19 +0000
+++ src/user-menu-mgr.c	2011-08-18 14:16:41 +0000
@@ -49,13 +49,19 @@
 static void activate_online_accounts (DbusmenuMenuitem *mi,
                                       guint timestamp,
                                       gpointer user_data);
-static void user_menu_mgr_rebuild_items (UserMenuMgr *self);
+static void user_menu_mgr_rebuild_items (UserMenuMgr *self,
+                                         gboolean greeter_mode);
 static gboolean check_new_session ();
 static void user_change (UsersServiceDbus *service,
                          const gchar      *user_id,
                          gpointer          user_data);
 
 static void ensure_gconf_client ();
+static gboolean check_guest_session (void);
+static void activate_guest_session (DbusmenuMenuitem * mi,
+                                    guint timestamp,
+                                    gpointer user_data);
+
 
 G_DEFINE_TYPE (UserMenuMgr, user_menu_mgr, G_TYPE_OBJECT);
 
@@ -93,7 +99,7 @@
 
 /* Builds up the menu for us */
 static void 
-user_menu_mgr_rebuild_items (UserMenuMgr *self)
+user_menu_mgr_rebuild_items (UserMenuMgr *self, gboolean greeter_mode)
 {
   DbusmenuMenuitem *mi = NULL;
   DbusmenuMenuitem *guest_mi = NULL;
@@ -121,6 +127,7 @@
   /* Build all of the user switching items */
   if (can_activate == TRUE)
   {
+    
     if (check_new_session ()){
       switch_menuitem = dbusmenu_menuitem_new ();
       dbusmenu_menuitem_property_set (switch_menuitem,
@@ -134,14 +141,41 @@
                         DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
                         G_CALLBACK (activate_new_session),
                         self->users_dbus_interface);
+    }    
+    
+    if (check_guest_session ())
+    {
+      guest_mi = dbusmenu_menuitem_new ();
+      dbusmenu_menuitem_property_set (guest_mi,
+                                      DBUSMENU_MENUITEM_PROP_TYPE,
+                                      USER_ITEM_TYPE);
+      dbusmenu_menuitem_property_set (guest_mi,
+                                      USER_ITEM_PROP_NAME,
+                                      _("Guest Session"));
+      dbusmenu_menuitem_property_set_bool (guest_mi,
+                                           USER_ITEM_PROP_LOGGED_IN,
+                                           FALSE);
+      dbusmenu_menuitem_child_append (self->root_item, guest_mi);
+      g_signal_connect (G_OBJECT (guest_mi),
+                        DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
+                        G_CALLBACK (activate_guest_session),
+                        self);
+      users_service_dbus_set_guest_item (self->users_dbus_interface,
+                                         guest_mi);
     }
-
+    
     GList * users = NULL;
     users = users_service_dbus_get_user_list (self->users_dbus_interface);
     self->user_count = g_list_length(users);
     
-    g_debug ("USER COUNT = %i", self->user_count);
-    session_dbus_set_user_menu_visibility (self->session_dbus_interface, self->user_count > 1);
+    gboolean user_menu_is_visible = FALSE;
+    
+    if (!greeter_mode){
+      user_menu_is_visible = self->user_count > 1;
+    }
+    
+    session_dbus_set_user_menu_visibility (self->session_dbus_interface,
+                                           user_menu_is_visible);
 
     if (self->user_count > MINIMUM_USERS && self->user_count < MAXIMUM_USERS) {
       users = g_list_sort (users, (GCompareFunc)compare_users_by_username);
@@ -354,15 +388,43 @@
   return self->root_item;
 }
 
+/* Checks to see if we should show the guest suession item */
+static gboolean
+check_guest_session (void)
+{
+	if (geteuid() < 500) {
+		/* System users shouldn't have guest account shown.  Mosly
+		   this would be the case of the guest user itself. */
+		return FALSE;
+	}
+
+	return TRUE;
+}
+
+/* Called when someone clicks on the guest session item. */
+static void
+activate_guest_session (DbusmenuMenuitem * mi, guint timestamp, gpointer user_data)
+{
+  g_return_if_fail (USER_IS_MENU_MGR (user_data));  
+  UserMenuMgr* user_mgr = USER_MENU_MGR(user_data);  
+  UsersServiceDbus *service = user_mgr->users_dbus_interface;
+
+	lock_if_possible();
+  
+  if (users_service_dbus_activate_guest_session(service)) {
+    return;
+  }
+}
+
 
 /*
  * Clean Entry Point 
  */
-UserMenuMgr* user_menu_mgr_new (SessionDbus* session_dbus)
+UserMenuMgr* user_menu_mgr_new (SessionDbus* session_dbus, gboolean greeter_mode)
 {
   UserMenuMgr* user_mgr = g_object_new (USER_TYPE_MENU_MGR, NULL);
   user_mgr->session_dbus_interface = session_dbus;
-  user_menu_mgr_rebuild_items (user_mgr);    
+  user_menu_mgr_rebuild_items (user_mgr, greeter_mode);    
   return user_mgr;
 }
   

=== modified file 'src/user-menu-mgr.h'
--- src/user-menu-mgr.h	2011-07-18 11:19:38 +0000
+++ src/user-menu-mgr.h	2011-08-18 14:16:41 +0000
@@ -45,7 +45,8 @@
 };
 
 GType user_menu_mgr_get_type (void) G_GNUC_CONST;
-UserMenuMgr* user_menu_mgr_new (SessionDbus* session_dbus);
+UserMenuMgr* user_menu_mgr_new (SessionDbus* session_dbus,
+                                gboolean greeter_mode);
 
 DbusmenuMenuitem* user_mgr_get_root_item (UserMenuMgr* self);
 G_END_DECLS

=== modified file 'src/user-widget.c'
--- src/user-widget.c	2011-07-12 19:17:57 +0000
+++ src/user-widget.c	2011-08-18 14:16:41 +0000
@@ -126,8 +126,6 @@
 
   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);
@@ -151,6 +149,10 @@
   gtk_widget_show_all (priv->container);
   gtk_container_add (GTK_CONTAINER (self), priv->container);  
   
+  gtk_widget_show_all (priv->tick_icon);
+  gtk_widget_set_no_show_all (priv->tick_icon, TRUE);
+  gtk_widget_hide (priv->tick_icon);
+  
   // Fetch the drawing context.
   #if GTK_CHECK_VERSION(3, 0, 0) 
   g_signal_connect_after (GTK_WIDGET(self), "draw", 
@@ -178,11 +180,6 @@
   G_OBJECT_CLASS (user_widget_parent_class)->finalize (object);
 }
 
-/**
- * We override the expose method to enable primitive drawing of the 
- * empty album art image and rounded rectangles on the album art.
- */
-
 #if GTK_CHECK_VERSION(3, 0, 0)  
 
 // Draw the radio dot and/or green check mark
@@ -317,11 +314,16 @@
   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);
-	//}
+	if (dbusmenu_menuitem_property_get_bool (twin_item, USER_ITEM_PROP_LOGGED_IN)) {
+    g_debug ("%s USER HAS ACTIVE SESSIONS", 
+             dbusmenu_menuitem_property_get (twin_item, USER_ITEM_PROP_NAME));
+	  gtk_widget_show(priv->tick_icon);
+	}
+  else {
+    g_debug ("%s USER DOESN'T HAVE ACTIVE SESSIONS", 
+             dbusmenu_menuitem_property_get (twin_item, USER_ITEM_PROP_NAME));
+    gtk_widget_hide(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);

=== modified file 'src/users-service-dbus.c'
--- src/users-service-dbus.c	2011-07-28 16:41:59 +0000
+++ src/users-service-dbus.c	2011-08-18 14:16:41 +0000
@@ -36,6 +36,7 @@
 #include "accounts-service-client.h"
 #include "consolekit-manager-client.h"
 #include "consolekit-session-client.h"
+#include "consolekit-seat-client.h"
 
 #define CK_ADDR             "org.freedesktop.ConsoleKit"
 #define CK_SESSION_IFACE    "org.freedesktop.ConsoleKit.Session"
@@ -315,6 +316,28 @@
     }
 }
 
+/* Get the initial sessions when starting up */
+static void 
+get_cksessions_cb (DBusGProxy *proxy, GPtrArray * sessions, GError * error, gpointer userdata)
+{
+	if (error != NULL) {
+		g_warning("Unable to get initial sessions: %s", error->message);
+		return;
+	}
+
+	/* If there's no error we should at least get an
+	   array of zero entries */
+	g_return_if_fail(sessions != NULL);
+	g_debug("Got %d initial sessions", sessions->len);
+
+	int i;
+	for (i = 0; i < sessions->len; i++) {
+		seat_proxy_session_added(proxy, g_ptr_array_index(sessions, i), USERS_SERVICE_DBUS(userdata));
+	}
+
+	return;
+}
+
 static void
 create_seat_proxy (UsersServiceDbus *self)
 {
@@ -363,6 +386,10 @@
                                G_CALLBACK (seat_proxy_session_removed),
                                self,
                                NULL);
+
+  org_freedesktop_ConsoleKit_Seat_get_sessions_async (priv->seat_proxy, get_cksessions_cb, self);
+
+  return;
 }
 
 static void
@@ -556,7 +583,11 @@
 add_sessions_for_user (UsersServiceDbus *self,
                        UserData         *user)
 {
-  g_return_if_fail(IS_USERS_SERVICE_DBUS(self));
+  g_return_if_fail (IS_USERS_SERVICE_DBUS(self));
+
+  g_debug ("!!!!!!!!!! - add_sessions_for_user %i %s",
+          (int)user->uid, user->user_name);
+
   UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (self);
   GError          *error;
   GPtrArray       *sessions;


Follow ups