summaryrefslogtreecommitdiff
path: root/daemon
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2011-05-18 02:03:42 -0400
committerRay Strode <rstrode@redhat.com>2011-06-15 09:58:59 -0400
commit8bf1de19c95b3069e108c9e477785c4e654801f7 (patch)
tree7cabdde2addd12ec88e7da23a2ab847a92e5c996 /daemon
parent168f0fab47143adbe95c5be3af74b7c2b435b91f (diff)
downloadgdm-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.c43
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? */