[gdm] display: add new session-class property



commit 35719a79adfb0a47894f1bc304bab665aaefcd49
Author: Ray Strode <rstrode redhat com>
Date:   Tue Feb 17 16:46:29 2015 -0500

    display: add new session-class property
    
    The session-class property is analagous to the
    sd_login session class.  It can be either
    "greeter" or "user".
    
    This helps us decide whether or not to add a
    launch environment to the display.
    
    We need this because some displays go straight
    to a user session.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=744764

 daemon/gdm-display.c       |   33 ++++++++++++++++++++++++++++++++-
 daemon/gdm-local-display.c |    9 +++++++++
 daemon/gdm-manager.c       |    2 ++
 3 files changed, 43 insertions(+), 1 deletions(-)
---
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
index 46e8041..d70a6fb 100644
--- a/daemon/gdm-display.c
+++ b/daemon/gdm-display.c
@@ -60,6 +60,7 @@ struct GdmDisplayPrivate
         char                 *id;
         char                 *seat_id;
         char                 *session_id;
+        char                 *session_class;
 
         char                 *remote_hostname;
         int                   x11_display_number;
@@ -100,6 +101,7 @@ enum {
         PROP_STATUS,
         PROP_SEAT_ID,
         PROP_SESSION_ID,
+        PROP_SESSION_CLASS,
         PROP_REMOTE_HOSTNAME,
         PROP_X11_DISPLAY_NUMBER,
         PROP_X11_DISPLAY_NAME,
@@ -713,7 +715,10 @@ gdm_display_manage (GdmDisplay *self)
         }
 
         g_timer_start (self->priv->server_timer);
-        look_for_existing_users_and_manage (self);
+
+        if (g_strcmp0 (self->priv->session_class, "greeter") == 0) {
+                look_for_existing_users_and_manage (self);
+        }
 
         return TRUE;
 }
@@ -836,6 +841,14 @@ _gdm_display_set_session_id (GdmDisplay     *self,
 }
 
 static void
+_gdm_display_set_session_class (GdmDisplay *self,
+                                const char *session_class)
+{
+        g_free (self->priv->session_class);
+        self->priv->session_class = g_strdup (session_class);
+}
+
+static void
 _gdm_display_set_remote_hostname (GdmDisplay     *self,
                                   const char     *hostname)
 {
@@ -919,6 +932,9 @@ gdm_display_set_property (GObject        *object,
         case PROP_SESSION_ID:
                 _gdm_display_set_session_id (self, g_value_get_string (value));
                 break;
+        case PROP_SESSION_CLASS:
+                _gdm_display_set_session_class (self, g_value_get_string (value));
+                break;
         case PROP_REMOTE_HOSTNAME:
                 _gdm_display_set_remote_hostname (self, g_value_get_string (value));
                 break;
@@ -972,6 +988,9 @@ gdm_display_get_property (GObject        *object,
         case PROP_SESSION_ID:
                 g_value_set_string (value, self->priv->session_id);
                 break;
+        case PROP_SESSION_CLASS:
+                g_value_set_string (value, self->priv->session_class);
+                break;
         case PROP_REMOTE_HOSTNAME:
                 g_value_set_string (value, self->priv->remote_hostname);
                 break;
@@ -1250,6 +1269,13 @@ gdm_display_class_init (GdmDisplayClass *klass)
                                                               NULL,
                                                               G_PARAM_READWRITE));
         g_object_class_install_property (object_class,
+                                         PROP_SESSION_CLASS,
+                                         g_param_spec_string ("session-class",
+                                                              NULL,
+                                                              NULL,
+                                                              "greeter",
+                                                              G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+        g_object_class_install_property (object_class,
                                          PROP_IS_INITIAL,
                                          g_param_spec_boolean ("is-initial",
                                                                NULL,
@@ -1344,6 +1370,7 @@ gdm_display_finalize (GObject *object)
         g_debug ("GdmDisplay: Finalizing display: %s", self->priv->id);
         g_free (self->priv->id);
         g_free (self->priv->seat_id);
+        g_free (self->priv->session_class);
         g_free (self->priv->remote_hostname);
         g_free (self->priv->x11_display_name);
         g_free (self->priv->x11_cookie);
@@ -1479,6 +1506,8 @@ void
 gdm_display_set_up_greeter_session (GdmDisplay  *self,
                                     char       **username)
 {
+        g_return_if_fail (g_strcmp0 (self->priv->session_class, "greeter") == 0);
+
         self->priv->doing_initial_setup = wants_initial_setup (self);
 
         if (self->priv->doing_initial_setup) {
@@ -1497,6 +1526,8 @@ gdm_display_start_greeter_session (GdmDisplay *self)
         char          *hostname;
         char          *auth_file;
 
+        g_return_if_fail (g_strcmp0 (self->priv->session_class, "greeter") == 0);
+
         g_debug ("GdmDisplay: Running greeter");
 
         display_name = NULL;
diff --git a/daemon/gdm-local-display.c b/daemon/gdm-local-display.c
index 6fc2e60..a9762a7 100644
--- a/daemon/gdm-local-display.c
+++ b/daemon/gdm-local-display.c
@@ -91,6 +91,7 @@ gdm_local_display_prepare (GdmDisplay *display)
         GdmLocalDisplay *self = GDM_LOCAL_DISPLAY (display);
         GdmLaunchEnvironment *launch_environment;
         char          *seat_id;
+        char          *session_class;
         gboolean       doing_initial_setup = FALSE;
 
         seat_id = NULL;
@@ -98,8 +99,13 @@ gdm_local_display_prepare (GdmDisplay *display)
         g_object_get (self,
                       "seat-id", &seat_id,
                       "doing-initial-setup", &doing_initial_setup,
+                      "session-class", &session_class,
                       NULL);
 
+        if (g_strcmp0 (session_class, "greeter") != 0) {
+                goto out;
+        }
+
         if (!doing_initial_setup) {
                 launch_environment = gdm_create_greeter_launch_environment (NULL,
                                                                             seat_id,
@@ -115,6 +121,9 @@ gdm_local_display_prepare (GdmDisplay *display)
         g_object_set (self, "launch-environment", launch_environment, NULL);
         g_object_unref (launch_environment);
 
+out:
+        g_free (seat_id);
+        g_free (session_class);
         return GDM_DISPLAY_CLASS (gdm_local_display_parent_class)->prepare (display);
 }
 
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index b7754ae..2a6e22e 100644
--- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c
@@ -1454,6 +1454,7 @@ set_up_greeter_session (GdmManager *manager,
         if (!will_autologin) {
                  gdm_display_set_up_greeter_session (display, &allowed_user);
         } else {
+                 g_object_set (G_OBJECT (display), "session-class", "user", NULL);
                  allowed_user = g_strdup ("root");
         }
 
@@ -1627,6 +1628,7 @@ on_start_user_session (StartUserSessionOperation *operation)
                  * the user session display. Kill the greeter on this session
                  * and let the user session follow the same display. */
                 gdm_display_stop_greeter_session (display);
+                g_object_set (G_OBJECT (display), "session-class", "user", NULL);
         } else {
                 uid_t allowed_uid;
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]