[gdm] manager: keep track of implicitly created displays



commit 7fc253ecd0f8f5b77a6606caa0c8328313dda06b
Author: Ray Strode <rstrode redhat com>
Date:   Tue Feb 17 17:06:29 2015 -0500

    manager: keep track of implicitly created displays
    
    If a display is created implicitly using gdm-x-session
    or gdm-wayland-session then we need to add it to the display
    store so we can track it.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=744764

 daemon/gdm-manager.c |   36 +++++++++++++++++++++++++++++++++++-
 1 files changed, 35 insertions(+), 1 deletions(-)
---
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index 2a6e22e..5d30682 100644
--- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c
@@ -45,6 +45,7 @@
 #include "gdm-manager-glue.h"
 #include "gdm-display-store.h"
 #include "gdm-display-factory.h"
+#include "gdm-local-display.h"
 #include "gdm-local-display-factory.h"
 #include "gdm-session.h"
 #include "gdm-session-record.h"
@@ -1507,7 +1508,14 @@ on_display_status_changed (GdmDisplay *display,
 #endif
                         if ((display_number == -1 && status == GDM_DISPLAY_PREPARED) ||
                             (display_number != -1 && status == GDM_DISPLAY_MANAGED)) {
-                                set_up_greeter_session (manager, display);
+                                char *session_class;
+
+                                g_object_get (display,
+                                              "session-class", &session_class,
+                                              NULL);
+                                if (g_strcmp0 (session_class, "greeter") == 0) {
+                                        set_up_greeter_session (manager, display);
+                                }
                         }
                         break;
                 case GDM_DISPLAY_FAILED:
@@ -1595,6 +1603,24 @@ start_user_session (GdmManager *manager,
         destroy_start_user_session_operation (operation);
 }
 
+static void
+create_display_for_user_session (GdmManager *self,
+                                 GdmSession *session,
+                                 const char *session_id)
+{
+        GdmDisplay *display;
+
+        display = gdm_local_display_new ();
+
+        g_object_set (G_OBJECT (display),
+                      "session-class", "user",
+                      "session-id", session_id,
+                      NULL);
+        gdm_display_store_add (self->priv->display_store,
+                               display);
+        g_object_set_data (G_OBJECT (session), "gdm-display", display);
+}
+
 static gboolean
 on_start_user_session (StartUserSessionOperation *operation)
 {
@@ -1630,6 +1656,7 @@ on_start_user_session (StartUserSessionOperation *operation)
                 gdm_display_stop_greeter_session (display);
                 g_object_set (G_OBJECT (display), "session-class", "user", NULL);
         } else {
+                const char *session_id;
                 uid_t allowed_uid;
 
                 g_debug ("GdmManager: session has its display server, reusing our server for another login 
screen");
@@ -1641,6 +1668,13 @@ on_start_user_session (StartUserSessionOperation *operation)
                 g_object_set_data (G_OBJECT (display), "gdm-embryonic-user-session", NULL);
                 g_object_set_data (G_OBJECT (operation->session), "gdm-display", NULL);
                 create_embryonic_user_session_for_display (operation->manager, display, allowed_uid);
+
+                /* Give the user session a new display object for bookkeeping purposes */
+                session_id = gdm_session_get_conversation_session_id (operation->session,
+                                                                      operation->service_name);
+                create_display_for_user_session (operation->manager,
+                                                 operation->session,
+                                                 session_id);
         }
 
         start_user_session (operation->manager, operation);


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