[gdm] daemon: share display respawn logic betewen static and transient displays



commit 8bf1de19c95b3069e108c9e477785c4e654801f7
Author: Ray Strode <rstrode redhat com>
Date:   Wed May 18 02:03:42 2011 -0400

    daemon: share display respawn logic betewen static and transient displays
    
    Right now we ignore transient displays after they're created.  We make
    no attempt to clean them up from the display store or put the user on
    a login screen when their display ends or anything like that.
    
    This commit changes the display factory to monitor transient display
    status in much the same way it monitors static display status.
    
    Note for static displays we always respawn when finishing, where
    as with transient displays either die quietly, jump to an existing
    login display, or respawn.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=618047

 daemon/gdm-local-display-factory.c |   43 +++++++++++++++++------------------
 1 files changed, 21 insertions(+), 22 deletions(-)
---
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
index 7f7c671..c5030ac 100644
--- a/daemon/gdm-local-display-factory.c
+++ b/daemon/gdm-local-display-factory.c
@@ -200,21 +200,7 @@ gdm_local_display_factory_create_transient_display (GdmLocalDisplayFactory *fact
 
         ret = FALSE;
 
-        num = take_next_display_number (factory);
-
-        g_debug ("GdmLocalDisplayFactory: Creating transient display %d", num);
-
-        display = gdm_transient_display_new (num);
-
-        /* FIXME: don't hardcode seat1? */
-        g_object_set (display, "seat-id", CK_SEAT1_PATH, NULL);
-
-        store_display (factory, num, display);
-
-        if (! gdm_display_manage (display)) {
-                display = NULL;
-                goto out;
-        }
+        display = create_display (factory, GDM_TYPE_TRANSIENT_DISPLAY);
 
         if (! gdm_display_get_id (display, id, NULL)) {
                 display = NULL;
@@ -223,9 +209,6 @@ gdm_local_display_factory_create_transient_display (GdmLocalDisplayFactory *fact
 
         ret = TRUE;
  out:
-        /* ref either held by store or not at all */
-        g_object_unref (display);
-
         return ret;
 }
 
@@ -277,13 +260,22 @@ gdm_local_display_factory_create_product_display (GdmLocalDisplayFactory *factor
 }
 
 static void
+switch_to_login_session (GdmLocalDisplayFactory *factory)
+{
+        /* FIXME: look for existing login session before starting a new one */
+        create_display (factory, GDM_TYPE_TRANSIENT_DISPLAY);
+}
+
+static void
 on_display_status_changed (GdmDisplay             *display,
                            GParamSpec             *arg1,
                            GdmLocalDisplayFactory *factory)
 {
         int              status;
+        gboolean         switch_on_finish;
         GdmDisplayStore *store;
         int              num;
+        GType            type;
 
         num = -1;
         gdm_display_get_x11_display_number (display, &num, NULL);
@@ -292,6 +284,8 @@ on_display_status_changed (GdmDisplay             *display,
         store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
 
         status = gdm_display_get_status (display);
+        switch_on_finish = gdm_display_get_switch_on_finish (display);
+        type = G_OBJECT_TYPE (display);
 
         g_debug ("GdmLocalDisplayFactory: static display status changed: %d", status);
         switch (status) {
@@ -302,7 +296,12 @@ on_display_status_changed (GdmDisplay             *display,
                 gdm_display_store_remove (store, display);
                 /* reset num failures */
                 factory->priv->num_failures = 0;
-                create_display (factory, GDM_TYPE_STATIC_DISPLAY);
+
+                if (switch_on_finish) {
+                        switch_to_login_session (factory);
+                } else if (type == GDM_TYPE_STATIC_DISPLAY) {
+                        create_display (factory, type);
+                }
                 break;
         case GDM_DISPLAY_FAILED:
                 /* leave the display number in factory->priv->displays
@@ -315,7 +314,7 @@ on_display_status_changed (GdmDisplay             *display,
                         /* FIXME: should monitor hardware changes to
                            try again when seats change */
                 } else {
-                        create_display (factory, GDM_TYPE_STATIC_DISPLAY);
+                        create_display (factory, type);
                 }
                 break;
         case GDM_DISPLAY_UNMANAGED:
@@ -341,8 +340,8 @@ create_display (GdmLocalDisplayFactory *factory,
 
         if (type == GDM_TYPE_STATIC_DISPLAY) {
                 display = gdm_static_display_new (num);
-        } else {
-                g_assert_not_reached ();
+        } else if (type == GDM_TYPE_TRANSIENT_DISPLAY) {
+                display = gdm_transient_display_new (num);
         }
 
         /* FIXME: don't hardcode seat1? */



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