From d2a06b42fe90cf3f340ebf41a0a5e7676bc50802 Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Thu, 11 Feb 2021 12:09:43 +0100 Subject: local-display-factory: Move session type checking into create_display We used to check the session type when enumerating the seats at startup (and on VT switch). However, this misses cases where seats are added dynamically (such as at boot time). Simply move the check into create_display and pass in the failure count so that it can handle the X11 fallback when wayland failed to come up. Related: #662 --- daemon/gdm-local-display-factory.c | 57 +++++++++++++------------------------- 1 file changed, 20 insertions(+), 37 deletions(-) diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c index c6b8d898..9ecc0395 100644 --- a/daemon/gdm-local-display-factory.c +++ b/daemon/gdm-local-display-factory.c @@ -79,9 +79,7 @@ static void gdm_local_display_factory_init (GdmLocalDisplayFactory static void gdm_local_display_factory_finalize (GObject *object); static void ensure_display_for_seat (GdmLocalDisplayFactory *factory, - const char *seat_id, - const char *session_type, - gboolean initial_display); + const char *seat_id); static void on_display_status_changed (GdmDisplay *display, GParamSpec *arg1, @@ -386,19 +384,11 @@ on_display_status_changed (GdmDisplay *display, factory->num_failures++; - if (factory->num_failures > MAX_DISPLAY_FAILURES) { - /* oh shit */ + /* oh shit */ + if (factory->num_failures > MAX_DISPLAY_FAILURES) g_warning ("GdmLocalDisplayFactory: maximum number of X display failures reached: check X server log for errors"); - } else { -#ifdef ENABLE_WAYLAND_SUPPORT - if (g_strcmp0 (session_type, "wayland") == 0) { - g_free (session_type); - session_type = NULL; - } - -#endif - ensure_display_for_seat (factory, seat_id, session_type, is_initial); - } + else + ensure_display_for_seat (factory, seat_id); } break; case GDM_DISPLAY_UNMANAGED: @@ -461,14 +451,22 @@ lookup_prepared_display_by_seat_id (const char *id, static void ensure_display_for_seat (GdmLocalDisplayFactory *factory, - const char *seat_id, - const char *session_type, - gboolean initial) + const char *seat_id) { + gboolean is_initial; + const char *session_type = NULL; GdmDisplayStore *store; GdmDisplay *display = NULL; g_autofree char *login_session_id = NULL; + if (g_strcmp0 (seat_id, "seat0") == 0) { + is_initial = TRUE; + if (factory->num_failures == 0 && gdm_local_display_factory_use_wayland ()) + session_type = "wayland"; + } else { + is_initial = FALSE; + } + g_debug ("GdmLocalDisplayFactory: %s login display for seat %s requested", session_type? : "X11", seat_id); store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); @@ -522,7 +520,7 @@ ensure_display_for_seat (GdmLocalDisplayFactory *factory, } g_object_set (display, "seat-id", seat_id, NULL); - g_object_set (display, "is-initial", initial, NULL); + g_object_set (display, "is-initial", is_initial, NULL); store_display (factory, display); @@ -579,18 +577,7 @@ gdm_local_display_factory_sync_seats (GdmLocalDisplayFactory *factory) g_variant_iter_init (&iter, array); while (g_variant_iter_loop (&iter, "(&so)", &seat, NULL)) { - gboolean is_initial; - const char *session_type = NULL; - - if (g_strcmp0 (seat, "seat0") == 0) { - is_initial = TRUE; - if (gdm_local_display_factory_use_wayland ()) - session_type = "wayland"; - } else { - is_initial = FALSE; - } - - ensure_display_for_seat (factory, seat, session_type, is_initial); + ensure_display_for_seat (factory, seat); } g_variant_unref (result); @@ -610,7 +597,7 @@ on_seat_new (GDBusConnection *connection, const char *seat; g_variant_get (parameters, "(&s&o)", &seat, NULL); - ensure_display_for_seat (GDM_LOCAL_DISPLAY_FACTORY (user_data), seat, NULL, FALSE); + ensure_display_for_seat (GDM_LOCAL_DISPLAY_FACTORY (user_data), seat); } static void @@ -701,7 +688,6 @@ on_vt_changed (GIOChannel *source, g_autofree char *login_session_id = NULL; g_autofree char *active_session_id = NULL; unsigned int previous_vt, new_vt, login_window_vt = 0; - const char *session_type = NULL; int ret, n_returned; g_debug ("GdmLocalDisplayFactory: received VT change event"); @@ -830,12 +816,9 @@ on_vt_changed (GIOChannel *source, return G_SOURCE_CONTINUE; } - if (gdm_local_display_factory_use_wayland ()) - session_type = "wayland"; - g_debug ("GdmLocalDisplayFactory: creating new display on seat0 because of VT change"); - ensure_display_for_seat (factory, "seat0", session_type, TRUE); + ensure_display_for_seat (factory, "seat0"); return G_SOURCE_CONTINUE; } -- cgit v1.2.1