diff options
-rw-r--r-- | daemon/gdm-display.h | 1 | ||||
-rw-r--r-- | daemon/gdm-local-display-factory.c | 43 | ||||
-rw-r--r-- | daemon/gdm-wayland-session.c | 23 | ||||
-rw-r--r-- | daemon/gdm-x-session.c | 25 |
4 files changed, 71 insertions, 21 deletions
diff --git a/daemon/gdm-display.h b/daemon/gdm-display.h index 6d5e88df..33dc3be4 100644 --- a/daemon/gdm-display.h +++ b/daemon/gdm-display.h @@ -40,6 +40,7 @@ typedef enum { GDM_DISPLAY_UNMANAGED = 0, GDM_DISPLAY_PREPARED, GDM_DISPLAY_MANAGED, + GDM_DISPLAY_WAITING_TO_FINISH, GDM_DISPLAY_FINISHED, GDM_DISPLAY_FAILED, } GdmDisplayStatus; diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c index 7ec998ef..5ec94ce7 100644 --- a/daemon/gdm-local-display-factory.c +++ b/daemon/gdm-local-display-factory.c @@ -268,6 +268,36 @@ gdm_local_display_factory_create_transient_display (GdmLocalDisplayFactory *fact return ret; } +static gboolean +finish_display_on_seat_if_waiting (GdmDisplayStore *display_store, + GdmDisplay *display, + const char *seat_id) +{ + if (gdm_display_get_status (display) != GDM_DISPLAY_WAITING_TO_FINISH) + return FALSE; + + g_debug ("GdmLocalDisplayFactory: finish background display\n"); + gdm_display_stop_greeter_session (display); + gdm_display_unmanage (display); + gdm_display_finish (display); + + return FALSE; +} + +static void +finish_waiting_displays_on_seat (GdmLocalDisplayFactory *factory, + const char *seat_id) +{ + GdmDisplayStore *store; + + store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); + + gdm_display_store_foreach (store, + (GdmDisplayStoreFunc) finish_display_on_seat_if_waiting, + (gpointer) + seat_id); +} + static void on_display_status_changed (GdmDisplay *display, GParamSpec *arg1, @@ -346,6 +376,9 @@ on_display_status_changed (GdmDisplay *display, case GDM_DISPLAY_PREPARED: break; case GDM_DISPLAY_MANAGED: + finish_waiting_displays_on_seat (factory, seat_id); + break; + case GDM_DISPLAY_WAITING_TO_FINISH: break; default: g_assert_not_reached (); @@ -583,7 +616,7 @@ lookup_by_session_id (const char *id, } static void -maybe_stop_greeter_display (GdmDisplay *display) +maybe_stop_greeter_in_background (GdmDisplay *display) { g_autofree char *display_session_type = NULL; @@ -603,10 +636,8 @@ maybe_stop_greeter_display (GdmDisplay *display) return; } - g_debug ("GdmLocalDisplayFactory: killing login window since its now unused"); - gdm_display_stop_greeter_session (display); - gdm_display_unmanage (display); - gdm_display_finish (display); + g_debug ("GdmLocalDisplayFactory: killing login window once its unused"); + g_object_set (G_OBJECT (display), "status", GDM_DISPLAY_WAITING_TO_FINISH, NULL); } static gboolean @@ -700,7 +731,7 @@ on_vt_changed (GIOChannel *source, (gpointer) login_session_id); if (display != NULL) - maybe_stop_greeter_display (display); + maybe_stop_greeter_in_background (display); } else { g_debug ("GdmLocalDisplayFactory: VT not switched from login window"); } diff --git a/daemon/gdm-wayland-session.c b/daemon/gdm-wayland-session.c index 94f49e19..de1991b3 100644 --- a/daemon/gdm-wayland-session.c +++ b/daemon/gdm-wayland-session.c @@ -454,6 +454,21 @@ on_sigterm (State *state) return G_SOURCE_CONTINUE; } +static gboolean +on_registration_delay_complete (State *state) +{ + gboolean ret; + + ret = register_display (state, state->cancellable); + + if (!ret) { + g_printerr ("Unable to register display with display manager\n"); + g_main_loop_quit (state->main_loop); + } + + return G_SOURCE_REMOVE; +} + int main (int argc, char **argv) @@ -528,13 +543,7 @@ main (int argc, goto out; } - ret = register_display (state, state->cancellable); - - if (!ret) { - g_printerr ("Unable to register display with display manager\n"); - exit_status = EX_SOFTWARE; - goto out; - } + g_timeout_add_seconds (2, (GSourceFunc) on_registration_delay_complete, state); g_main_loop_run (state->main_loop); diff --git a/daemon/gdm-x-session.c b/daemon/gdm-x-session.c index 3b2fcef4..412999cf 100644 --- a/daemon/gdm-x-session.c +++ b/daemon/gdm-x-session.c @@ -810,6 +810,21 @@ on_sigterm (State *state) return G_SOURCE_CONTINUE; } +static gboolean +on_registration_delay_complete (State *state) +{ + gboolean ret; + + ret = register_display (state, state->cancellable); + + if (!ret) { + g_printerr ("Unable to register display with display manager\n"); + g_main_loop_quit (state->main_loop); + } + + return G_SOURCE_REMOVE; +} + int main (int argc, char **argv) @@ -896,14 +911,6 @@ main (int argc, goto out; } - ret = register_display (state, state->cancellable); - - if (!ret) { - g_printerr ("Unable to register display with display manager\n"); - exit_status = EX_SOFTWARE; - goto out; - } - ret = spawn_session (state, run_script, state->cancellable); if (!ret) { @@ -912,6 +919,8 @@ main (int argc, goto out; } + g_timeout_add_seconds (2, (GSourceFunc) on_registration_delay_complete, state); + g_main_loop_run (state->main_loop); /* Only use exit status of session if we're here because it exit */ |