From 3b7bb8b3d3bfcaacf70d00d2abf00fbd623bb7c6 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Sep 03 2021 04:19:30 +0000 Subject: import gdm-40.0-13.el8 --- diff --git a/SOURCES/0001-data-disable-wayland-on-certain-hardware.patch b/SOURCES/0001-data-disable-wayland-on-certain-hardware.patch index 8aba1da..2e346cb 100644 --- a/SOURCES/0001-data-disable-wayland-on-certain-hardware.patch +++ b/SOURCES/0001-data-disable-wayland-on-certain-hardware.patch @@ -1,4 +1,4 @@ -From afdaf0c31c7fb44e05a271a9047a0993ff1f4ef2 Mon Sep 17 00:00:00 2001 +From e01c0894669f5fe3d1a1c4148b7507e61b95d035 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 11 Feb 2019 18:14:07 -0500 Subject: [PATCH] data: disable wayland on certain hardware @@ -9,14 +9,14 @@ setups, so disable it in those cases. Also disable it on server chips for performance reasons. --- - data/61-gdm.rules.in | 36 ++++++++++++++++++++++++++++++++---- - 1 file changed, 32 insertions(+), 4 deletions(-) + data/61-gdm.rules.in | 39 +++++++++++++++++++++++++++++++++++---- + 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/data/61-gdm.rules.in b/data/61-gdm.rules.in -index b1da191f8..d863a4a4d 100644 +index b1da191f..d599a146 100644 --- a/data/61-gdm.rules.in +++ b/data/61-gdm.rules.in -@@ -1,6 +1,34 @@ +@@ -1,6 +1,37 @@ # disable Wayland on Hi1710 chipsets -ATTR{vendor}=="0x19e5", ATTR{device}=="0x1711", RUN+="@libexecdir@/gdm-runtime-config set daemon WaylandEnable false" -# disable Wayland when using the proprietary nvidia driver @@ -44,6 +44,9 @@ index b1da191f8..d863a4a4d 100644 +SUBSYSTEM=="drm", KERNEL=="card[1-9]*", ENV{GDM_HAS_NVIDIA_DRIVER}=="1", RUN+="@libexecdir@/gdm-disable-wayland" +ACTION=="add", SUBSYSTEM=="module", KERNEL=="nvidia_drm", ATTR{parameters/modeset}=="N", RUN+="/usr/libexec/gdm-disable-wayland" + ++# disable Wayland on HyperV guests ++DRIVER=="hyperv_fb", RUN+="@libexecdir@/gdm-disable-wayland" ++ +# disable Wayland on passthrough graphics setups for now (assumes passthrough if +# there is more than one card, and one of the cards is virt: cirrus, bochs, qxl) +ATTR{vendor}=="0x1013", ATTR{device}=="0x00b8", ATTR{subsystem_vendor}=="0x1af4", ATTR{subsystem_device}=="0x1100", ENV{GDM_HAS_VIRTUAL_GPU}="1" @@ -56,5 +59,5 @@ index b1da191f8..d863a4a4d 100644 -IMPORT{cmdline}="nomodeset", RUN+="@libexecdir@/gdm-runtime-config set daemon WaylandEnable false" +IMPORT{cmdline}="nomodeset", RUN+="@libexecdir@/gdm-disable-wayland" -- -2.31.1 +2.27.0 diff --git a/SOURCES/0001-local-display-factory-Provide-more-flexibility-for-c.patch b/SOURCES/0001-local-display-factory-Provide-more-flexibility-for-c.patch index 2d93f69..346c27e 100644 --- a/SOURCES/0001-local-display-factory-Provide-more-flexibility-for-c.patch +++ b/SOURCES/0001-local-display-factory-Provide-more-flexibility-for-c.patch @@ -1,4 +1,4 @@ -From 8c3a382416729296e1d9ba24af6832c354bd6fc4 Mon Sep 17 00:00:00 2001 +From 4ef82bf0fe40dd3952997a77539a57e8cb8b99ef Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 16 Jul 2021 12:34:57 -0400 Subject: [PATCH 1/2] local-display-factory: Provide more flexibility for @@ -22,17 +22,17 @@ PreferredDisplayServer can be set to "wayland", "xorg", "legacy-xorg" or fall back to "wayland". --- common/gdm-settings-keys.h | 2 + - daemon/gdm-display.c | 36 +++++ - daemon/gdm-launch-environment.c | 9 ++ - daemon/gdm-local-display-factory.c | 220 ++++++++++++++++++++++++----- + daemon/gdm-display.c | 36 ++++ + daemon/gdm-launch-environment.c | 9 + + daemon/gdm-local-display-factory.c | 267 ++++++++++++++++++++++++----- daemon/gdm-manager.c | 20 +-- - daemon/gdm-session.c | 143 +++++++++++-------- + daemon/gdm-session.c | 169 ++++++++++-------- data/gdm.schemas.in | 10 ++ - libgdm/gdm-sessions.c | 72 +++++++--- - 8 files changed, 378 insertions(+), 134 deletions(-) + libgdm/gdm-sessions.c | 72 +++++--- + 8 files changed, 437 insertions(+), 148 deletions(-) diff --git a/common/gdm-settings-keys.h b/common/gdm-settings-keys.h -index f0059b5cf..87685d3cd 100644 +index f0059b5c..87685d3c 100644 --- a/common/gdm-settings-keys.h +++ b/common/gdm-settings-keys.h @@ -6,59 +6,61 @@ @@ -98,7 +98,7 @@ index f0059b5cf..87685d3cd 100644 #endif /* _GDM_SETTINGS_KEYS_H */ diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c -index 7c954ad24..874f9e6ba 100644 +index 7c954ad2..bd96dd03 100644 --- a/daemon/gdm-display.c +++ b/daemon/gdm-display.c @@ -66,83 +66,86 @@ typedef struct _GdmDisplayPrivate @@ -583,7 +583,7 @@ index 7c954ad24..874f9e6ba 100644 self); g_signal_handlers_disconnect_by_func (priv->launch_environment, diff --git a/daemon/gdm-launch-environment.c b/daemon/gdm-launch-environment.c -index feccf057f..5044290cd 100644 +index feccf057..5044290c 100644 --- a/daemon/gdm-launch-environment.c +++ b/daemon/gdm-launch-environment.c @@ -117,60 +117,61 @@ static GHashTable * @@ -718,10 +718,10 @@ index feccf057f..5044290cd 100644 g_signal_emit (G_OBJECT (launch_environment), signals [OPENED], 0); diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c -index 8a4ef06cd..a8ca1d598 100644 +index 8a4ef06c..eba38671 100644 --- a/daemon/gdm-local-display-factory.c +++ b/daemon/gdm-local-display-factory.c -@@ -156,126 +156,221 @@ take_next_display_number (GdmLocalDisplayFactory *factory) +@@ -156,126 +156,287 @@ take_next_display_number (GdmLocalDisplayFactory *factory) g_debug ("GdmLocalDisplayFactory: Found the following X displays:"); for (l = list; l != NULL; l = l->next) { @@ -793,46 +793,107 @@ index 8a4ef06cd..a8ca1d598 100644 + return g_strdup ("none"); +} + ++struct GdmDisplayServerConfiguration { ++ const char *display_server; ++ const char *key; ++ const char *binary; ++ const char *session_type; ++} display_server_configuration[] = { ++#ifdef ENABLE_WAYLAND_SUPPORT ++ { "wayland", GDM_KEY_WAYLAND_ENABLE, "/usr/bin/Xwayland", "wayland" }, ++#endif ++ { "xorg", GDM_KEY_XORG_ENABLE, "/usr/bin/Xorg", "x11" }, ++ { NULL, NULL, NULL }, ++}; ++ ++static gboolean ++display_server_enabled (GdmLocalDisplayFactory *factory, ++ const char *display_server) ++{ ++ size_t i; ++ ++ for (i = 0; display_server_configuration[i].display_server != NULL; i++) { ++ const char *key = display_server_configuration[i].key; ++ const char *binary = display_server_configuration[i].binary; ++ gboolean enabled = FALSE; ++ ++ if (!g_str_equal (display_server_configuration[i].display_server, ++ display_server)) ++ continue; ++ ++ if (!gdm_settings_direct_get_boolean (key, &enabled) || !enabled) ++ return FALSE; ++ ++ if (!g_file_test (binary, G_FILE_TEST_IS_EXECUTABLE)) ++ return FALSE; ++ ++ return TRUE; ++ } ++ ++ return FALSE; ++} ++ +static const char * -+gdm_local_display_factory_get_session_type (GdmLocalDisplayFactory *factory, -+ gboolean should_fall_back) ++get_session_type_for_display_server (GdmLocalDisplayFactory *factory, ++ const char *display_server) ++{ ++ size_t i; ++ ++ for (i = 0; display_server_configuration[i].display_server != NULL; i++) { ++ if (!g_str_equal (display_server_configuration[i].display_server, ++ display_server)) ++ continue; ++ ++ return display_server_configuration[i].session_type; ++ } ++ ++ return NULL; ++} ++ ++static char ** ++gdm_local_display_factory_get_session_types (GdmLocalDisplayFactory *factory, ++ gboolean should_fall_back) +{ -+ const char *session_types[3] = { NULL }; -+ gsize i, session_type_index = 0, number_of_session_types = 0; + g_autofree gchar *preferred_display_server = NULL; ++ const char *fallback_display_server = NULL; ++ gboolean wayland_preferred = FALSE; ++ gboolean xorg_preferred = FALSE; ++ g_autoptr (GPtrArray) session_types_array = NULL; ++ char **session_types; ++ ++ session_types_array = g_ptr_array_new (); ++ + preferred_display_server = get_preferred_display_server (factory); -+ if (g_strcmp0 (preferred_display_server, "wayland") != 0 && -+ g_strcmp0 (preferred_display_server, "xorg") != 0) -+ return NULL; -+ for (i = 0; i < G_N_ELEMENTS (session_types) - 1; i++) { -+#ifdef ENABLE_WAYLAND_SUPPORT -+ if (number_of_session_types > 0 || -+ g_strcmp0 (preferred_display_server, "wayland") == 0) { -+ gboolean wayland_enabled = FALSE; -+ if (gdm_settings_direct_get_boolean (GDM_KEY_WAYLAND_ENABLE, &wayland_enabled)) { -+ if (wayland_enabled && g_file_test ("/usr/bin/Xwayland", G_FILE_TEST_IS_EXECUTABLE)) { -+ session_types[i] = "wayland"; -+ number_of_session_types++; -+ continue; -+ } -+ } -+ } -+#endif -+ if (number_of_session_types > 0 || -+ g_strcmp0 (preferred_display_server, "xorg") == 0) { -+ gboolean xorg_enabled = FALSE; -+ if (gdm_settings_direct_get_boolean (GDM_KEY_XORG_ENABLE, &xorg_enabled)) { -+ if (xorg_enabled && g_file_test ("/usr/bin/Xorg", G_FILE_TEST_IS_EXECUTABLE)) { -+ session_types[i] = "x11"; -+ number_of_session_types++; -+ continue; -+ } -+ } -+ } ++ ++ g_debug ("GdmLocalDisplayFactory: Getting session type (prefers %s, falling back: %s)", ++ preferred_display_server, should_fall_back? "yes" : "no"); ++ ++ wayland_preferred = g_str_equal (preferred_display_server, "wayland"); ++ xorg_preferred = g_str_equal (preferred_display_server, "xorg"); ++ ++ if (wayland_preferred) ++ fallback_display_server = "xorg"; ++ else if (xorg_preferred) ++ fallback_display_server = "wayland"; ++ else ++ return NULL; ++ ++ if (!should_fall_back) { ++ if (display_server_enabled (factory, preferred_display_server)) ++ g_ptr_array_add (session_types_array, (gpointer) get_session_type_for_display_server (factory, preferred_display_server)); + } -+ if (should_fall_back) -+ session_type_index++; -+ return session_types[session_type_index]; ++ ++ if (display_server_enabled (factory, fallback_display_server)) ++ g_ptr_array_add (session_types_array, (gpointer) get_session_type_for_display_server (factory, fallback_display_server)); ++ ++ if (session_types_array->len == 0) ++ return NULL; ++ ++ g_ptr_array_add (session_types_array, NULL); ++ ++ session_types = g_strdupv ((char **) session_types_array->pdata); ++ ++ return session_types; +} + static void @@ -903,9 +964,11 @@ index 8a4ef06cd..a8ca1d598 100644 +#ifdef ENABLE_USER_DISPLAY_SERVER + if (g_strcmp0 (preferred_display_server, "wayland") == 0 || + g_strcmp0 (preferred_display_server, "xorg") == 0) { -+ session_type = gdm_local_display_factory_get_session_type (factory, FALSE); ++ g_auto(GStrv) session_types = NULL; + -+ if (session_type == NULL) { ++ session_types = gdm_local_display_factory_get_session_types (factory, FALSE); ++ ++ if (session_types == NULL) { + g_set_error_literal (error, + GDM_DISPLAY_ERROR, + GDM_DISPLAY_ERROR_GENERAL, @@ -915,7 +978,10 @@ index 8a4ef06cd..a8ca1d598 100644 - display = gdm_legacy_display_new (num); + display = gdm_local_display_new (); -+ g_object_set (G_OBJECT (display), "session-type", session_type, NULL); ++ g_object_set (G_OBJECT (display), ++ "session-type", session_types[0], ++ "supported-session-tyes", session_types, ++ NULL); + is_initial = TRUE; } #endif @@ -966,7 +1032,11 @@ index 8a4ef06cd..a8ca1d598 100644 static void finish_display_on_seat_if_waiting (GdmDisplayStore *display_store, GdmDisplay *display, -@@ -454,190 +549,239 @@ lookup_prepared_display_by_seat_id (const char *id, +@@ -450,194 +611,220 @@ lookup_prepared_display_by_seat_id (const char *id, + + if (status != GDM_DISPLAY_PREPARED) + return FALSE; + return lookup_by_seat_id (id, display, user_data); } @@ -993,7 +1063,9 @@ index 8a4ef06cd..a8ca1d598 100644 int ret; gboolean seat_supports_graphics; gboolean is_seat0; - const char *session_type = "wayland"; +- const char *session_type = "wayland"; ++ g_auto (GStrv) session_types = NULL; ++ const char *legacy_session_types[] = { "x11", NULL }; GdmDisplayStore *store; GdmDisplay *display = NULL; g_autofree char *login_session_id = NULL; @@ -1038,10 +1110,10 @@ index 8a4ef06cd..a8ca1d598 100644 - g_debug ("GdmLocalDisplayFactory: New displays on seat0 will use wayland"); - } + falling_back = factory->num_failures > 0; -+ session_type = gdm_local_display_factory_get_session_type (factory, falling_back); ++ session_types = gdm_local_display_factory_get_session_types (factory, falling_back); + + g_debug ("GdmLocalDisplayFactory: New displays on seat0 will use %s%s", -+ session_type, falling_back? " fallback" : ""); ++ session_types[0], falling_back? " fallback" : ""); } else { is_seat0 = FALSE; @@ -1049,7 +1121,7 @@ index 8a4ef06cd..a8ca1d598 100644 /* Force legacy X11 for all auxiliary seats */ seat_supports_graphics = TRUE; - session_type = NULL; -+ session_type = "x11"; ++ session_types = g_strdupv ((char **) legacy_session_types); } /* For seat0, we have a fallback logic to still try starting it after @@ -1088,8 +1160,9 @@ index 8a4ef06cd..a8ca1d598 100644 g_debug ("GdmLocalDisplayFactory: This might indicate an issue where the framebuffer device is not tagged as master-of-seat in udev."); seat_supports_graphics = TRUE; - session_type = NULL; -+ session_type = "x11"; + wayland_enabled = FALSE; ++ g_strfreev (session_types); ++ session_types = g_strdupv ((char **) legacy_session_types); } else { g_clear_handle_id (&factory->seat0_graphics_check_timeout_id, g_source_remove); } @@ -1100,9 +1173,9 @@ index 8a4ef06cd..a8ca1d598 100644 - g_debug ("GdmLocalDisplayFactory: %s login display for seat %s requested", - session_type? : "X11", seat_id); -+ if (session_type != NULL) ++ if (session_types != NULL) + g_debug ("GdmLocalDisplayFactory: %s login display for seat %s requested", -+ session_type, seat_id); ++ session_types[0], seat_id); + else if (g_strcmp0 (preferred_display_server, "legacy-xorg") == 0) + g_debug ("GdmLocalDisplayFactory: Legacy Xorg login display for seat %s requested", + seat_id); @@ -1144,53 +1217,29 @@ index 8a4ef06cd..a8ca1d598 100644 - if (is_seat0) { - display = gdm_local_display_new (); - if (session_type != NULL) { +- g_object_set (G_OBJECT (display), "session-type", session_type, NULL); + if (g_strcmp0 (preferred_display_server, "wayland") == 0 || + g_strcmp0 (preferred_display_server, "xorg") == 0) { + if (is_seat0) { -+ g_autoptr (GPtrArray) supported_session_types = NULL; -+ -+ if (session_type == NULL) { -+ g_warning ("GdmLocalDisplayFactory: Both Wayland and Xorg sessions are unavailable"); -+ return; -+ } -+ -+ supported_session_types = g_ptr_array_new (); -+ -+ if (g_strcmp0 (preferred_display_server, "wayland") == 0) { -+ if (wayland_enabled) -+ g_ptr_array_add (supported_session_types, "wayland"); -+ } else { -+ if (xorg_enabled) -+ g_ptr_array_add (supported_session_types, "x11"); -+ } -+ -+ if (!falling_back) { -+ if (g_strcmp0 (preferred_display_server, "wayland") == 0) { -+ if (xorg_enabled) -+ g_ptr_array_add (supported_session_types, "x11"); -+ } else { -+ if (wayland_enabled) -+ g_ptr_array_add (supported_session_types, "wayland"); -+ } -+ } -+ -+ g_ptr_array_add (supported_session_types, NULL); -+ + display = gdm_local_display_new (); - g_object_set (G_OBJECT (display), "session-type", session_type, NULL); -+ g_object_set (G_OBJECT (display), "supported-session-types", supported_session_types->pdata, NULL); ++ g_object_set (G_OBJECT (display), ++ "session-type", session_types[0], ++ "supported-session-types", session_types, ++ NULL); } } #endif if (display == NULL) { guint32 num; -+ const char *supported_session_types[] = { "x11", NULL }; num = take_next_display_number (factory); display = gdm_legacy_display_new (num); -+ g_object_set (G_OBJECT (display), "supported-session-types", supported_session_types, NULL); ++ g_object_set (G_OBJECT (display), ++ "session-type", legacy_session_types[0], ++ "supported-session-types", legacy_session_types, ++ NULL); } g_object_set (display, "seat-id", seat_id, NULL); @@ -1222,7 +1271,7 @@ index 8a4ef06cd..a8ca1d598 100644 static gboolean diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c -index 9c10adff3..24219691c 100644 +index 9c10adff..24219691 100644 --- a/daemon/gdm-manager.c +++ b/daemon/gdm-manager.c @@ -1306,74 +1306,75 @@ get_automatic_login_details (GdmManager *manager, @@ -1461,7 +1510,7 @@ index 9c10adff3..24219691c 100644 } diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c -index 5c5903a49..a53fb9804 100644 +index 5c5903a4..7b0ade1e 100644 --- a/daemon/gdm-session.c +++ b/daemon/gdm-session.c @@ -105,100 +105,98 @@ struct _GdmSession @@ -1666,14 +1715,14 @@ index 5c5903a49..a53fb9804 100644 - } + for (j = 0; self->supported_session_types[j] != NULL; j++) { + const char *supported_type = self->supported_session_types[j]; -+ + +- g_array_append_vals (search_array, x_search_dirs, G_N_ELEMENTS (x_search_dirs)); + if (g_str_equal (supported_type, "x11")) { + for (i = 0; system_data_dirs[i]; i++) { + gchar *dir = g_build_filename (system_data_dirs[i], "xsessions", NULL); + g_array_append_val (search_array, dir); + } - -- g_array_append_vals (search_array, x_search_dirs, G_N_ELEMENTS (x_search_dirs)); ++ + g_array_append_vals (search_array, x_search_dirs, G_N_ELEMENTS (x_search_dirs)); + } @@ -1817,7 +1866,94 @@ index 5c5903a49..a53fb9804 100644 if (WIFEXITED (status)) { g_debug ("GdmSession: Emitting 'session-exited' signal with exit code '%d'", -@@ -2197,68 +2203,72 @@ close_conversation (GdmSessionConversation *conversation) +@@ -968,73 +974,76 @@ worker_on_reauthenticated (GdmDBusWorker *worker, + static void + worker_on_saved_language_name_read (GdmDBusWorker *worker, + const char *language_name, + GdmSessionConversation *conversation) + { + GdmSession *self = conversation->session; + + if (strlen (language_name) > 0) { + g_free (self->saved_language); + self->saved_language = g_strdup (language_name); + + if (self->greeter_interface != NULL) { + gdm_dbus_greeter_emit_default_language_name_changed (self->greeter_interface, + language_name); + } + } + } + + static void + worker_on_saved_session_name_read (GdmDBusWorker *worker, + const char *session_name, + GdmSessionConversation *conversation) + { + GdmSession *self = conversation->session; + + if (! get_session_command_for_name (self, session_name, NULL)) { + /* ignore sessions that don't exist */ + g_debug ("GdmSession: not using invalid .dmrc session: %s", session_name); + g_free (self->saved_session); + self->saved_session = NULL; +- } else if (strcmp (session_name, +- get_default_session_name (self)) != 0) { +- g_free (self->saved_session); +- self->saved_session = g_strdup (session_name); +- +- if (self->greeter_interface != NULL) { +- gdm_dbus_greeter_emit_default_session_name_changed (self->greeter_interface, +- session_name); ++ update_session_type (self); ++ } else { ++ if (strcmp (session_name, ++ get_default_session_name (self)) != 0) { ++ g_free (self->saved_session); ++ self->saved_session = g_strdup (session_name); ++ ++ if (self->greeter_interface != NULL) { ++ gdm_dbus_greeter_emit_default_session_name_changed (self->greeter_interface, ++ session_name); ++ } + } ++ if (self->saved_session_type != NULL) ++ set_session_type (self, self->saved_session_type); + } + +- update_session_type (self); +- + } + + static GdmSessionConversation * + find_conversation_by_pid (GdmSession *self, + GPid pid) + { + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init (&iter, self->conversations); + while (g_hash_table_iter_next (&iter, &key, &value)) { + GdmSessionConversation *conversation; + + conversation = (GdmSessionConversation *) value; + + if (conversation->worker_pid == pid) { + return conversation; + } + } + + return NULL; + } + + static gboolean + allow_worker_function (GDBusAuthObserver *observer, + GIOStream *stream, + GCredentials *credentials, + GdmSession *self) + { + uid_t connecting_user; +@@ -2197,68 +2206,72 @@ close_conversation (GdmSessionConversation *conversation) if (conversation->worker_manager_interface != NULL) { unexport_worker_manager_interface (self, conversation->worker_manager_interface); @@ -1895,7 +2031,7 @@ index 5c5903a49..a53fb9804 100644 g_hash_table_insert (self->conversations, g_strdup (service_name), conversation); return TRUE; -@@ -3137,64 +3147,66 @@ gdm_session_get_conversation_session_id (GdmSession *self, +@@ -3137,64 +3150,66 @@ gdm_session_get_conversation_session_id (GdmSession *self, conversation = find_conversation_by_name (self, service_name); @@ -1965,7 +2101,63 @@ index 5c5903a49..a53fb9804 100644 } gboolean -@@ -3479,140 +3491,138 @@ gdm_session_set_property (GObject *object, +@@ -3424,195 +3439,192 @@ set_display_is_initial (GdmSession *self, + { + self->display_is_initial = is_initial; + } + + static void + set_verification_mode (GdmSession *self, + GdmSessionVerificationMode verification_mode) + { + self->verification_mode = verification_mode; + } + + static void + set_allowed_user (GdmSession *self, + uid_t allowed_user) + { + self->allowed_user = allowed_user; + } + + static void + set_conversation_environment (GdmSession *self, + char **environment) + { + g_strfreev (self->conversation_environment); + self->conversation_environment = g_strdupv (environment); + } + + static void + set_session_type (GdmSession *self, + const char *session_type) + { +- ++ g_debug ("GdmSession: setting session to type '%s'", session_type? session_type : ""); + if (g_strcmp0 (self->session_type, session_type) != 0) { +- g_debug ("GdmSession: setting session to type '%s'", session_type? session_type : ""); + g_free (self->session_type); + self->session_type = g_strdup (session_type); + } + } + + static void + gdm_session_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) + { + GdmSession *self; + + self = GDM_SESSION (object); + + switch (prop_id) { + case PROP_SESSION_TYPE: + set_session_type (self, g_value_get_string (value)); + break; + case PROP_DISPLAY_NAME: + set_display_name (self, g_value_get_string (value)); + break; case PROP_DISPLAY_HOSTNAME: set_display_hostname (self, g_value_get_string (value)); break; @@ -2112,7 +2304,7 @@ index 5c5903a49..a53fb9804 100644 if (self->worker_server != NULL) { g_dbus_server_stop (self->worker_server); -@@ -3719,60 +3729,71 @@ gdm_session_class_init (GdmSessionClass *session_class) +@@ -3719,60 +3731,71 @@ gdm_session_class_init (GdmSessionClass *session_class) NULL, NULL, NULL, @@ -2184,7 +2376,7 @@ index 5c5903a49..a53fb9804 100644 0, NULL, NULL, -@@ -3962,69 +3983,67 @@ gdm_session_class_init (GdmSessionClass *session_class) +@@ -3962,69 +3985,67 @@ gdm_session_class_init (GdmSessionClass *session_class) PROP_DISPLAY_X11_AUTHORITY_FILE, g_param_spec_string ("display-x11-authority-file", "display x11 authority file", @@ -2261,7 +2453,7 @@ index 5c5903a49..a53fb9804 100644 NULL); diff --git a/data/gdm.schemas.in b/data/gdm.schemas.in -index 255bff023..a1035f95e 100644 +index 255bff02..a1035f95 100644 --- a/data/gdm.schemas.in +++ b/data/gdm.schemas.in @@ -25,65 +25,75 @@ @@ -2341,7 +2533,7 @@ index 255bff023..a1035f95e 100644 xdmcp/MaxPending i diff --git a/libgdm/gdm-sessions.c b/libgdm/gdm-sessions.c -index 75d442eeb..97ed5ef3d 100644 +index 75d442ee..97ed5ef3 100644 --- a/libgdm/gdm-sessions.c +++ b/libgdm/gdm-sessions.c @@ -163,171 +163,203 @@ load_session_file (const char *id, @@ -2569,5 +2761,5 @@ index 75d442eeb..97ed5ef3d 100644 while (g_hash_table_iter_next (&iter, &key, &value)) { GdmSessionFile *session; -- -2.31.1 +2.27.0 diff --git a/SOURCES/0001-local-display-factory-pause-for-a-few-seconds-before.patch b/SOURCES/0001-local-display-factory-pause-for-a-few-seconds-before.patch index 81d88ac..9a5582a 100644 --- a/SOURCES/0001-local-display-factory-pause-for-a-few-seconds-before.patch +++ b/SOURCES/0001-local-display-factory-pause-for-a-few-seconds-before.patch @@ -1,8 +1,8 @@ -From 5c52259331ce0b37dd1b2b092ff41f96b0e5ce64 Mon Sep 17 00:00:00 2001 +From 903dd62114d24a90fe55a7cf42ea07233fe71879 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 29 Oct 2018 06:57:59 -0400 -Subject: [PATCH] local-display-factory: pause for a few seconds before falling - back to X +Subject: [PATCH] local-display-factory: pause for a few seconds before + falling back to X logind currently gets confused if a session is started immediately as one is shutting down. @@ -16,10 +16,10 @@ http://bugzilla.redhat.com/1643874 1 file changed, 7 insertions(+) diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c -index 0bb3851f1..297c3ac80 100644 +index eba38671..948c5d98 100644 --- a/daemon/gdm-local-display-factory.c +++ b/daemon/gdm-local-display-factory.c -@@ -586,60 +586,67 @@ ensure_display_for_seat (GdmLocalDisplayFactory *factory, +@@ -653,60 +653,67 @@ ensure_display_for_seat (GdmLocalDisplayFactory *factory, preferred_display_server = get_preferred_display_server (factory); if (g_strcmp0 (preferred_display_server, "none") == 0) { @@ -46,24 +46,24 @@ index 0bb3851f1..297c3ac80 100644 is_seat0 = TRUE; falling_back = factory->num_failures > 0; - session_type = gdm_local_display_factory_get_session_type (factory, falling_back); + session_types = gdm_local_display_factory_get_session_types (factory, falling_back); g_debug ("GdmLocalDisplayFactory: New displays on seat0 will use %s%s", - session_type, falling_back? " fallback" : ""); + session_types[0], falling_back? " fallback" : ""); + -+ if (falling_back) { ++ if (falling_back) { + /* workaround logind race for now + * bug 1643874 + */ + g_usleep (2 * G_USEC_PER_SEC); -+ } ++ } } else { is_seat0 = FALSE; g_debug ("GdmLocalDisplayFactory: New displays on seat %s will use X11 fallback", seat_id); /* Force legacy X11 for all auxiliary seats */ seat_supports_graphics = TRUE; - session_type = "x11"; + session_types = g_strdupv ((char **) legacy_session_types); } /* For seat0, we have a fallback logic to still try starting it after @@ -88,5 +88,5 @@ index 0bb3851f1..297c3ac80 100644 g_debug ("GdmLocalDisplayFactory: seat0 doesn't yet support graphics. Waiting %d seconds to try again.", SEAT0_GRAPHICS_CHECK_TIMEOUT); factory->seat0_graphics_check_timeout_id = g_timeout_add_seconds (SEAT0_GRAPHICS_CHECK_TIMEOUT, -- -2.30.1 +2.27.0 diff --git a/SOURCES/0001-worker-don-t-load-user-settings-for-program-sessions.patch b/SOURCES/0001-worker-don-t-load-user-settings-for-program-sessions.patch index f847682..3d8c7ce 100644 --- a/SOURCES/0001-worker-don-t-load-user-settings-for-program-sessions.patch +++ b/SOURCES/0001-worker-don-t-load-user-settings-for-program-sessions.patch @@ -1,4 +1,4 @@ -From 7edce4ef248af01692758caf9dbb945bdd45cb0f Mon Sep 17 00:00:00 2001 +From 70eb29d5eedc2b66e617745be1dd145aac3e177e Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 15 Aug 2018 10:48:16 -0400 Subject: [PATCH 1/4] worker: don't load user settings for program sessions @@ -10,7 +10,7 @@ for its session name 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c -index 774298b95..88fe36c16 100644 +index 774298b9..88fe36c1 100644 --- a/daemon/gdm-session-worker.c +++ b/daemon/gdm-session-worker.c @@ -400,103 +400,108 @@ gdm_session_execute (const char *file, @@ -561,5 +561,5 @@ index 774298b95..88fe36c16 100644 g_return_if_fail (worker->priv != NULL); -- -2.31.1 +2.27.0 diff --git a/SOURCES/0002-libgdm-Sort-session-list.patch b/SOURCES/0002-libgdm-Sort-session-list.patch index abeb851..108c85c 100644 --- a/SOURCES/0002-libgdm-Sort-session-list.patch +++ b/SOURCES/0002-libgdm-Sort-session-list.patch @@ -1,4 +1,4 @@ -From 6bdb7cf9e8ace0d9a42fd921d7192dcfece687fa Mon Sep 17 00:00:00 2001 +From 677d370e892788635c4086b139d78499510fa86c Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 20 Jul 2021 13:36:45 -0400 Subject: [PATCH 2/2] libgdm: Sort session list @@ -11,7 +11,7 @@ This commit changes the code to sort by description. 1 file changed, 19 insertions(+) diff --git a/libgdm/gdm-sessions.c b/libgdm/gdm-sessions.c -index 97ed5ef3d..f078e04b8 100644 +index 97ed5ef3..f078e04b 100644 --- a/libgdm/gdm-sessions.c +++ b/libgdm/gdm-sessions.c @@ -311,92 +311,111 @@ collect_sessions (void) @@ -127,5 +127,5 @@ index 97ed5ef3d..f078e04b8 100644 if (session == NULL) { return NULL; -- -2.31.1 +2.27.0 diff --git a/SOURCES/0002-session-support-new-accountsservice-Session-and-Sess.patch b/SOURCES/0002-session-support-new-accountsservice-Session-and-Sess.patch index a4d8909..21ea92a 100644 --- a/SOURCES/0002-session-support-new-accountsservice-Session-and-Sess.patch +++ b/SOURCES/0002-session-support-new-accountsservice-Session-and-Sess.patch @@ -1,4 +1,4 @@ -From c4716129cc3042ca9fa2ab7ee420800d85ec09db Mon Sep 17 00:00:00 2001 +From 96e78f519a4d5ce2e5b708035ae1f43eb7c1bbd2 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 14 Aug 2018 14:52:41 -0400 Subject: [PATCH 2/4] session: support new accountsservice Session and @@ -20,7 +20,7 @@ This commit switches GDM over to use the new properties. 5 files changed, 153 insertions(+), 29 deletions(-) diff --git a/daemon/gdm-session-settings.c b/daemon/gdm-session-settings.c -index 484a3b5b4..5b64cb65b 100644 +index 484a3b5b..f2b1addd 100644 --- a/daemon/gdm-session-settings.c +++ b/daemon/gdm-session-settings.c @@ -12,114 +12,121 @@ @@ -305,14 +305,14 @@ index 484a3b5b4..5b64cb65b 100644 - session_name = act_user_get_x_session (settings->priv->user); - g_debug ("GdmSessionSettings: saved session is %s", session_name); -+ + +- if (session_name != NULL) { + + + + session_type = act_user_get_session_type (settings->priv->user); + session_name = act_user_get_session (settings->priv->user); - -- if (session_name != NULL) { ++ + g_debug ("GdmSessionSettings: saved session is %s (type %s)", session_name, session_type); + + if (session_type != NULL && session_type[0] != '\0') { @@ -409,7 +409,7 @@ index 484a3b5b4..5b64cb65b 100644 return TRUE; } diff --git a/daemon/gdm-session-settings.h b/daemon/gdm-session-settings.h -index 20946bff1..db38ffc72 100644 +index 20946bff..db38ffc7 100644 --- a/daemon/gdm-session-settings.h +++ b/daemon/gdm-session-settings.h @@ -33,37 +33,40 @@ G_BEGIN_DECLS @@ -454,7 +454,7 @@ index 20946bff1..db38ffc72 100644 G_END_DECLS #endif /* GDM_SESSION_SETTINGS_H */ diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c -index 88fe36c16..c1201b704 100644 +index 88fe36c1..c1201b70 100644 --- a/daemon/gdm-session-worker.c +++ b/daemon/gdm-session-worker.c @@ -2664,60 +2664,74 @@ gdm_session_worker_handle_set_language_name (GdmDBusWorker *object, @@ -706,7 +706,7 @@ index 88fe36c16..c1201b704 100644 const char *log_file) { diff --git a/daemon/gdm-session-worker.xml b/daemon/gdm-session-worker.xml -index 4280fe095..a215779c8 100644 +index 4280fe09..a215779c 100644 --- a/daemon/gdm-session-worker.xml +++ b/daemon/gdm-session-worker.xml @@ -51,40 +51,43 @@ @@ -754,7 +754,7 @@ index 4280fe095..a215779c8 100644 diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c -index 6e6326243..73ae5cbc5 100644 +index 29459346..43da024f 100644 --- a/daemon/gdm-session.c +++ b/daemon/gdm-session.c @@ -61,60 +61,61 @@ @@ -1222,7 +1222,7 @@ index 6e6326243..73ae5cbc5 100644 static void set_pending_query (GdmSessionConversation *conversation, -@@ -969,80 +989,91 @@ worker_on_reauthenticated (GdmDBusWorker *worker, +@@ -969,83 +989,94 @@ worker_on_reauthenticated (GdmDBusWorker *worker, GdmSession *self = conversation->session; g_debug ("GdmSession: Emitting 'reauthenticated' signal "); g_signal_emit (self, signals[REAUTHENTICATED], 0, service_name); @@ -1259,19 +1259,22 @@ index 6e6326243..73ae5cbc5 100644 g_debug ("GdmSession: not using invalid .dmrc session: %s", session_name); g_free (self->saved_session); self->saved_session = NULL; - } else if (strcmp (session_name, - get_default_session_name (self)) != 0) { - g_free (self->saved_session); - self->saved_session = g_strdup (session_name); - - if (self->greeter_interface != NULL) { - gdm_dbus_greeter_emit_default_session_name_changed (self->greeter_interface, - session_name); + update_session_type (self); + } else { + if (strcmp (session_name, + get_default_session_name (self)) != 0) { + g_free (self->saved_session); + self->saved_session = g_strdup (session_name); + + if (self->greeter_interface != NULL) { + gdm_dbus_greeter_emit_default_session_name_changed (self->greeter_interface, + session_name); + } } + if (self->saved_session_type != NULL) + set_session_type (self, self->saved_session_type); } - update_session_type (self); - } +static void @@ -1315,7 +1318,7 @@ index 6e6326243..73ae5cbc5 100644 uid_t connecting_user; connecting_user = g_credentials_get_unix_user (credentials, NULL); -@@ -1122,60 +1153,63 @@ register_worker (GdmDBusWorkerManager *worker_manager_interface, +@@ -1125,60 +1156,63 @@ register_worker (GdmDBusWorkerManager *worker_manager_interface, g_dbus_method_invocation_return_value (invocation, NULL); conversation->worker_proxy = gdm_dbus_worker_proxy_new_sync (connection, @@ -1379,7 +1382,7 @@ index 6e6326243..73ae5cbc5 100644 g_debug ("GdmSession: Conversation started"); return TRUE; -@@ -1918,60 +1952,63 @@ free_conversation (GdmSessionConversation *conversation) +@@ -1921,60 +1955,63 @@ free_conversation (GdmSessionConversation *conversation) close_conversation (conversation); if (conversation->job != NULL) { @@ -1443,7 +1446,7 @@ index 6e6326243..73ae5cbc5 100644 error = NULL; if (!g_file_get_contents (config_file, &contents, &length, &error)) { g_debug ("Failed to parse '%s': %s", -@@ -2530,83 +2567,83 @@ gdm_session_send_environment (GdmSession *self, +@@ -2533,83 +2570,83 @@ gdm_session_send_environment (GdmSession *self, g_return_if_fail (GDM_IS_SESSION (self)); conversation = find_conversation_by_name (self, service_name); @@ -1529,7 +1532,7 @@ index 6e6326243..73ae5cbc5 100644 g_strdup (value)); } -@@ -3176,148 +3213,150 @@ gdm_session_get_conversation_session_id (GdmSession *self, +@@ -3179,148 +3216,150 @@ gdm_session_get_conversation_session_id (GdmSession *self, conversation = find_conversation_by_name (self, service_name); if (conversation == NULL) { @@ -1689,5 +1692,5 @@ index 6e6326243..73ae5cbc5 100644 self->display_seat_id); -- -2.31.1 +2.27.0 diff --git a/SOURCES/0003-daemon-save-os-release-in-accountsservice.patch b/SOURCES/0003-daemon-save-os-release-in-accountsservice.patch index 05682b9..b670407 100644 --- a/SOURCES/0003-daemon-save-os-release-in-accountsservice.patch +++ b/SOURCES/0003-daemon-save-os-release-in-accountsservice.patch @@ -1,4 +1,4 @@ -From 09e4f57ea2525e48bd22a34cb0c9b917ce7565df Mon Sep 17 00:00:00 2001 +From bd5153305b576f29ea3b8835bd2740a5eda2db0f Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 20 Aug 2018 14:30:59 -0400 Subject: [PATCH 3/4] daemon: save os-release in accountsservice @@ -17,7 +17,7 @@ This commit saves that information in accountsservice. diff --git a/daemon/com.redhat.AccountsServiceUser.System.xml b/daemon/com.redhat.AccountsServiceUser.System.xml new file mode 100644 -index 000000000..67f5f302c +index 00000000..67f5f302 --- /dev/null +++ b/daemon/com.redhat.AccountsServiceUser.System.xml @@ -0,0 +1,10 @@ @@ -32,7 +32,7 @@ index 000000000..67f5f302c + + diff --git a/daemon/gdm-session-settings.c b/daemon/gdm-session-settings.c -index 5b64cb65b..5bcfdc14f 100644 +index f2b1addd..a4b7f1a6 100644 --- a/daemon/gdm-session-settings.c +++ b/daemon/gdm-session-settings.c @@ -1,70 +1,77 @@ @@ -233,9 +233,9 @@ index 5b64cb65b..5bcfdc14f 100644 + } + } + - - - + + + session_type = act_user_get_session_type (settings->priv->user); session_name = act_user_get_session (settings->priv->user); @@ -401,7 +401,7 @@ index 5b64cb65b..5bcfdc14f 100644 return TRUE; } diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c -index 73ae5cbc5..ce6df14c6 100644 +index 43da024f..c8e04c1b 100644 --- a/daemon/gdm-session.c +++ b/daemon/gdm-session.c @@ -351,72 +351,72 @@ supports_session_type (GdmSession *self, @@ -480,7 +480,7 @@ index 73ae5cbc5..ce6df14c6 100644 } diff --git a/daemon/meson.build b/daemon/meson.build -index 2e61b6447..71c650398 100644 +index 2e61b644..71c65039 100644 --- a/daemon/meson.build +++ b/daemon/meson.build @@ -15,114 +15,122 @@ local_display_dbus_gen = gnome.gdbus_codegen('gdm-local-display-glue', @@ -607,5 +607,5 @@ index 2e61b6447..71c650398 100644 gdm_session_worker = executable('gdm-session-worker', -- -2.31.1 +2.27.0 diff --git a/SOURCES/0004-daemon-handle-upgrades-from-RHEL-7.patch b/SOURCES/0004-daemon-handle-upgrades-from-RHEL-7.patch index bb72e64..6d56e3c 100644 --- a/SOURCES/0004-daemon-handle-upgrades-from-RHEL-7.patch +++ b/SOURCES/0004-daemon-handle-upgrades-from-RHEL-7.patch @@ -1,4 +1,4 @@ -From de103948b84188cd2273c9aab904a633323a9479 Mon Sep 17 00:00:00 2001 +From b7c0541ffccf43994a3e418c4012b17a6dd8b630 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 20 Aug 2018 14:30:59 -0400 Subject: [PATCH 4/4] daemon: handle upgrades from RHEL 7 @@ -16,7 +16,7 @@ try to get the right settings. 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/daemon/gdm-session-settings.c b/daemon/gdm-session-settings.c -index 5bcfdc14f..a7eaa8b2f 100644 +index a4b7f1a6..a84b2ffa 100644 --- a/daemon/gdm-session-settings.c +++ b/daemon/gdm-session-settings.c @@ -270,95 +270,114 @@ gdm_session_settings_get_property (GObject *object, @@ -80,9 +80,9 @@ index 5bcfdc14f..a7eaa8b2f 100644 } } - - - + + + session_type = act_user_get_session_type (settings->priv->user); session_name = act_user_get_session (settings->priv->user); @@ -135,10 +135,10 @@ index 5bcfdc14f..a7eaa8b2f 100644 settings); } diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c -index ce6df14c6..6bda6d6e2 100644 +index c8e04c1b..3103e9df 100644 --- a/daemon/gdm-session.c +++ b/daemon/gdm-session.c -@@ -3202,98 +3202,95 @@ gdm_session_get_session_id (GdmSession *self) +@@ -3205,98 +3205,95 @@ gdm_session_get_session_id (GdmSession *self) return conversation->session_id; } @@ -246,5 +246,5 @@ index ce6df14c6..6bda6d6e2 100644 if (!session_registers && error != NULL && -- -2.31.1 +2.27.0 diff --git a/SPECS/gdm.spec b/SPECS/gdm.spec index b97a14a..67e7819 100644 --- a/SPECS/gdm.spec +++ b/SPECS/gdm.spec @@ -12,7 +12,7 @@ Name: gdm Epoch: 1 Version: 40.0 -Release: 12%{?dist} +Release: 13%{?dist} Summary: The GNOME Display Manager License: GPLv2+ @@ -360,6 +360,11 @@ fi %{_libdir}/pkgconfig/gdm-pam-extensions.pc %changelog +* Wed Sep 01 2021 Ray Strode - 40.0-13 +- Disable Wayland on HyperV +- Fix Xorg fallback + Related: #1998989 + * Thu Aug 19 2021 Ray Strode - 40.0-12 - Redisable on server chips since rebase Related: #1909300