diff options
author | Ray Strode <rstrode@redhat.com> | 2011-05-18 02:03:42 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2011-06-15 09:58:59 -0400 |
commit | 8bf1de19c95b3069e108c9e477785c4e654801f7 (patch) | |
tree | 7cabdde2addd12ec88e7da23a2ab847a92e5c996 /daemon | |
parent | 168f0fab47143adbe95c5be3af74b7c2b435b91f (diff) | |
download | gdm-8bf1de19c95b3069e108c9e477785c4e654801f7.tar.gz |
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
Diffstat (limited to 'daemon')
-rw-r--r-- | 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 7f7c671d..c5030ac9 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? */ |