summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2024-08-02 07:02:42 +0000
committerCoprDistGit <infra@openeuler.org>2024-08-02 07:02:42 +0000
commit0146b4281119abb87bf869b338f333f09dbc8f84 (patch)
tree9f785b401970a7c8be7f8a51cb3bbf1f448062a0
parentad790728cab5990635f0bf2f7b9bb71bab07b866 (diff)
automatic import of gdmopeneuler24.03_LTSopeneuler23.09
-rw-r--r--.gitignore1
-rw-r--r--0001-Honor-initial-setup-being-disabled-by-distro-install.patch159
-rw-r--r--0001-data-Disable-network-configuration-on-login-screen.patch103
-rw-r--r--0001-data-add-system-dconf-databases-to-gdm-profile.patch24
-rw-r--r--0001-data-reap-gdm-sessions-on-shutdown.patch55
-rw-r--r--0001-gdm-session-Force-reuse-vt-mode-for-legacy-Xorg-mode.patch88
-rw-r--r--0001-local-display-factory-Don-t-try-to-respawn-displays-.patch325
-rw-r--r--0001-local-display-factory-Provide-more-flexibility-for-c.patch2452
-rw-r--r--0001-local-display-factory-Stall-startup-until-main-graph.patch729
-rw-r--r--0001-manager-Fix-btmp-record-accounting.patch227
-rw-r--r--0001-manager-allow-multiple-xdmcp-logins-for-the-same-use.patch344
-rw-r--r--0001-meson-Fix-detection-of-Xorg-versions-that-need-liste.patch144
-rw-r--r--0001-session-settings-Explicitly-cache-remote-users.patch45
-rw-r--r--0001-session-settings-Fetch-session-from-user-even-if-use.patch89
-rw-r--r--0001-session-worker-Set-session_vt-0-out-of-pam-uninitial.patch84
-rw-r--r--0001-xdmcp-display-factory-Set-supported-session-types-fo.patch122
-rw-r--r--0002-common-Add-API-to-reload-settings-from-disk.patch356
-rw-r--r--0002-daemon-Don-t-update-session-type-if-no-saved-session.patch109
-rw-r--r--0002-daemon-Support-X-servers-built-with-Dlisten_tcp-true.patch327
-rw-r--r--0002-gdm-x-session-run-session-bus-on-non-seat0-seats.patch151
-rw-r--r--0002-local-display-factory-Fix-user-switching-with-legacy.patch384
-rw-r--r--0003-common-Reload-settings-when-graphics-initialize.patch155
-rw-r--r--0003-daemon-Infer-session-type-from-desktop-file-if-user-.patch87
-rw-r--r--0003-session-ensure-login-screen-over-XDMCP-connects-to-i.patch105
-rw-r--r--0004-daemon-Consolidate-session-type-and-supported-sessio.patch559
-rw-r--r--0004-data-Use-latest-upstream-udev-rules.patch149
-rw-r--r--0005-local-display-factory-Don-t-crash-if-Xorg-and-Waylan.patch96
-rw-r--r--default.pa-for-gdm9
-rw-r--r--gdm-tmpfiles.conf7
-rw-r--r--gdm.spec3342
-rw-r--r--org.gnome.login-screen.gschema.override3
-rw-r--r--sources1
32 files changed, 10831 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..0b3af05 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/gdm-40.1.tar.xz
diff --git a/0001-Honor-initial-setup-being-disabled-by-distro-install.patch b/0001-Honor-initial-setup-being-disabled-by-distro-install.patch
new file mode 100644
index 0000000..b712857
--- /dev/null
+++ b/0001-Honor-initial-setup-being-disabled-by-distro-install.patch
@@ -0,0 +1,159 @@
+From f6ebcec5d48aeff718a9db9b8ff812fd404a61ed Mon Sep 17 00:00:00 2001
+From: Rui Matos <tiagomatos@gmail.com>
+Date: Mon, 23 Jan 2017 20:19:51 +0100
+Subject: [PATCH] Honor initial setup being disabled by distro installer
+
+Sysadmins might want to disable any kind of initial setup for their
+users, perhaps because they pre-configure their environments. We
+already provide a configuration file option for this but distro
+installers might have their own way of requesting this.
+
+At least the anaconda installer provides an option to skip any kind
+post-install setup tools so, for now we're only adding support for
+that but more might be added in the future.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=777708
+---
+ daemon/gdm-display.c | 29 +++++++++++++++++++++++++++++
+ 1 file changed, 29 insertions(+)
+
+diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
+index 34467856..9438fe72 100644
+--- a/daemon/gdm-display.c
++++ b/daemon/gdm-display.c
+@@ -1621,103 +1621,132 @@ kernel_cmdline_initial_setup_force_state (gboolean *force_state)
+ GError *error = NULL;
+ gchar *contents = NULL;
+ gchar *setup_argument = NULL;
+
+ g_return_val_if_fail (force_state != NULL, FALSE);
+
+ if (!g_file_get_contents ("/proc/cmdline", &contents, NULL, &error)) {
+ g_debug ("GdmDisplay: Could not check kernel parameters, not forcing initial setup: %s",
+ error->message);
+ g_clear_error (&error);
+ return FALSE;
+ }
+
+ g_debug ("GdmDisplay: Checking kernel command buffer %s", contents);
+
+ if (!kernel_cmdline_initial_setup_argument (contents, &setup_argument, &error)) {
+ g_debug ("GdmDisplay: Failed to read kernel commandline: %s", error->message);
+ g_clear_pointer (&contents, g_free);
+ return FALSE;
+ }
+
+ g_clear_pointer (&contents, g_free);
+
+ /* Poor-man's check for truthy or falsey values */
+ *force_state = setup_argument[0] == '1';
+
+ g_free (setup_argument);
+ return TRUE;
+ }
+
++static gboolean
++initial_setup_disabled_by_anaconda (void)
++{
++ GKeyFile *key_file;
++ const gchar *file_name = SYSCONFDIR "/sysconfig/anaconda";
++ gboolean disabled = FALSE;
++ GError *error = NULL;
++
++ key_file = g_key_file_new ();
++ if (!g_key_file_load_from_file (key_file, file_name, G_KEY_FILE_NONE, &error)) {
++ if (!g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT) &&
++ !g_error_matches (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_NOT_FOUND)) {
++ g_warning ("Could not read %s: %s", file_name, error->message);
++ }
++ g_error_free (error);
++ goto out;
++ }
++
++ disabled = g_key_file_get_boolean (key_file, "General",
++ "post_install_tools_disabled", NULL);
++ out:
++ g_key_file_unref (key_file);
++ return disabled;
++}
++
+ static gboolean
+ wants_initial_setup (GdmDisplay *self)
+ {
+ GdmDisplayPrivate *priv;
+ gboolean enabled = FALSE;
+ gboolean forced = FALSE;
+
+ priv = gdm_display_get_instance_private (self);
+
+ if (already_done_initial_setup_on_this_boot ()) {
+ return FALSE;
+ }
+
+ if (kernel_cmdline_initial_setup_force_state (&forced)) {
+ if (forced) {
+ g_debug ("GdmDisplay: Forcing gnome-initial-setup");
+ return TRUE;
+ }
+
+ g_debug ("GdmDisplay: Forcing no gnome-initial-setup");
+ return FALSE;
+ }
+
+ /* don't run initial-setup on remote displays
+ */
+ if (!priv->is_local) {
+ return FALSE;
+ }
+
+ /* don't run if the system has existing users */
+ if (priv->have_existing_user_accounts) {
+ return FALSE;
+ }
+
+ /* don't run if initial-setup is unavailable */
+ if (!can_create_environment ("gnome-initial-setup")) {
+ return FALSE;
+ }
+
+ if (!gdm_settings_direct_get_boolean (GDM_KEY_INITIAL_SETUP_ENABLE, &enabled)) {
+ return FALSE;
+ }
+
++ if (initial_setup_disabled_by_anaconda ()) {
++ return FALSE;
++ }
++
+ return enabled;
+ }
+
+ void
+ gdm_display_start_greeter_session (GdmDisplay *self)
+ {
+ GdmDisplayPrivate *priv;
+ GdmSession *session;
+ char *display_name;
+ char *seat_id;
+ char *hostname;
+ char *auth_file = NULL;
+
+ priv = gdm_display_get_instance_private (self);
+ g_return_if_fail (g_strcmp0 (priv->session_class, "greeter") == 0);
+
+ g_debug ("GdmDisplay: Running greeter");
+
+ display_name = NULL;
+ seat_id = NULL;
+ hostname = NULL;
+
+ g_object_get (self,
+ "x11-display-name", &display_name,
+ "seat-id", &seat_id,
+ "remote-hostname", &hostname,
+ NULL);
+ if (priv->access_file != NULL) {
+ auth_file = gdm_display_access_file_get_path (priv->access_file);
+ }
+--
+2.32.0
+
diff --git a/0001-data-Disable-network-configuration-on-login-screen.patch b/0001-data-Disable-network-configuration-on-login-screen.patch
new file mode 100644
index 0000000..7a1d38d
--- /dev/null
+++ b/0001-data-Disable-network-configuration-on-login-screen.patch
@@ -0,0 +1,103 @@
+From aa1c4a7708df2edbc12f2ada7249208aef586d1e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
+Date: Tue, 8 Jun 2021 20:45:00 +0200
+Subject: [PATCH] data: Disable network configuration on login screen
+
+---
+ data/meson.build | 10 ++++++++++
+ data/org.gnome.gdm.rules.in | 8 ++++++++
+ 2 files changed, 18 insertions(+)
+ create mode 100644 data/org.gnome.gdm.rules.in
+
+diff --git a/data/meson.build b/data/meson.build
+index 7c5222ea..20d39a36 100644
+--- a/data/meson.build
++++ b/data/meson.build
+@@ -130,60 +130,70 @@ pam_data_files_map = {
+ ],
+ 'arch': [
+ 'gdm-autologin',
+ 'gdm-launch-environment',
+ 'gdm-fingerprint',
+ 'gdm-smartcard',
+ 'gdm-password',
+ ],
+ 'none': [],
+ # We should no longer have 'autodetect' at this point
+ }
+
+ pam_data_files = pam_data_files_map[default_pam_config]
+ pam_prefix = (get_option('pam-prefix') != '')? get_option('pam-prefix') : get_option('sysconfdir')
+ foreach _pam_filename : pam_data_files
+ install_data('pam-@0@/@1@.pam'.format(default_pam_config, _pam_filename),
+ rename: _pam_filename,
+ install_dir: pam_prefix / 'pam.d',
+ )
+ endforeach
+
+ gdm_rules = configure_file(
+ input: '61-gdm.rules.in',
+ output: '@BASENAME@',
+ configuration: {
+ 'libexecdir': gdm_prefix / get_option('libexecdir'),
+ },
+ install_dir: udev_dir,
+ )
+
++# Polkit rules
++polkit_rules = configure_file(
++ input: 'org.gnome.gdm.rules.in',
++ output: '@BASENAME@',
++ configuration: {
++ 'GDM_USERNAME': get_option('user'),
++ },
++ install_dir: get_option('datadir') / 'polkit-1' / 'rules.d',
++)
++
+ # DBus service files
+ service_config = configuration_data()
+ service_config.set('sbindir', gdm_prefix / get_option('sbindir'))
+ service_config.set('GDM_INITIAL_VT', get_option('initial-vt'))
+ service_config.set('LANG_CONFIG_FILE', lang_config_file)
+ if plymouth_dep.found()
+ service_config.set('PLYMOUTH_QUIT_SERVICE', 'plymouth-quit.service')
+ else
+ service_config.set('PLYMOUTH_QUIT_SERVICE', '')
+ endif
+
+ if get_option('systemdsystemunitdir') != ''
+ systemd_systemunitdir = get_option('systemdsystemunitdir')
+ else
+ systemd_systemunitdir = systemd_dep.get_pkgconfig_variable('systemdsystemunitdir')
+ endif
+
+ if get_option('systemduserunitdir') != ''
+ systemd_userunitdir = get_option('systemduserunitdir')
+ else
+ systemd_userunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir',
+ define_variable: ['prefix', get_option('prefix')])
+ endif
+
+ configure_file(
+ input: 'gdm.service.in',
+ output: '@BASENAME@',
+ configuration: service_config,
+ install_dir: systemd_systemunitdir,
+ format: 'cmake'
+diff --git a/data/org.gnome.gdm.rules.in b/data/org.gnome.gdm.rules.in
+new file mode 100644
+index 00000000..09544f11
+--- /dev/null
++++ b/data/org.gnome.gdm.rules.in
+@@ -0,0 +1,8 @@
++polkit.addRule(function(action, subject) {
++ if (action.id == "org.freedesktop.NetworkManager.network-control" &&
++ subject.user == "@GDM_USERNAME@") {
++ return polkit.Result.NO;
++ }
++
++ return polkit.Result.NOT_HANDLED;
++});
+--
+2.32.0
+
diff --git a/0001-data-add-system-dconf-databases-to-gdm-profile.patch b/0001-data-add-system-dconf-databases-to-gdm-profile.patch
new file mode 100644
index 0000000..bfaf66c
--- /dev/null
+++ b/0001-data-add-system-dconf-databases-to-gdm-profile.patch
@@ -0,0 +1,24 @@
+From 3e62d7b423175102bd2376adc9cf58ad736b23b0 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Wed, 31 Jul 2013 17:32:55 -0400
+Subject: [PATCH] data: add system dconf databases to gdm profile
+
+This way system settings can affect the login screen.
+---
+ data/dconf/gdm.in | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/data/dconf/gdm.in b/data/dconf/gdm.in
+index 4d8bf174..9694078f 100644
+--- a/data/dconf/gdm.in
++++ b/data/dconf/gdm.in
+@@ -1,2 +1,6 @@
+ user-db:user
++system-db:gdm
++system-db:local
++system-db:site
++system-db:distro
+ file-db:@DATADIR@/@PACKAGE@/greeter-dconf-defaults
+--
+2.32.0
+
diff --git a/0001-data-reap-gdm-sessions-on-shutdown.patch b/0001-data-reap-gdm-sessions-on-shutdown.patch
new file mode 100644
index 0000000..fb878aa
--- /dev/null
+++ b/0001-data-reap-gdm-sessions-on-shutdown.patch
@@ -0,0 +1,55 @@
+From a4743b9b2b355f84da3904e7da93ec3c7a521895 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Fri, 26 Jul 2019 14:06:16 -0400
+Subject: [PATCH] data: reap gdm sessions on shutdown
+
+If GDM gets shutdown we should make sure all sessions get shutdown too.
+
+This is a bit of a safety net in case any processes in the session are
+lingering after the orderly shutdown.
+---
+ data/gdm.service.in | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/data/gdm.service.in b/data/gdm.service.in
+index 17e8a8de..195bd0fd 100644
+--- a/data/gdm.service.in
++++ b/data/gdm.service.in
+@@ -1,33 +1,34 @@
+ [Unit]
+ Description=GNOME Display Manager
+
+ # replaces the getty
+ Conflicts=getty@tty${GDM_INITIAL_VT}.service
+ After=getty@tty${GDM_INITIAL_VT}.service
+
+ # replaces plymouth-quit since it quits plymouth on its own
+ Conflicts=${PLYMOUTH_QUIT_SERVICE}
+ After=${PLYMOUTH_QUIT_SERVICE}
+
+ # Needs all the dependencies of the services it's replacing
+ # pulled from getty@.service and ${PLYMOUTH_QUIT_SERVICE}
+ # (except for plymouth-quit-wait.service since it waits until
+ # plymouth is quit, which we do)
+ After=rc-local.service plymouth-start.service systemd-user-sessions.service
+
+ # GDM takes responsibility for stopping plymouth, so if it fails
+ # for any reason, make sure plymouth still stops
+ OnFailure=plymouth-quit.service
+
+ [Service]
+ ExecStart=${sbindir}/gdm
++ExecStopPost=-/usr/bin/bash -c 'for f in /run/systemd/sessions/*; do [ -f $f ] && /usr/bin/fgrep -q SERVICE=gdm $f && loginctl terminate-session $(basename $f); done'
+ KillMode=mixed
+ Restart=always
+ IgnoreSIGPIPE=no
+ BusName=org.gnome.DisplayManager
+ EnvironmentFile=-${LANG_CONFIG_FILE}
+ ExecReload=/bin/kill -SIGHUP $MAINPID
+ KeyringMode=shared
+
+ [Install]
+ Alias=display-manager.service
+--
+2.32.0
+
diff --git a/0001-gdm-session-Force-reuse-vt-mode-for-legacy-Xorg-mode.patch b/0001-gdm-session-Force-reuse-vt-mode-for-legacy-Xorg-mode.patch
new file mode 100644
index 0000000..4b71ddd
--- /dev/null
+++ b/0001-gdm-session-Force-reuse-vt-mode-for-legacy-Xorg-mode.patch
@@ -0,0 +1,88 @@
+From bcab8852cf7249a2220f6c737f7bb8a17b99249a Mon Sep 17 00:00:00 2001
+From: rpm-build <rpm-build>
+Date: Mon, 27 Nov 2023 15:29:09 -0500
+Subject: [PATCH 1/2] gdm-session: Force reuse vt mode for legacy Xorg mode
+
+In the legacy Xorg mode, the X session and user session are
+supposed to use the same VT.
+
+Unfortunately, right now GDM thinks they will use different
+VTs and that breaks PreferredDisplayServer=legacy-xorg.
+
+This commit fixes that.
+---
+ daemon/gdm-session.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
+index 9f68166..43e3ea6 100644
+--- a/daemon/gdm-session.c
++++ b/daemon/gdm-session.c
+@@ -3343,60 +3343,64 @@ gdm_session_bypasses_xsession (GdmSession *self)
+ if (error) {
+ bypasses_xsession = FALSE;
+ g_error_free (error);
+ goto out;
+ }
+ }
+
+ out:
+ if (bypasses_xsession) {
+ g_debug ("GdmSession: Session %s bypasses Xsession wrapper script", filename);
+ }
+ g_free (filename);
+ return bypasses_xsession;
+ }
+
+ GdmSessionDisplayMode
+ gdm_session_get_display_mode (GdmSession *self)
+ {
+ g_debug ("GdmSession: type %s, program? %s, seat %s",
+ self->session_type,
+ self->is_program_session? "yes" : "no",
+ self->display_seat_id);
+
+ /* Non-seat0 sessions share their X server with their login screen
+ * for now.
+ */
+ if (g_strcmp0 (self->display_seat_id, "seat0") != 0) {
+ return GDM_SESSION_DISPLAY_MODE_REUSE_VT;
+ }
+
++ if (self->display_x11_authority_file != NULL) {
++ return GDM_SESSION_DISPLAY_MODE_REUSE_VT;
++ }
++
+ #ifdef ENABLE_USER_DISPLAY_SERVER
+ /* All other cases (wayland login screen, X login screen,
+ * wayland user session, X user session) use the NEW_VT
+ * display mode. That display mode means that GDM allocates
+ * a new VT and jumps to it before starting the session. The
+ * session is expected to use logind to gain access to the
+ * display and input devices.
+ *
+ * GDM also has a LOGIND_MANAGED display mode which we can't
+ * use yet. The difference between it and NEW_VT, is with it,
+ * GDM doesn't do any VT handling at all, expecting the session
+ * and logind to do everything. The problem is, for wayland
+ * sessions it will cause flicker until * this bug is fixed:
+ *
+ * https://bugzilla.gnome.org/show_bug.cgi?id=745141
+ *
+ * Likewise, for X sessions it's problematic because
+ * 1) X doesn't call TakeControl before switching VTs
+ * 2) X doesn't support getting started "in the background"
+ * right now. It will die with an error if logind devices
+ * are paused when handed out.
+ */
+ return GDM_SESSION_DISPLAY_MODE_NEW_VT;
+ #else
+
+ #ifdef ENABLE_WAYLAND_SUPPORT
+ /* Wayland sessions are for now assumed to run in a
+ * mutter-launch-like environment, so we allocate
+ * a new VT for them. */
+ if (g_strcmp0 (self->session_type, "wayland") == 0) {
+--
+2.41.0
+
diff --git a/0001-local-display-factory-Don-t-try-to-respawn-displays-.patch b/0001-local-display-factory-Don-t-try-to-respawn-displays-.patch
new file mode 100644
index 0000000..45344c5
--- /dev/null
+++ b/0001-local-display-factory-Don-t-try-to-respawn-displays-.patch
@@ -0,0 +1,325 @@
+From 9261fcd05667fc5f8b81880577e41a566db821a8 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Wed, 15 Sep 2021 11:23:17 -0400
+Subject: [PATCH] local-display-factory: Don't try to respawn displays on
+ shutdown
+
+At the moment in the shutdown path we may try to respawn displays
+that just got killed.
+
+The respawning happens when things are half torn down leading to
+crashes.
+
+This commit makes sure we turn off the respawn logic in the shutdown
+path.
+---
+ daemon/gdm-local-display-factory.c | 11 ++++++++++-
+ daemon/gdm-manager.c | 2 ++
+ 2 files changed, 12 insertions(+), 1 deletion(-)
+
+diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
+index 141d64c6..bca41f6e 100644
+--- a/daemon/gdm-local-display-factory.c
++++ b/daemon/gdm-local-display-factory.c
+@@ -46,60 +46,62 @@
+ #define GDM_LOCAL_DISPLAY_FACTORY_DBUS_PATH GDM_DBUS_PATH "/LocalDisplayFactory"
+ #define GDM_MANAGER_DBUS_NAME "org.gnome.DisplayManager.LocalDisplayFactory"
+
+ #define MAX_DISPLAY_FAILURES 5
+ #define WAIT_TO_FINISH_TIMEOUT 10 /* seconds */
+ #define SEAT0_GRAPHICS_CHECK_TIMEOUT 10 /* seconds */
+
+ struct _GdmLocalDisplayFactory
+ {
+ GdmDisplayFactory parent;
+
+ GdmDBusLocalDisplayFactory *skeleton;
+ GDBusConnection *connection;
+ GHashTable *used_display_numbers;
+
+ /* FIXME: this needs to be per seat? */
+ guint num_failures;
+
+ guint seat_new_id;
+ guint seat_removed_id;
+ guint seat_properties_changed_id;
+
+ gboolean seat0_graphics_check_timed_out;
+ guint seat0_graphics_check_timeout_id;
+
+ #if defined(ENABLE_USER_DISPLAY_SERVER)
+ unsigned int active_vt;
+ guint active_vt_watch_id;
+ guint wait_to_finish_timeout_id;
+ #endif
++
++ gboolean is_started;
+ };
+
+ enum {
+ PROP_0,
+ };
+
+ static void gdm_local_display_factory_class_init (GdmLocalDisplayFactoryClass *klass);
+ static void gdm_local_display_factory_init (GdmLocalDisplayFactory *factory);
+ static void gdm_local_display_factory_finalize (GObject *object);
+
+ static void ensure_display_for_seat (GdmLocalDisplayFactory *factory,
+ const char *seat_id);
+
+ static void on_display_status_changed (GdmDisplay *display,
+ GParamSpec *arg1,
+ GdmLocalDisplayFactory *factory);
+
+ static gboolean gdm_local_display_factory_sync_seats (GdmLocalDisplayFactory *factory);
+ static gpointer local_display_factory_object = NULL;
+ static gboolean lookup_by_session_id (const char *id,
+ GdmDisplay *display,
+ gpointer user_data);
+
+ G_DEFINE_TYPE (GdmLocalDisplayFactory, gdm_local_display_factory, GDM_TYPE_DISPLAY_FACTORY)
+
+ GQuark
+ gdm_local_display_factory_error_quark (void)
+ {
+ static GQuark ret = 0;
+ if (ret == 0) {
+@@ -416,60 +418,64 @@ on_session_registered_cb (GObject *gobject,
+ GParamSpec *pspec,
+ gpointer user_data)
+ {
+ GdmDisplay *display = GDM_DISPLAY (gobject);
+ GdmLocalDisplayFactory *factory = GDM_LOCAL_DISPLAY_FACTORY (user_data);
+ gboolean registered;
+
+ g_object_get (display, "session-registered", &registered, NULL);
+
+ if (!registered)
+ return;
+
+ g_debug ("GdmLocalDisplayFactory: session registered on display, looking for any background displays to kill");
+
+ finish_waiting_displays_on_seat (factory, "seat0");
+ }
+
+ static void
+ on_display_status_changed (GdmDisplay *display,
+ GParamSpec *arg1,
+ GdmLocalDisplayFactory *factory)
+ {
+ int status;
+ int num;
+ char *seat_id = NULL;
+ char *session_type = NULL;
+ char *session_class = NULL;
+ gboolean is_initial = TRUE;
+ gboolean is_local = TRUE;
+
++
++ if (!factory->is_started)
++ return;
++
+ num = -1;
+ gdm_display_get_x11_display_number (display, &num, NULL);
+
+ g_object_get (display,
+ "seat-id", &seat_id,
+ "is-initial", &is_initial,
+ "is-local", &is_local,
+ "session-type", &session_type,
+ "session-class", &session_class,
+ NULL);
+
+ status = gdm_display_get_status (display);
+
+ g_debug ("GdmLocalDisplayFactory: display status changed: %d", status);
+ switch (status) {
+ case GDM_DISPLAY_FINISHED:
+ /* remove the display number from factory->used_display_numbers
+ so that it may be reused */
+ if (num != -1) {
+ g_hash_table_remove (factory->used_display_numbers, GUINT_TO_POINTER (num));
+ }
+ gdm_display_factory_queue_purge_displays (GDM_DISPLAY_FACTORY (factory));
+
+ /* if this is a local display, do a full resync. Only
+ * seats without displays will get created anyway. This
+ * ensures we get a new login screen when the user logs out,
+ * if there isn't one.
+ */
+ if (is_local && g_strcmp0 (session_class, "greeter") != 0) {
+ /* reset num failures */
+@@ -1204,99 +1210,102 @@ on_display_added (GdmDisplayStore *display_store,
+
+ display = gdm_display_store_lookup (display_store, id);
+
+ if (display != NULL) {
+ g_signal_connect_object (display, "notify::status",
+ G_CALLBACK (on_display_status_changed),
+ factory,
+ 0);
+
+ g_object_weak_ref (G_OBJECT (display), (GWeakNotify)on_display_disposed, factory);
+ }
+ }
+
+ static void
+ on_display_removed (GdmDisplayStore *display_store,
+ GdmDisplay *display,
+ GdmLocalDisplayFactory *factory)
+ {
+ g_signal_handlers_disconnect_by_func (display, G_CALLBACK (on_display_status_changed), factory);
+ g_object_weak_unref (G_OBJECT (display), (GWeakNotify)on_display_disposed, factory);
+ }
+
+ static gboolean
+ gdm_local_display_factory_start (GdmDisplayFactory *base_factory)
+ {
+ GdmLocalDisplayFactory *factory = GDM_LOCAL_DISPLAY_FACTORY (base_factory);
+ GdmDisplayStore *store;
+
+ g_return_val_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (factory), FALSE);
+
++ factory->is_started = TRUE;
++
+ store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
+
+ g_signal_connect_object (G_OBJECT (store),
+ "display-added",
+ G_CALLBACK (on_display_added),
+ factory,
+ 0);
+
+ g_signal_connect_object (G_OBJECT (store),
+ "display-removed",
+ G_CALLBACK (on_display_removed),
+ factory,
+ 0);
+
+ gdm_local_display_factory_start_monitor (factory);
+ return gdm_local_display_factory_sync_seats (factory);
+ }
+
+ static gboolean
+ gdm_local_display_factory_stop (GdmDisplayFactory *base_factory)
+ {
+ GdmLocalDisplayFactory *factory = GDM_LOCAL_DISPLAY_FACTORY (base_factory);
+ GdmDisplayStore *store;
+
+ g_return_val_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (factory), FALSE);
+
+ gdm_local_display_factory_stop_monitor (factory);
+
+ store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
+
+ g_signal_handlers_disconnect_by_func (G_OBJECT (store),
+ G_CALLBACK (on_display_added),
+ factory);
+ g_signal_handlers_disconnect_by_func (G_OBJECT (store),
+ G_CALLBACK (on_display_removed),
+ factory);
+-
+ g_clear_handle_id (&factory->seat0_graphics_check_timeout_id, g_source_remove);
+
++ factory->is_started = FALSE;
++
+ return TRUE;
+ }
+
+ static void
+ gdm_local_display_factory_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+ {
+ switch (prop_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ }
+
+ static void
+ gdm_local_display_factory_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+ {
+ switch (prop_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ }
+
+ static gboolean
+diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
+index 4c2752fe..cc61efc9 100644
+--- a/daemon/gdm-manager.c
++++ b/daemon/gdm-manager.c
+@@ -2741,60 +2741,62 @@ unexport_display (const char *id,
+ GdmDisplay *display,
+ GdmManager *manager)
+ {
+ if (!g_dbus_connection_is_closed (manager->priv->connection))
+ g_dbus_object_manager_server_unexport (manager->priv->object_manager, id);
+ }
+
+ static void
+ finish_display (const char *id,
+ GdmDisplay *display,
+ GdmManager *manager)
+ {
+ gdm_display_stop_greeter_session (display);
+ if (gdm_display_get_status (display) == GDM_DISPLAY_MANAGED)
+ gdm_display_unmanage (display);
+ gdm_display_finish (display);
+ }
+
+ static void
+ gdm_manager_dispose (GObject *object)
+ {
+ GdmManager *manager;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (GDM_IS_MANAGER (object));
+
+ manager = GDM_MANAGER (object);
+
+ g_return_if_fail (manager->priv != NULL);
+
++ gdm_manager_stop (manager);
++
+ g_clear_weak_pointer (&manager->priv->automatic_login_display);
+
+ #ifdef HAVE_LIBXDMCP
+ g_clear_object (&manager->priv->xdmcp_factory);
+ #endif
+ g_clear_object (&manager->priv->local_factory);
+ g_clear_pointer (&manager->priv->open_reauthentication_requests,
+ g_hash_table_unref);
+ g_clear_pointer (&manager->priv->transient_sessions,
+ g_hash_table_unref);
+
+ g_list_foreach (manager->priv->user_sessions,
+ (GFunc) gdm_session_close,
+ NULL);
+ g_list_free_full (manager->priv->user_sessions, (GDestroyNotify) g_object_unref);
+ manager->priv->user_sessions = NULL;
+
+ g_signal_handlers_disconnect_by_func (G_OBJECT (manager->priv->display_store),
+ G_CALLBACK (on_display_added),
+ manager);
+ g_signal_handlers_disconnect_by_func (G_OBJECT (manager->priv->display_store),
+ G_CALLBACK (on_display_removed),
+ manager);
+
+ if (!g_dbus_connection_is_closed (manager->priv->connection)) {
+ gdm_display_store_foreach (manager->priv->display_store,
+ (GdmDisplayStoreFunc)unexport_display,
+ manager);
+ g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (manager));
+ }
+--
+2.32.0
+
diff --git a/0001-local-display-factory-Provide-more-flexibility-for-c.patch b/0001-local-display-factory-Provide-more-flexibility-for-c.patch
new file mode 100644
index 0000000..e72eab6
--- /dev/null
+++ b/0001-local-display-factory-Provide-more-flexibility-for-c.patch
@@ -0,0 +1,2452 @@
+From a8f8a5ee422d6ae3d87c1fba351313a5d98ded6e Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Fri, 16 Jul 2021 12:34:57 -0400
+Subject: [PATCH] local-display-factory: Provide more flexibility for
+ configuring display server
+
+There's currently a way to disable wayland, but no way to disable Xorg.
+We currently prefer wayland if it's not disabled, but have no way to
+prefer Xorg without disabling wayland entirely.
+
+There's currently no way use legacy Xorg support at all if user display
+server support is enabled at a build time.
+
+This commit adds more flexibility to display server selection. It adds
+two new keys: XorgEnable and and PreferredDisplayServer.
+
+XorgEnable=false disables Xorg support entirely on seat 0.
+
+PreferredDisplayServer can be set to "wayland", "xorg", "legacy-xorg" or
+"none" to select which display server is used by default. If it's set to
+"wayland", it will fall back to "xorg". If it's set to "xorg" it will
+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 | 224 ++++++++++++++++++++++++-----
+ daemon/gdm-manager.c | 22 ++-
+ daemon/gdm-session.c | 115 ++++++++-------
+ data/gdm.schemas.in | 10 ++
+ libgdm/gdm-sessions.c | 72 +++++++---
+ 8 files changed, 366 insertions(+), 124 deletions(-)
+
+diff --git a/common/gdm-settings-keys.h b/common/gdm-settings-keys.h
+index f0059b5cf..87685d3cd 100644
+--- a/common/gdm-settings-keys.h
++++ b/common/gdm-settings-keys.h
+@@ -6,59 +6,61 @@
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+ #ifndef _GDM_SETTINGS_KEYS_H
+ #define _GDM_SETTINGS_KEYS_H
+
+ #include <glib.h>
+
+ G_BEGIN_DECLS
+
+ #define GDM_KEY_USER "daemon/User"
+ #define GDM_KEY_GROUP "daemon/Group"
+ #define GDM_KEY_AUTO_LOGIN_ENABLE "daemon/AutomaticLoginEnable"
+ #define GDM_KEY_AUTO_LOGIN_USER "daemon/AutomaticLogin"
+ #define GDM_KEY_TIMED_LOGIN_ENABLE "daemon/TimedLoginEnable"
+ #define GDM_KEY_TIMED_LOGIN_USER "daemon/TimedLogin"
+ #define GDM_KEY_TIMED_LOGIN_DELAY "daemon/TimedLoginDelay"
+ #define GDM_KEY_INITIAL_SETUP_ENABLE "daemon/InitialSetupEnable"
++#define GDM_KEY_PREFERRED_DISPLAY_SERVER "daemon/PreferredDisplayServer"
+ #define GDM_KEY_WAYLAND_ENABLE "daemon/WaylandEnable"
++#define GDM_KEY_XORG_ENABLE "daemon/XorgEnable"
+
+ #define GDM_KEY_DEBUG "debug/Enable"
+
+ #define GDM_KEY_INCLUDE "greeter/Include"
+ #define GDM_KEY_EXCLUDE "greeter/Exclude"
+ #define GDM_KEY_INCLUDE_ALL "greeter/IncludeAll"
+
+ #define GDM_KEY_DISALLOW_TCP "security/DisallowTCP"
+ #define GDM_KEY_ALLOW_REMOTE_AUTOLOGIN "security/AllowRemoteAutoLogin"
+
+ #define GDM_KEY_XDMCP_ENABLE "xdmcp/Enable"
+ #define GDM_KEY_SHOW_LOCAL_GREETER "xdmcp/ShowLocalGreeter"
+ #define GDM_KEY_MAX_PENDING "xdmcp/MaxPending"
+ #define GDM_KEY_MAX_SESSIONS "xdmcp/MaxSessions"
+ #define GDM_KEY_MAX_WAIT "xdmcp/MaxWait"
+ #define GDM_KEY_DISPLAYS_PER_HOST "xdmcp/DisplaysPerHost"
+ #define GDM_KEY_UDP_PORT "xdmcp/Port"
+ #define GDM_KEY_INDIRECT "xdmcp/HonorIndirect"
+ #define GDM_KEY_MAX_WAIT_INDIRECT "xdmcp/MaxWaitIndirect"
+ #define GDM_KEY_PING_INTERVAL "xdmcp/PingIntervalSeconds"
+ #define GDM_KEY_WILLING "xdmcp/Willing"
+
+ #define GDM_KEY_MULTICAST "chooser/Multicast"
+ #define GDM_KEY_MULTICAST_ADDR "chooser/MulticastAddr"
+
+ G_END_DECLS
+
+ #endif /* _GDM_SETTINGS_KEYS_H */
+diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
+index 3a260923a..46d5a7732 100644
+--- a/daemon/gdm-display.c
++++ b/daemon/gdm-display.c
+@@ -66,83 +66,86 @@ typedef struct _GdmDisplayPrivate
+ char *x11_display_name;
+ int status;
+ time_t creation_time;
+
+ char *x11_cookie;
+ gsize x11_cookie_size;
+ GdmDisplayAccessFile *access_file;
+
+ guint finish_idle_id;
+
+ xcb_connection_t *xcb_connection;
+ int xcb_screen_number;
+
+ GDBusConnection *connection;
+ GdmDisplayAccessFile *user_access_file;
+
+ GdmDBusDisplay *display_skeleton;
+ GDBusObjectSkeleton *object_skeleton;
+
+ GDBusProxy *accountsservice_proxy;
+
+ /* this spawns and controls the greeter session */
+ GdmLaunchEnvironment *launch_environment;
+
+ guint is_local : 1;
+ guint is_initial : 1;
+ guint allow_timed_login : 1;
+ guint have_existing_user_accounts : 1;
+ guint doing_initial_setup : 1;
+ guint session_registered : 1;
++
++ GStrv supported_session_types;
+ } GdmDisplayPrivate;
+
+ enum {
+ PROP_0,
+ PROP_ID,
+ PROP_STATUS,
+ PROP_SEAT_ID,
+ PROP_SESSION_ID,
+ PROP_SESSION_CLASS,
+ PROP_SESSION_TYPE,
+ PROP_REMOTE_HOSTNAME,
+ PROP_X11_DISPLAY_NUMBER,
+ PROP_X11_DISPLAY_NAME,
+ PROP_X11_COOKIE,
+ PROP_X11_AUTHORITY_FILE,
+ PROP_IS_CONNECTED,
+ PROP_IS_LOCAL,
+ PROP_LAUNCH_ENVIRONMENT,
+ PROP_IS_INITIAL,
+ PROP_ALLOW_TIMED_LOGIN,
+ PROP_HAVE_EXISTING_USER_ACCOUNTS,
+ PROP_DOING_INITIAL_SETUP,
+ PROP_SESSION_REGISTERED,
++ PROP_SUPPORTED_SESSION_TYPES,
+ };
+
+ static void gdm_display_class_init (GdmDisplayClass *klass);
+ static void gdm_display_init (GdmDisplay *self);
+ static void gdm_display_finalize (GObject *object);
+ static void queue_finish (GdmDisplay *self);
+ static void _gdm_display_set_status (GdmDisplay *self,
+ int status);
+ static gboolean wants_initial_setup (GdmDisplay *self);
+ G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GdmDisplay, gdm_display, G_TYPE_OBJECT)
+
+ GQuark
+ gdm_display_error_quark (void)
+ {
+ static GQuark ret = 0;
+ if (ret == 0) {
+ ret = g_quark_from_static_string ("gdm_display_error");
+ }
+
+ return ret;
+ }
+
+ time_t
+ gdm_display_get_creation_time (GdmDisplay *self)
+ {
+ GdmDisplayPrivate *priv;
+
+ g_return_val_if_fail (GDM_IS_DISPLAY (self), 0);
+
+ priv = gdm_display_get_instance_private (self);
+@@ -883,116 +886,136 @@ _gdm_display_set_launch_environment (GdmDisplay *self,
+
+ priv = gdm_display_get_instance_private (self);
+
+ g_clear_object (&priv->launch_environment);
+
+ priv->launch_environment = g_object_ref (launch_environment);
+ }
+
+ static void
+ _gdm_display_set_is_initial (GdmDisplay *self,
+ gboolean initial)
+ {
+ GdmDisplayPrivate *priv;
+
+ priv = gdm_display_get_instance_private (self);
+ g_debug ("GdmDisplay: initial: %s", initial? "yes" : "no");
+ priv->is_initial = initial;
+ }
+
+ static void
+ _gdm_display_set_allow_timed_login (GdmDisplay *self,
+ gboolean allow_timed_login)
+ {
+ GdmDisplayPrivate *priv;
+
+ priv = gdm_display_get_instance_private (self);
+ g_debug ("GdmDisplay: allow timed login: %s", allow_timed_login? "yes" : "no");
+ priv->allow_timed_login = allow_timed_login;
+ }
+
++static void
++_gdm_display_set_supported_session_types (GdmDisplay *self,
++ const char * const *supported_session_types)
++
++{
++ GdmDisplayPrivate *priv;
++ g_autofree char *supported_session_types_string = NULL;
++
++ if (supported_session_types != NULL)
++ supported_session_types_string = g_strjoinv (":", (GStrv) supported_session_types);
++
++ priv = gdm_display_get_instance_private (self);
++ g_debug ("GdmDisplay: supported session types: %s", supported_session_types_string);
++ g_strfreev (priv->supported_session_types);
++ priv->supported_session_types = g_strdupv ((GStrv) supported_session_types);
++}
++
+ static void
+ gdm_display_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+ {
+ GdmDisplay *self;
+
+ self = GDM_DISPLAY (object);
+
+ switch (prop_id) {
+ case PROP_ID:
+ _gdm_display_set_id (self, g_value_get_string (value));
+ break;
+ case PROP_STATUS:
+ _gdm_display_set_status (self, g_value_get_int (value));
+ break;
+ case PROP_SEAT_ID:
+ _gdm_display_set_seat_id (self, g_value_get_string (value));
+ break;
+ case PROP_SESSION_ID:
+ _gdm_display_set_session_id (self, g_value_get_string (value));
+ break;
+ case PROP_SESSION_CLASS:
+ _gdm_display_set_session_class (self, g_value_get_string (value));
+ break;
+ case PROP_SESSION_TYPE:
+ _gdm_display_set_session_type (self, g_value_get_string (value));
+ break;
+ case PROP_REMOTE_HOSTNAME:
+ _gdm_display_set_remote_hostname (self, g_value_get_string (value));
+ break;
+ case PROP_X11_DISPLAY_NUMBER:
+ _gdm_display_set_x11_display_number (self, g_value_get_int (value));
+ break;
+ case PROP_X11_DISPLAY_NAME:
+ _gdm_display_set_x11_display_name (self, g_value_get_string (value));
+ break;
+ case PROP_X11_COOKIE:
+ _gdm_display_set_x11_cookie (self, g_value_get_string (value));
+ break;
+ case PROP_IS_LOCAL:
+ _gdm_display_set_is_local (self, g_value_get_boolean (value));
+ break;
+ case PROP_ALLOW_TIMED_LOGIN:
+ _gdm_display_set_allow_timed_login (self, g_value_get_boolean (value));
+ break;
+ case PROP_LAUNCH_ENVIRONMENT:
+ _gdm_display_set_launch_environment (self, g_value_get_object (value));
+ break;
+ case PROP_IS_INITIAL:
+ _gdm_display_set_is_initial (self, g_value_get_boolean (value));
+ break;
+ case PROP_SESSION_REGISTERED:
+ _gdm_display_set_session_registered (self, g_value_get_boolean (value));
+ break;
++ case PROP_SUPPORTED_SESSION_TYPES:
++ _gdm_display_set_supported_session_types (self, g_value_get_boxed (value));
++ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ }
+
+ static void
+ gdm_display_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+ {
+ GdmDisplay *self;
+ GdmDisplayPrivate *priv;
+
+ self = GDM_DISPLAY (object);
+ priv = gdm_display_get_instance_private (self);
+
+ switch (prop_id) {
+ case PROP_ID:
+ g_value_set_string (value, priv->id);
+ break;
+ case PROP_STATUS:
+ g_value_set_int (value, priv->status);
+ break;
+ case PROP_SEAT_ID:
+ g_value_set_string (value, priv->seat_id);
+ break;
+ case PROP_SESSION_ID:
+ g_value_set_string (value, priv->session_id);
+@@ -1017,60 +1040,63 @@ gdm_display_get_property (GObject *object,
+ break;
+ case PROP_X11_AUTHORITY_FILE:
+ g_value_take_string (value,
+ priv->access_file?
+ gdm_display_access_file_get_path (priv->access_file) : NULL);
+ break;
+ case PROP_IS_LOCAL:
+ g_value_set_boolean (value, priv->is_local);
+ break;
+ case PROP_IS_CONNECTED:
+ g_value_set_boolean (value, priv->xcb_connection != NULL);
+ break;
+ case PROP_LAUNCH_ENVIRONMENT:
+ g_value_set_object (value, priv->launch_environment);
+ break;
+ case PROP_IS_INITIAL:
+ g_value_set_boolean (value, priv->is_initial);
+ break;
+ case PROP_HAVE_EXISTING_USER_ACCOUNTS:
+ g_value_set_boolean (value, priv->have_existing_user_accounts);
+ break;
+ case PROP_DOING_INITIAL_SETUP:
+ g_value_set_boolean (value, priv->doing_initial_setup);
+ break;
+ case PROP_SESSION_REGISTERED:
+ g_value_set_boolean (value, priv->session_registered);
+ break;
+ case PROP_ALLOW_TIMED_LOGIN:
+ g_value_set_boolean (value, priv->allow_timed_login);
+ break;
++ case PROP_SUPPORTED_SESSION_TYPES:
++ g_value_set_boxed (value, priv->supported_session_types);
++ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ }
+
+ static gboolean
+ handle_get_id (GdmDBusDisplay *skeleton,
+ GDBusMethodInvocation *invocation,
+ GdmDisplay *self)
+ {
+ char *id;
+
+ gdm_display_get_id (self, &id, NULL);
+
+ gdm_dbus_display_complete_get_id (skeleton, invocation, id);
+
+ g_free (id);
+ return TRUE;
+ }
+
+ static gboolean
+ handle_get_remote_hostname (GdmDBusDisplay *skeleton,
+ GDBusMethodInvocation *invocation,
+ GdmDisplay *self)
+ {
+ char *hostname;
+
+ gdm_display_get_remote_hostname (self, &hostname, NULL);
+
+@@ -1202,60 +1228,61 @@ gdm_display_constructor (GType type,
+ priv = gdm_display_get_instance_private (self);
+
+ g_free (priv->id);
+ priv->id = g_strdup_printf ("/org/gnome/DisplayManager/Displays/%lu",
+ (gulong) self);
+
+ res = register_display (self);
+ if (! res) {
+ g_warning ("Unable to register display with system bus");
+ }
+
+ return G_OBJECT (self);
+ }
+
+ static void
+ gdm_display_dispose (GObject *object)
+ {
+ GdmDisplay *self;
+ GdmDisplayPrivate *priv;
+
+ self = GDM_DISPLAY (object);
+ priv = gdm_display_get_instance_private (self);
+
+ g_debug ("GdmDisplay: Disposing display");
+
+ if (priv->finish_idle_id != 0) {
+ g_source_remove (priv->finish_idle_id);
+ priv->finish_idle_id = 0;
+ }
+ g_clear_object (&priv->launch_environment);
++ g_clear_pointer (&priv->supported_session_types, g_strfreev);
+
+ g_warn_if_fail (priv->status != GDM_DISPLAY_MANAGED);
+ g_warn_if_fail (priv->user_access_file == NULL);
+ g_warn_if_fail (priv->access_file == NULL);
+
+ G_OBJECT_CLASS (gdm_display_parent_class)->dispose (object);
+ }
+
+ static void
+ gdm_display_class_init (GdmDisplayClass *klass)
+ {
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->get_property = gdm_display_get_property;
+ object_class->set_property = gdm_display_set_property;
+ object_class->constructor = gdm_display_constructor;
+ object_class->dispose = gdm_display_dispose;
+ object_class->finalize = gdm_display_finalize;
+
+ klass->prepare = gdm_display_real_prepare;
+
+ g_object_class_install_property (object_class,
+ PROP_ID,
+ g_param_spec_string ("id",
+ "id",
+ "id",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class,
+ PROP_REMOTE_HOSTNAME,
+@@ -1362,60 +1389,68 @@ gdm_display_class_init (GdmDisplayClass *klass)
+ PROP_DOING_INITIAL_SETUP,
+ g_param_spec_boolean ("doing-initial-setup",
+ NULL,
+ NULL,
+ FALSE,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class,
+ PROP_SESSION_REGISTERED,
+ g_param_spec_boolean ("session-registered",
+ NULL,
+ NULL,
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (object_class,
+ PROP_LAUNCH_ENVIRONMENT,
+ g_param_spec_object ("launch-environment",
+ NULL,
+ NULL,
+ GDM_TYPE_LAUNCH_ENVIRONMENT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class,
+ PROP_STATUS,
+ g_param_spec_int ("status",
+ "status",
+ "status",
+ -1,
+ G_MAXINT,
+ GDM_DISPLAY_UNMANAGED,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
++
++ g_object_class_install_property (object_class,
++ PROP_SUPPORTED_SESSION_TYPES,
++ g_param_spec_boxed ("supported-session-types",
++ "supported session types",
++ "supported session types",
++ G_TYPE_STRV,
++ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
+ }
+
+ static void
+ gdm_display_init (GdmDisplay *self)
+ {
+ GdmDisplayPrivate *priv;
+
+ priv = gdm_display_get_instance_private (self);
+
+ priv->creation_time = time (NULL);
+ }
+
+ static void
+ gdm_display_finalize (GObject *object)
+ {
+ GdmDisplay *self;
+ GdmDisplayPrivate *priv;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (GDM_IS_DISPLAY (object));
+
+ self = GDM_DISPLAY (object);
+ priv = gdm_display_get_instance_private (self);
+
+ g_return_if_fail (priv != NULL);
+
+ g_debug ("GdmDisplay: Finalizing display: %s", priv->id);
+ g_free (priv->id);
+ g_free (priv->seat_id);
+ g_free (priv->session_class);
+@@ -1694,60 +1729,61 @@ gdm_display_start_greeter_session (GdmDisplay *self)
+ G_CALLBACK (on_launch_environment_session_opened),
+ self, 0);
+ g_signal_connect_object (priv->launch_environment,
+ "started",
+ G_CALLBACK (on_launch_environment_session_started),
+ self, 0);
+ g_signal_connect_object (priv->launch_environment,
+ "stopped",
+ G_CALLBACK (on_launch_environment_session_stopped),
+ self, 0);
+ g_signal_connect_object (priv->launch_environment,
+ "exited",
+ G_CALLBACK (on_launch_environment_session_exited),
+ self, 0);
+ g_signal_connect_object (priv->launch_environment,
+ "died",
+ G_CALLBACK (on_launch_environment_session_died),
+ self, 0);
+
+ if (auth_file != NULL) {
+ g_object_set (priv->launch_environment,
+ "x11-authority-file", auth_file,
+ NULL);
+ }
+
+ gdm_launch_environment_start (priv->launch_environment);
+
+ session = gdm_launch_environment_get_session (priv->launch_environment);
+ g_object_set (G_OBJECT (session),
+ "display-is-initial", priv->is_initial,
++ "supported-session-types", priv->supported_session_types,
+ NULL);
+
+ g_free (display_name);
+ g_free (seat_id);
+ g_free (hostname);
+ g_free (auth_file);
+ }
+
+ void
+ gdm_display_stop_greeter_session (GdmDisplay *self)
+ {
+ GdmDisplayPrivate *priv;
+
+ priv = gdm_display_get_instance_private (self);
+
+ if (priv->launch_environment != NULL) {
+
+ g_signal_handlers_disconnect_by_func (priv->launch_environment,
+ G_CALLBACK (on_launch_environment_session_opened),
+ self);
+ g_signal_handlers_disconnect_by_func (priv->launch_environment,
+ G_CALLBACK (on_launch_environment_session_started),
+ self);
+ g_signal_handlers_disconnect_by_func (priv->launch_environment,
+ G_CALLBACK (on_launch_environment_session_stopped),
+ self);
+ g_signal_handlers_disconnect_by_func (priv->launch_environment,
+ G_CALLBACK (on_launch_environment_session_exited),
+ 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 87a1c5ffe..14ecfac2d 100644
+--- a/daemon/gdm-launch-environment.c
++++ b/daemon/gdm-launch-environment.c
+@@ -134,60 +134,61 @@ static GHashTable *
+ build_launch_environment (GdmLaunchEnvironment *launch_environment,
+ gboolean start_session)
+ {
+ GHashTable *hash;
+ struct passwd *pwent;
+ static const char *const optional_environment[] = {
+ "GI_TYPELIB_PATH",
+ "LANG",
+ "LANGUAGE",
+ "LC_ADDRESS",
+ "LC_ALL",
+ "LC_COLLATE",
+ "LC_CTYPE",
+ "LC_IDENTIFICATION",
+ "LC_MEASUREMENT",
+ "LC_MESSAGES",
+ "LC_MONETARY",
+ "LC_NAME",
+ "LC_NUMERIC",
+ "LC_PAPER",
+ "LC_TELEPHONE",
+ "LC_TIME",
+ "LD_LIBRARY_PATH",
+ "PATH",
+ "WINDOWPATH",
+ "XCURSOR_PATH",
+ "XDG_CONFIG_DIRS",
+ NULL
+ };
+ char *system_data_dirs;
++ g_auto (GStrv) supported_session_types = NULL;
+ int i;
+
+ /* create a hash table of current environment, then update keys has necessary */
+ hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+
+ for (i = 0; optional_environment[i] != NULL; i++) {
+ if (g_getenv (optional_environment[i]) == NULL) {
+ continue;
+ }
+
+ g_hash_table_insert (hash,
+ g_strdup (optional_environment[i]),
+ g_strdup (g_getenv (optional_environment[i])));
+ }
+
+ if (launch_environment->priv->x11_authority_file != NULL)
+ g_hash_table_insert (hash, g_strdup ("XAUTHORITY"), g_strdup (launch_environment->priv->x11_authority_file));
+
+ if (launch_environment->priv->session_mode != NULL) {
+ g_hash_table_insert (hash, g_strdup ("GNOME_SHELL_SESSION_MODE"), g_strdup (launch_environment->priv->session_mode));
+
+ if (strcmp (launch_environment->priv->session_mode, INITIAL_SETUP_SESSION_MODE) != 0) {
+ /* gvfs is needed for fetching remote avatars in the initial setup. Disable it otherwise. */
+ g_hash_table_insert (hash, g_strdup ("GVFS_DISABLE_FUSE"), g_strdup ("1"));
+ g_hash_table_insert (hash, g_strdup ("GIO_USE_VFS"), g_strdup ("local"));
+ g_hash_table_insert (hash, g_strdup ("GVFS_REMOTE_VOLUME_MONITOR_IGNORE"), g_strdup ("1"));
+
+ /* The locked down dconf profile should not be used for the initial setup session.
+ * This allows overridden values from the user profile to take effect.
+ */
+@@ -217,60 +218,68 @@ build_launch_environment (GdmLaunchEnvironment *launch_environment,
+ }
+
+ if (start_session && launch_environment->priv->x11_display_seat_id != NULL) {
+ char *seat_id;
+
+ seat_id = launch_environment->priv->x11_display_seat_id;
+
+ g_hash_table_insert (hash, g_strdup ("GDM_SEAT_ID"), g_strdup (seat_id));
+ }
+
+ g_hash_table_insert (hash, g_strdup ("RUNNING_UNDER_GDM"), g_strdup ("true"));
+
+ /* Now populate XDG_DATA_DIRS from env.d if we're running initial setup; this allows
+ * e.g. Flatpak apps to be recognized by gnome-shell.
+ */
+ if (g_strcmp0 (launch_environment->priv->session_mode, INITIAL_SETUP_SESSION_MODE) == 0)
+ gdm_load_env_d (load_env_func, get_var_cb, hash);
+
+ /* Prepend our own XDG_DATA_DIRS value */
+ system_data_dirs = g_strdup (g_hash_table_lookup (hash, "XDG_DATA_DIRS"));
+ if (!system_data_dirs)
+ system_data_dirs = g_strjoinv (":", (char **) g_get_system_data_dirs ());
+
+ g_hash_table_insert (hash,
+ g_strdup ("XDG_DATA_DIRS"),
+ g_strdup_printf ("%s:%s",
+ DATADIR "/gdm/greeter",
+ system_data_dirs));
+ g_free (system_data_dirs);
+
++ g_object_get (launch_environment->priv->session,
++ "supported-session-types",
++ &supported_session_types,
++ NULL);
++ g_hash_table_insert (hash,
++ g_strdup ("GDM_SUPPORTED_SESSION_TYPES"),
++ g_strjoinv (":", supported_session_types));
++
+ return hash;
+ }
+
+ static void
+ on_session_setup_complete (GdmSession *session,
+ const char *service_name,
+ GdmLaunchEnvironment *launch_environment)
+ {
+ GHashTable *hash;
+ GHashTableIter iter;
+ gpointer key, value;
+
+ hash = build_launch_environment (launch_environment, TRUE);
+
+ g_hash_table_iter_init (&iter, hash);
+ while (g_hash_table_iter_next (&iter, &key, &value)) {
+ gdm_session_set_environment_variable (launch_environment->priv->session, key, value);
+ }
+ g_hash_table_destroy (hash);
+ }
+
+ static void
+ on_session_opened (GdmSession *session,
+ const char *service_name,
+ const char *session_id,
+ GdmLaunchEnvironment *launch_environment)
+ {
+ launch_environment->priv->session_id = g_strdup (session_id);
+
+ 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..141d64c6b 100644
+--- a/daemon/gdm-local-display-factory.c
++++ b/daemon/gdm-local-display-factory.c
+@@ -156,126 +156,225 @@ take_next_display_number (GdmLocalDisplayFactory *factory)
+
+ g_debug ("GdmLocalDisplayFactory: Found the following X displays:");
+ for (l = list; l != NULL; l = l->next) {
+ g_debug ("GdmLocalDisplayFactory: %u", GPOINTER_TO_UINT (l->data));
+ }
+
+ for (l = list; l != NULL; l = l->next) {
+ guint32 num;
+ num = GPOINTER_TO_UINT (l->data);
+
+ /* always fill zero */
+ if (l->prev == NULL && num != 0) {
+ ret = 0;
+ break;
+ }
+ /* now find the first hole */
+ if (l->next == NULL || GPOINTER_TO_UINT (l->next->data) != (num + 1)) {
+ ret = num + 1;
+ break;
+ }
+ }
+ out:
+
+ /* now reserve this number */
+ g_debug ("GdmLocalDisplayFactory: Reserving X display: %u", ret);
+ g_hash_table_insert (factory->used_display_numbers, GUINT_TO_POINTER (ret), NULL);
+
+ return ret;
+ }
+
++static char *
++get_preferred_display_server (GdmLocalDisplayFactory *factory)
++{
++ g_autofree gchar *preferred_display_server = NULL;
++ gboolean wayland_enabled = FALSE, xorg_enabled = FALSE;
++
++ gdm_settings_direct_get_boolean (GDM_KEY_WAYLAND_ENABLE, &wayland_enabled);
++ gdm_settings_direct_get_boolean (GDM_KEY_XORG_ENABLE, &xorg_enabled);
++
++ if (wayland_enabled && !xorg_enabled) {
++ return g_strdup ("wayland");
++ }
++
++ if (!wayland_enabled && !xorg_enabled) {
++ return g_strdup ("none");
++ }
++
++ gdm_settings_direct_get_string (GDM_KEY_PREFERRED_DISPLAY_SERVER, &preferred_display_server);
++
++ if (g_strcmp0 (preferred_display_server, "wayland") == 0) {
++ if (wayland_enabled)
++ return g_strdup (preferred_display_server);
++ else
++ return g_strdup ("xorg");
++ }
++
++ if (g_strcmp0 (preferred_display_server, "xorg") == 0) {
++ if (xorg_enabled)
++ return g_strdup (preferred_display_server);
++ else
++ return g_strdup ("wayland");
++ }
++
++ if (g_strcmp0 (preferred_display_server, "legacy-xorg") == 0) {
++ if (xorg_enabled)
++ return g_strdup (preferred_display_server);
++ }
++
++ return g_strdup ("none");
++}
++
++static const char *
++gdm_local_display_factory_get_session_type (GdmLocalDisplayFactory *factory,
++ gboolean should_fall_back)
++{
++ const char *session_types[3] = { NULL };
++ gsize i, session_type_index = 0;
++ g_autofree gchar *preferred_display_server = NULL;
++
++ 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 (i > 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";
++ continue;
++ }
++ }
++ }
++#endif
++
++ if (i > 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";
++ continue;
++ }
++ }
++ }
++ }
++
++ if (should_fall_back)
++ session_type_index++;
++
++ return session_types[session_type_index];
++}
++
+ static void
+ on_display_disposed (GdmLocalDisplayFactory *factory,
+ GdmDisplay *display)
+ {
+ g_debug ("GdmLocalDisplayFactory: Display %p disposed", display);
+ }
+
+ static void
+ store_display (GdmLocalDisplayFactory *factory,
+ GdmDisplay *display)
+ {
+ GdmDisplayStore *store;
+
+ store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
+ gdm_display_store_add (store, display);
+ }
+
+-static gboolean
+-gdm_local_display_factory_use_wayland (void)
+-{
+-#ifdef ENABLE_WAYLAND_SUPPORT
+- 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) )
+- return TRUE;
+- }
+-#endif
+- return FALSE;
+-}
+-
+ /*
+ Example:
+ dbus-send --system --dest=org.gnome.DisplayManager \
+ --type=method_call --print-reply --reply-timeout=2000 \
+ /org/gnome/DisplayManager/Manager \
+ org.gnome.DisplayManager.Manager.GetDisplays
+ */
+ gboolean
+ gdm_local_display_factory_create_transient_display (GdmLocalDisplayFactory *factory,
+ char **id,
+ GError **error)
+ {
+ gboolean ret;
+ GdmDisplay *display = NULL;
+ gboolean is_initial = FALSE;
++ const char *session_type;
++ g_autofree gchar *preferred_display_server = NULL;
+
+ g_return_val_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (factory), FALSE);
+
+ ret = FALSE;
+
+ g_debug ("GdmLocalDisplayFactory: Creating transient display");
+
+-#ifdef ENABLE_USER_DISPLAY_SERVER
+- display = gdm_local_display_new ();
+- if (gdm_local_display_factory_use_wayland ())
+- g_object_set (G_OBJECT (display), "session-type", "wayland", NULL);
+- is_initial = TRUE;
+-#else
+- if (display == NULL) {
+- guint32 num;
++ preferred_display_server = get_preferred_display_server (factory);
+
+- num = take_next_display_number (factory);
++#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);
++
++ if (session_type == NULL) {
++ g_set_error_literal (error,
++ GDM_DISPLAY_ERROR,
++ GDM_DISPLAY_ERROR_GENERAL,
++ "Both Wayland and Xorg are unavailable");
++ return FALSE;
++ }
+
+- display = gdm_legacy_display_new (num);
++ display = gdm_local_display_new ();
++ g_object_set (G_OBJECT (display), "session-type", session_type, NULL);
++ is_initial = TRUE;
+ }
+ #endif
++ if (g_strcmp0 (preferred_display_server, "legacy-xorg") == 0) {
++ if (display == NULL) {
++ guint32 num;
++
++ num = take_next_display_number (factory);
++
++ display = gdm_legacy_display_new (num);
++ }
++ }
++
++ if (display == NULL) {
++ g_set_error_literal (error,
++ GDM_DISPLAY_ERROR,
++ GDM_DISPLAY_ERROR_GENERAL,
++ "Invalid preferred display server configured");
++ return FALSE;
++ }
+
+ g_object_set (display,
+ "seat-id", "seat0",
+ "allow-timed-login", FALSE,
+ "is-initial", is_initial,
+ NULL);
+
+ store_display (factory, display);
+
+ if (! gdm_display_manage (display)) {
+ display = NULL;
+ goto out;
+ }
+
+ if (! gdm_display_get_id (display, id, NULL)) {
+ display = NULL;
+ goto out;
+ }
+
+ ret = TRUE;
+ out:
+ /* ref either held by store or not at all */
+ g_object_unref (display);
+
+ return ret;
+ }
+
+ static void
+ finish_display_on_seat_if_waiting (GdmDisplayStore *display_store,
+ GdmDisplay *display,
+@@ -454,190 +553,239 @@ lookup_prepared_display_by_seat_id (const char *id,
+ return lookup_by_seat_id (id, display, user_data);
+ }
+
+ static int
+ on_seat0_graphics_check_timeout (gpointer user_data)
+ {
+ GdmLocalDisplayFactory *factory = user_data;
+
+ factory->seat0_graphics_check_timeout_id = 0;
+
+ /* Simply try to re-add seat0. If it is there already (i.e. CanGraphical
+ * turned TRUE, then we'll find it and it will not be created again).
+ */
+ factory->seat0_graphics_check_timed_out = TRUE;
+ ensure_display_for_seat (factory, "seat0");
+
+ return G_SOURCE_REMOVE;
+ }
+
+ static void
+ ensure_display_for_seat (GdmLocalDisplayFactory *factory,
+ const char *seat_id)
+ {
+ int ret;
+ gboolean seat_supports_graphics;
+ gboolean is_seat0;
+ const char *session_type = "wayland";
+ GdmDisplayStore *store;
+ GdmDisplay *display = NULL;
+ g_autofree char *login_session_id = NULL;
++ gboolean wayland_enabled = FALSE, xorg_enabled = FALSE;
++ g_autofree gchar *preferred_display_server = NULL;
++ gboolean falling_back;
++
++ gdm_settings_direct_get_boolean (GDM_KEY_WAYLAND_ENABLE, &wayland_enabled);
++ gdm_settings_direct_get_boolean (GDM_KEY_XORG_ENABLE, &xorg_enabled);
++
++ preferred_display_server = get_preferred_display_server (factory);
++
++ if (g_strcmp0 (preferred_display_server, "none") == 0) {
++ g_debug ("GdmLocalDisplayFactory: Preferred display server is none, so not creating display");
++ return;
++ }
+
+ ret = sd_seat_can_graphical (seat_id);
+
+ if (ret < 0) {
+ g_critical ("Failed to query CanGraphical information for seat %s", seat_id);
+ return;
+ }
+
+ if (ret == 0) {
+ g_debug ("GdmLocalDisplayFactory: System doesn't currently support graphics");
+ seat_supports_graphics = FALSE;
+ } else {
+ g_debug ("GdmLocalDisplayFactory: System supports graphics");
+ seat_supports_graphics = TRUE;
+ }
+
+ if (g_strcmp0 (seat_id, "seat0") == 0) {
+ is_seat0 = TRUE;
+
+- /* If we've failed, or are explicitly told to, fall back to legacy X11 support
+- */
+- if (factory->num_failures > 0 || !gdm_local_display_factory_use_wayland ()) {
+- session_type = NULL;
+- g_debug ("GdmLocalDisplayFactory: New displays on seat0 will use X11 fallback");
+- } else {
+- 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);
++
++ g_debug ("GdmLocalDisplayFactory: New displays on seat0 will use %s%s",
++ session_type, falling_back? " fallback" : "");
+ } 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 = NULL;
++ session_type = "x11";
+ }
+
+ /* For seat0, we have a fallback logic to still try starting it after
+ * SEAT0_GRAPHICS_CHECK_TIMEOUT seconds. i.e. we simply continue even if
+ * CanGraphical is unset.
+ * This is ugly, but it means we'll come up eventually in some
+ * scenarios where no master device is present.
+ * Note that we'll force an X11 fallback even though there might be
+ * cases where an wayland capable device is present and simply not marked as
+ * master-of-seat. In these cases, this should likely be fixed in the
+ * udev rules.
+ *
+ * At the moment, systemd always sets CanGraphical for non-seat0 seats.
+ * This is because non-seat0 seats are defined by having master-of-seat
+ * set. This means we can avoid the fallback check for non-seat0 seats,
+ * which simplifies the code.
+ */
+ if (is_seat0) {
+ if (!seat_supports_graphics) {
+ if (!factory->seat0_graphics_check_timed_out) {
+ if (factory->seat0_graphics_check_timeout_id == 0) {
+ 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,
+ on_seat0_graphics_check_timeout,
+ factory);
+
+ } else {
+ /* It is not yet time to force X11 fallback. */
+ g_debug ("GdmLocalDisplayFactory: seat0 display requested when there is no graphics support before graphics check timeout.");
+ }
+
+ return;
+ }
+
+ g_debug ("GdmLocalDisplayFactory: Assuming we can use seat0 for X11 even though system says it doesn't support graphics!");
+ 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;
+ } else {
+ g_clear_handle_id (&factory->seat0_graphics_check_timeout_id, g_source_remove);
+ }
+ }
+
+ if (!seat_supports_graphics)
+ return;
+
+- g_debug ("GdmLocalDisplayFactory: %s login display for seat %s requested",
+- session_type? : "X11", seat_id);
++ if (session_type != NULL)
++ g_debug ("GdmLocalDisplayFactory: %s login display for seat %s requested",
++ session_type, 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);
++
+ store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
+
+ if (is_seat0)
+ display = gdm_display_store_find (store, lookup_prepared_display_by_seat_id, (gpointer) seat_id);
+ else
+ display = gdm_display_store_find (store, lookup_by_seat_id, (gpointer) seat_id);
+
+ /* Ensure we don't create the same display more than once */
+ if (display != NULL) {
+ g_debug ("GdmLocalDisplayFactory: display already created");
+ return;
+ }
+
+ /* If we already have a login window, switch to it */
+ if (gdm_get_login_window_session_id (seat_id, &login_session_id)) {
+ GdmDisplay *display;
+
+ display = gdm_display_store_find (store,
+ lookup_by_session_id,
+ (gpointer) login_session_id);
+ if (display != NULL &&
+ (gdm_display_get_status (display) == GDM_DISPLAY_MANAGED ||
+ gdm_display_get_status (display) == GDM_DISPLAY_WAITING_TO_FINISH)) {
+ g_object_set (G_OBJECT (display), "status", GDM_DISPLAY_MANAGED, NULL);
+ g_debug ("GdmLocalDisplayFactory: session %s found, activating.",
+ login_session_id);
+ gdm_activate_session_by_id (factory->connection, seat_id, login_session_id);
+ return;
+ }
+ }
+
+ g_debug ("GdmLocalDisplayFactory: Adding display on seat %s", seat_id);
+
+ #ifdef ENABLE_USER_DISPLAY_SERVER
+- if (is_seat0) {
+- display = gdm_local_display_new ();
+- if (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);
+ }
+ }
+ #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 (display, "seat-id", seat_id, NULL);
+ g_object_set (display, "is-initial", is_seat0, NULL);
+
+ store_display (factory, display);
+
+ /* let store own the ref */
+ g_object_unref (display);
+
+ if (! gdm_display_manage (display)) {
+ gdm_display_unmanage (display);
+ }
+
+ return;
+ }
+
+ static void
+ delete_display (GdmLocalDisplayFactory *factory,
+ const char *seat_id) {
+
+ GdmDisplayStore *store;
+
+ g_debug ("GdmLocalDisplayFactory: Removing used_display_numbers on seat %s", seat_id);
+
+ store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
+ gdm_display_store_foreach_remove (store, lookup_by_seat_id, (gpointer) seat_id);
+ }
+
+ static gboolean
+diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
+index 9c10adff3..4c2752fee 100644
+--- a/daemon/gdm-manager.c
++++ b/daemon/gdm-manager.c
+@@ -1306,74 +1306,75 @@ get_automatic_login_details (GdmManager *manager,
+ *usernamep = username;
+ } else {
+ g_free (username);
+ }
+
+ return enabled;
+ }
+
+ static const char *
+ get_username_for_greeter_display (GdmManager *manager,
+ GdmDisplay *display)
+ {
+ gboolean doing_initial_setup = FALSE;
+
+ g_object_get (G_OBJECT (display),
+ "doing-initial-setup", &doing_initial_setup,
+ NULL);
+
+ if (doing_initial_setup) {
+ return INITIAL_SETUP_USERNAME;
+ } else {
+ return GDM_USERNAME;
+ }
+ }
+
+ static void
+ set_up_automatic_login_session (GdmManager *manager,
+ GdmDisplay *display)
+ {
+ GdmSession *session;
+- char *display_session_type = NULL;
++ g_auto (GStrv) supported_session_types = NULL;
+
+ /* 0 is root user; since the daemon talks to the session object
+ * directly, itself, for automatic login
+ */
+ create_user_session_for_display (manager, display, 0);
+ session = get_user_session_for_display (display);
+
+ g_object_get (G_OBJECT (display),
+- "session-type", &display_session_type,
++ "supported-session-types", &supported_session_types,
+ NULL);
+
+ g_object_set (G_OBJECT (session),
+ "display-is-initial", FALSE,
++ "supported-session-types", supported_session_types,
+ NULL);
+
+ g_debug ("GdmManager: Starting automatic login conversation");
+ gdm_session_start_conversation (session, "gdm-autologin");
+ }
+
+ static void
+ set_up_chooser_session (GdmManager *manager,
+ GdmDisplay *display)
+ {
+ const char *allowed_user;
+ struct passwd *passwd_entry;
+
+ allowed_user = get_username_for_greeter_display (manager, display);
+
+ if (!gdm_get_pwent_for_name (allowed_user, &passwd_entry)) {
+ g_warning ("GdmManager: couldn't look up username %s",
+ allowed_user);
+ gdm_display_unmanage (display);
+ gdm_display_finish (display);
+ return;
+ }
+
+ gdm_display_start_greeter_session (display);
+ }
+
+ static void
+ set_up_greeter_session (GdmManager *manager,
+ GdmDisplay *display)
+ {
+@@ -2278,87 +2279,85 @@ on_session_reauthentication_started (GdmSession *session,
+
+ if (invocation != NULL) {
+ g_hash_table_steal (manager->priv->open_reauthentication_requests,
+ source_tag);
+ gdm_dbus_manager_complete_open_reauthentication_channel (GDM_DBUS_MANAGER (manager),
+ invocation,
+ address);
+ }
+ }
+
+ static void
+ clean_user_session (GdmSession *session)
+ {
+ g_object_set_data (G_OBJECT (session), "gdm-display", NULL);
+ g_object_unref (session);
+ }
+
+ static void
+ create_user_session_for_display (GdmManager *manager,
+ GdmDisplay *display,
+ uid_t allowed_user)
+ {
+ GdmSession *session;
+ gboolean display_is_local = FALSE;
+ char *display_name = NULL;
+ char *display_device = NULL;
+ char *remote_hostname = NULL;
+ char *display_auth_file = NULL;
+ char *display_seat_id = NULL;
+ char *display_id = NULL;
+-#if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER)
+- g_autofree char *display_session_type = NULL;
+- gboolean greeter_is_wayland;
+-#endif
++ g_auto (GStrv) supported_session_types = NULL;
+
+ g_object_get (G_OBJECT (display),
+ "id", &display_id,
+ "x11-display-name", &display_name,
+ "is-local", &display_is_local,
+ "remote-hostname", &remote_hostname,
+ "x11-authority-file", &display_auth_file,
+ "seat-id", &display_seat_id,
+-#if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER)
+- "session-type", &display_session_type,
+-#endif
++ "supported-session-types", &supported_session_types,
+ NULL);
+ display_device = get_display_device (manager, display);
+
+ session = gdm_session_new (GDM_SESSION_VERIFICATION_MODE_LOGIN,
+ allowed_user,
+ display_name,
+ remote_hostname,
+ display_device,
+ display_seat_id,
+ display_auth_file,
+ display_is_local,
+ NULL);
++ g_object_set (G_OBJECT (session),
++ "supported-session-types", supported_session_types,
++ NULL);
+
+ g_debug ("GdmSession: Created user session for user %d on display %s (seat %s)",
+ (int) allowed_user,
+ display_id,
+ display_seat_id);
+
+ g_free (display_name);
+ g_free (remote_hostname);
+ g_free (display_auth_file);
+ g_free (display_seat_id);
+
+ g_signal_connect (session,
+ "reauthentication-started",
+ G_CALLBACK (on_session_reauthentication_started),
+ manager);
+ g_signal_connect (session,
+ "reauthenticated",
+ G_CALLBACK (on_session_reauthenticated),
+ manager);
+ g_signal_connect (session,
+ "client-ready-for-session-to-start",
+ G_CALLBACK (on_session_client_ready_for_session_to_start),
+ manager);
+ g_signal_connect (session,
+ "client-connected",
+ G_CALLBACK (on_session_client_connected),
+ manager);
+ g_signal_connect (session,
+ "client-disconnected",
+ G_CALLBACK (on_session_client_disconnected),
+@@ -2378,65 +2377,60 @@ create_user_session_for_display (GdmManager *manager,
+ g_signal_connect (session,
+ "authentication-failed",
+ G_CALLBACK (on_session_authentication_failed),
+ manager);
+ g_signal_connect (session,
+ "session-opened",
+ G_CALLBACK (on_user_session_opened),
+ manager);
+ g_signal_connect (session,
+ "session-started",
+ G_CALLBACK (on_user_session_started),
+ manager);
+ g_signal_connect (session,
+ "session-start-failed",
+ G_CALLBACK (on_session_start_failed),
+ manager);
+ g_signal_connect (session,
+ "session-exited",
+ G_CALLBACK (on_user_session_exited),
+ manager);
+ g_signal_connect (session,
+ "session-died",
+ G_CALLBACK (on_user_session_died),
+ manager);
+ g_object_set_data (G_OBJECT (session), "gdm-display", display);
+ g_object_set_data_full (G_OBJECT (display),
+ "gdm-user-session",
+ session,
+ (GDestroyNotify)
+ clean_user_session);
+-
+-#if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER)
+- greeter_is_wayland = g_strcmp0 (display_session_type, "wayland") == 0;
+- g_object_set (G_OBJECT (session), "ignore-wayland", !greeter_is_wayland, NULL);
+-#endif
+ }
+
+ static void
+ on_display_added (GdmDisplayStore *display_store,
+ const char *id,
+ GdmManager *manager)
+ {
+ GdmDisplay *display;
+
+ display = gdm_display_store_lookup (display_store, id);
+
+ if (display != NULL) {
+ g_dbus_object_manager_server_export (manager->priv->object_manager,
+ gdm_display_get_object_skeleton (display));
+
+ g_signal_connect (display, "notify::status",
+ G_CALLBACK (on_display_status_changed),
+ manager);
+ g_signal_emit (manager, signals[DISPLAY_ADDED], 0, id);
+ }
+ }
+
+ GQuark
+ gdm_manager_error_quark (void)
+ {
+ static GQuark ret = 0;
+ if (ret == 0) {
+ ret = g_quark_from_static_string ("gdm_manager_error");
+ }
+
+diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
+index a010cecf5..2b941e5e1 100644
+--- a/daemon/gdm-session.c
++++ b/daemon/gdm-session.c
+@@ -106,84 +106,81 @@ struct _GdmSession
+ GdmDBusUserVerifier *user_verifier_interface;
+ GHashTable *user_verifier_extensions;
+ GdmDBusGreeter *greeter_interface;
+ GdmDBusRemoteGreeter *remote_greeter_interface;
+ GdmDBusChooser *chooser_interface;
+
+ GList *pending_worker_connections;
+ GList *outside_connections;
+
+ GPid session_pid;
+
+ /* object lifetime scope */
+ char *session_type;
+ char *display_name;
+ char *display_hostname;
+ char *display_device;
+ char *display_seat_id;
+ char *display_x11_authority_file;
+ gboolean display_is_local;
+
+ GdmSessionVerificationMode verification_mode;
+
+ uid_t allowed_user;
+
+ char *fallback_session_name;
+
+ GDBusServer *worker_server;
+ GDBusServer *outside_server;
+ GHashTable *environment;
+
++ GStrv supported_session_types;
++
+ guint32 is_program_session : 1;
+ guint32 display_is_initial : 1;
+-#ifdef ENABLE_WAYLAND_SUPPORT
+- guint32 ignore_wayland : 1;
+-#endif
+ };
+
+ enum {
+ PROP_0,
+ PROP_VERIFICATION_MODE,
+ PROP_ALLOWED_USER,
+ PROP_DISPLAY_NAME,
+ PROP_DISPLAY_HOSTNAME,
+ PROP_DISPLAY_IS_LOCAL,
+ PROP_DISPLAY_IS_INITIAL,
+ PROP_SESSION_TYPE,
+ PROP_DISPLAY_DEVICE,
+ PROP_DISPLAY_SEAT_ID,
+ PROP_DISPLAY_X11_AUTHORITY_FILE,
+ PROP_USER_X11_AUTHORITY_FILE,
+ PROP_CONVERSATION_ENVIRONMENT,
+-#ifdef ENABLE_WAYLAND_SUPPORT
+- PROP_IGNORE_WAYLAND,
+-#endif
++ PROP_SUPPORTED_SESSION_TYPES,
+ };
+
+ enum {
+ CONVERSATION_STARTED = 0,
+ CONVERSATION_STOPPED,
+ SETUP_COMPLETE,
+ CANCELLED,
+ HOSTNAME_SELECTED,
+ CLIENT_REJECTED,
+ CLIENT_CONNECTED,
+ CLIENT_DISCONNECTED,
+ CLIENT_READY_FOR_SESSION_TO_START,
+ DISCONNECTED,
+ AUTHENTICATION_FAILED,
+ VERIFICATION_COMPLETE,
+ SESSION_OPENED,
+ SESSION_OPENED_FAILED,
+ SESSION_STARTED,
+ SESSION_START_FAILED,
+ SESSION_EXITED,
+ SESSION_DIED,
+ REAUTHENTICATION_STARTED,
+ REAUTHENTICATED,
+ LAST_SIGNAL
+ };
+
+ #ifdef ENABLE_WAYLAND_SUPPORT
+ static gboolean gdm_session_is_wayland_session (GdmSession *self);
+ #endif
+ static void update_session_type (GdmSession *self);
+@@ -320,109 +317,117 @@ on_establish_credentials_cb (GdmDBusWorker *proxy,
+ g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ return;
+
+ self = g_object_ref (conversation->session);
+ service_name = g_strdup (conversation->service_name);
+
+ if (worked) {
+ switch (self->verification_mode) {
+ case GDM_SESSION_VERIFICATION_MODE_LOGIN:
+ case GDM_SESSION_VERIFICATION_MODE_CHOOSER:
+ gdm_session_open_session (self, service_name);
+ break;
+ case GDM_SESSION_VERIFICATION_MODE_REAUTHENTICATE:
+ if (self->user_verifier_interface != NULL) {
+ gdm_dbus_user_verifier_emit_verification_complete (self->user_verifier_interface,
+ service_name);
+ g_signal_emit (self, signals[VERIFICATION_COMPLETE], 0, service_name);
+ }
+ break;
+ default:
+ break;
+ }
+ } else {
+ report_and_stop_conversation (self, service_name, error);
+ }
+
+ g_free (service_name);
+ g_object_unref (self);
+ }
+
++static gboolean
++supports_session_type (GdmSession *self,
++ const char *session_type)
++{
++ if (session_type == NULL)
++ return TRUE;
++
++ return g_strv_contains ((const char * const *) self->supported_session_types,
++ session_type);
++}
++
+ static char **
+ get_system_session_dirs (GdmSession *self,
+ const char *type)
+ {
+ GArray *search_array = NULL;
+ char **search_dirs;
+- int i;
++ int i, j;
+ const gchar * const *system_data_dirs = g_get_system_data_dirs ();
+
+ static const char *x_search_dirs[] = {
+ "/etc/X11/sessions/",
+ DMCONFDIR "/Sessions/",
+ DATADIR "/gdm/BuiltInSessions/",
+ DATADIR "/xsessions/",
+ };
+
+ static const char *wayland_search_dir = DATADIR "/wayland-sessions/";
+
+ search_array = g_array_new (TRUE, TRUE, sizeof (char *));
+
+- if (type == NULL || g_str_equal (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);
++ for (j = 0; self->supported_session_types[j] != NULL; j++) {
++ const char *supported_type = self->supported_session_types[j];
++
++ if (g_str_equal (supported_type, "x11") &&
++ (type == NULL || g_str_equal (type, supported_type))) {
++ 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));
+- }
+
+ #ifdef ENABLE_WAYLAND_SUPPORT
+- if (!self->ignore_wayland &&
+- (type == NULL || g_str_equal (type, "wayland"))) {
+-#ifdef ENABLE_USER_DISPLAY_SERVER
+- g_array_prepend_val (search_array, wayland_search_dir);
++ if (g_str_equal (supported_type, "wayland") &&
++ (type == NULL || g_str_equal (type, supported_type))) {
++ for (i = 0; system_data_dirs[i]; i++) {
++ gchar *dir = g_build_filename (system_data_dirs[i], "wayland-sessions", NULL);
++ g_array_append_val (search_array, dir);
++ }
+
+- for (i = 0; system_data_dirs[i]; i++) {
+- gchar *dir = g_build_filename (system_data_dirs[i], "wayland-sessions", NULL);
+- g_array_insert_val (search_array, i, dir);
++ g_array_append_val (search_array, wayland_search_dir);
+ }
+-#else
+- for (i = 0; system_data_dirs[i]; i++) {
+- gchar *dir = g_build_filename (system_data_dirs[i], "wayland-sessions", NULL);
+- g_array_append_val (search_array, dir);
+- }
+-
+- g_array_append_val (search_array, wayland_search_dir);
+ #endif
+ }
+-#endif
+
+ search_dirs = g_strdupv ((char **) search_array->data);
+
+ g_array_free (search_array, TRUE);
+
+ return search_dirs;
+ }
+
+ static gboolean
+ is_prog_in_path (const char *prog)
+ {
+ char *f;
+ gboolean ret;
+
+ f = g_find_program_in_path (prog);
+ ret = (f != NULL);
+ g_free (f);
+ return ret;
+ }
+
+ static GKeyFile *
+ load_key_file_for_file (GdmSession *self,
+ const char *file,
+ const char *type,
+ char **full_path)
+ {
+ GKeyFile *key_file;
+ GError *error = NULL;
+ gboolean res;
+ char **search_dirs;
+@@ -444,60 +449,66 @@ load_key_file_for_file (GdmSession *self,
+ g_debug ("GdmSession: %s", error->message);
+ g_error_free (error);
+ }
+ g_key_file_free (key_file);
+ key_file = NULL;
+ }
+
+ g_strfreev (search_dirs);
+
+ return key_file;
+ }
+
+ static gboolean
+ get_session_command_for_file (GdmSession *self,
+ const char *file,
+ const char *type,
+ char **command)
+ {
+ GKeyFile *key_file;
+ GError *error;
+ char *exec;
+ gboolean ret;
+ gboolean res;
+
+ exec = NULL;
+ ret = FALSE;
+ if (command != NULL) {
+ *command = NULL;
+ }
+
++ if (!supports_session_type (self, type)) {
++ g_debug ("GdmSession: ignoring %s session command request for file '%s'",
++ type, file);
++ goto out;
++ }
++
+ g_debug ("GdmSession: getting session command for file '%s'", file);
+ key_file = load_key_file_for_file (self, file, type, NULL);
+ if (key_file == NULL) {
+ goto out;
+ }
+
+ error = NULL;
+ res = g_key_file_get_boolean (key_file,
+ G_KEY_FILE_DESKTOP_GROUP,
+ G_KEY_FILE_DESKTOP_KEY_HIDDEN,
+ &error);
+ if (error == NULL && res) {
+ g_debug ("GdmSession: Session %s is marked as hidden", file);
+ goto out;
+ }
+
+ exec = g_key_file_get_string (key_file,
+ G_KEY_FILE_DESKTOP_GROUP,
+ G_KEY_FILE_DESKTOP_KEY_TRY_EXEC,
+ NULL);
+ if (exec != NULL) {
+ res = is_prog_in_path (exec);
+ g_free (exec);
+ exec = NULL;
+
+ if (! res) {
+ g_debug ("GdmSession: Command not found: %s",
+ G_KEY_FILE_DESKTOP_KEY_TRY_EXEC);
+ goto out;
+ }
+@@ -2230,68 +2241,72 @@ close_conversation (GdmSessionConversation *conversation)
+
+ if (conversation->worker_manager_interface != NULL) {
+ unexport_worker_manager_interface (self, conversation->worker_manager_interface);
+ g_clear_object (&conversation->worker_manager_interface);
+ }
+
+ if (conversation->worker_proxy != NULL) {
+ GDBusConnection *connection = g_dbus_proxy_get_connection (G_DBUS_PROXY (conversation->worker_proxy));
+ g_dbus_connection_close_sync (connection, NULL, NULL);
+ }
+ }
+
+ static void
+ stop_conversation (GdmSessionConversation *conversation)
+ {
+ close_conversation (conversation);
+
+ conversation->is_stopping = TRUE;
+ gdm_session_worker_job_stop (conversation->job);
+ }
+
+ static void
+ stop_conversation_now (GdmSessionConversation *conversation)
+ {
+ close_conversation (conversation);
+
+ gdm_session_worker_job_stop_now (conversation->job);
+ g_clear_object (&conversation->job);
+ }
+
+-#ifdef ENABLE_WAYLAND_SUPPORT
+ void
+-gdm_session_set_ignore_wayland (GdmSession *self,
+- gboolean ignore_wayland)
++gdm_session_set_supported_session_types (GdmSession *self,
++ const char * const *supported_session_types)
+ {
+- self->ignore_wayland = ignore_wayland;
++ const char * const session_types[] = { "wayland", "x11", NULL };
++ g_strfreev (self->supported_session_types);
++
++ if (supported_session_types == NULL)
++ self->supported_session_types = g_strdupv ((GStrv) session_types);
++ else
++ self->supported_session_types = g_strdupv ((GStrv) supported_session_types);
+ }
+-#endif
+
+ gboolean
+ gdm_session_start_conversation (GdmSession *self,
+ const char *service_name)
+ {
+ GdmSessionConversation *conversation;
+
+ g_return_val_if_fail (GDM_IS_SESSION (self), FALSE);
+
+ conversation = g_hash_table_lookup (self->conversations,
+ service_name);
+
+ if (conversation != NULL) {
+ if (!conversation->is_stopping) {
+ g_warning ("GdmSession: conversation %s started more than once", service_name);
+ return FALSE;
+ }
+ g_debug ("GdmSession: stopping old conversation %s", service_name);
+ gdm_session_worker_job_stop_now (conversation->job);
+ g_object_unref (conversation->job);
+ conversation->job = NULL;
+ }
+
+ g_debug ("GdmSession: starting conversation %s for session (%p)", service_name, self);
+
+ conversation = start_conversation (self, service_name);
+
+ g_hash_table_insert (self->conversations,
+ g_strdup (service_name), conversation);
+ return TRUE;
+@@ -3162,69 +3177,69 @@ gdm_session_get_session_id (GdmSession *self)
+
+ const char *
+ gdm_session_get_conversation_session_id (GdmSession *self,
+ const char *service_name)
+ {
+ GdmSessionConversation *conversation;
+
+ g_return_val_if_fail (GDM_IS_SESSION (self), NULL);
+
+ conversation = find_conversation_by_name (self, service_name);
+
+ if (conversation == NULL) {
+ return NULL;
+ }
+
+ return conversation->session_id;
+ }
+
+ static char *
+ get_session_filename (GdmSession *self)
+ {
+ return g_strdup_printf ("%s.desktop", get_session_name (self));
+ }
+
+ #ifdef ENABLE_WAYLAND_SUPPORT
+ static gboolean
+ gdm_session_is_wayland_session (GdmSession *self)
+ {
+ GKeyFile *key_file;
+ gboolean is_wayland_session = FALSE;
+- char *filename;
+- char *full_path = NULL;
++ char *filename;
++ g_autofree char *full_path = NULL;
+
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (GDM_IS_SESSION (self), FALSE);
+
+ filename = get_session_filename (self);
+
+- key_file = load_key_file_for_file (self, filename, "wayland", &full_path);
++ key_file = load_key_file_for_file (self, filename, NULL, &full_path);
+
+ if (key_file == NULL) {
+ goto out;
+ }
+
+ if (full_path != NULL && strstr (full_path, "/wayland-sessions/") != NULL) {
+ is_wayland_session = TRUE;
+ }
+ g_debug ("GdmSession: checking if file '%s' is wayland session: %s", filename, is_wayland_session? "yes" : "no");
+
+ out:
+ g_clear_pointer (&key_file, g_key_file_free);
+ g_free (filename);
+ return is_wayland_session;
+ }
+ #endif
+
+ static void
+ update_session_type (GdmSession *self)
+ {
+ #ifdef ENABLE_WAYLAND_SUPPORT
+ gboolean is_wayland_session = FALSE;
+
+ is_wayland_session = gdm_session_is_wayland_session (self);
+
+ if (is_wayland_session) {
+ set_session_type (self, "wayland");
+ } else {
+ set_session_type (self, NULL);
+ }
+@@ -3513,140 +3528,138 @@ gdm_session_set_property (GObject *object,
+ case PROP_DISPLAY_HOSTNAME:
+ set_display_hostname (self, g_value_get_string (value));
+ break;
+ case PROP_DISPLAY_DEVICE:
+ set_display_device (self, g_value_get_string (value));
+ break;
+ case PROP_DISPLAY_SEAT_ID:
+ set_display_seat_id (self, g_value_get_string (value));
+ break;
+ case PROP_USER_X11_AUTHORITY_FILE:
+ set_user_x11_authority_file (self, g_value_get_string (value));
+ break;
+ case PROP_DISPLAY_X11_AUTHORITY_FILE:
+ set_display_x11_authority_file (self, g_value_get_string (value));
+ break;
+ case PROP_DISPLAY_IS_LOCAL:
+ set_display_is_local (self, g_value_get_boolean (value));
+ break;
+ case PROP_DISPLAY_IS_INITIAL:
+ set_display_is_initial (self, g_value_get_boolean (value));
+ break;
+ case PROP_VERIFICATION_MODE:
+ set_verification_mode (self, g_value_get_enum (value));
+ break;
+ case PROP_ALLOWED_USER:
+ set_allowed_user (self, g_value_get_uint (value));
+ break;
+ case PROP_CONVERSATION_ENVIRONMENT:
+ set_conversation_environment (self, g_value_get_pointer (value));
+ break;
+-#ifdef ENABLE_WAYLAND_SUPPORT
+- case PROP_IGNORE_WAYLAND:
+- gdm_session_set_ignore_wayland (self, g_value_get_boolean (value));
++ case PROP_SUPPORTED_SESSION_TYPES:
++ gdm_session_set_supported_session_types (self, g_value_get_boxed (value));
+ break;
+-#endif
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ }
+
+ static void
+ gdm_session_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+ {
+ GdmSession *self;
+
+ self = GDM_SESSION (object);
+
+ switch (prop_id) {
+ case PROP_SESSION_TYPE:
+ g_value_set_string (value, self->session_type);
+ break;
+ case PROP_DISPLAY_NAME:
+ g_value_set_string (value, self->display_name);
+ break;
+ case PROP_DISPLAY_HOSTNAME:
+ g_value_set_string (value, self->display_hostname);
+ break;
+ case PROP_DISPLAY_DEVICE:
+ g_value_set_string (value, self->display_device);
+ break;
+ case PROP_DISPLAY_SEAT_ID:
+ g_value_set_string (value, self->display_seat_id);
+ break;
+ case PROP_USER_X11_AUTHORITY_FILE:
+ g_value_set_string (value, self->user_x11_authority_file);
+ break;
+ case PROP_DISPLAY_X11_AUTHORITY_FILE:
+ g_value_set_string (value, self->display_x11_authority_file);
+ break;
+ case PROP_DISPLAY_IS_LOCAL:
+ g_value_set_boolean (value, self->display_is_local);
+ break;
+ case PROP_DISPLAY_IS_INITIAL:
+ g_value_set_boolean (value, self->display_is_initial);
+ break;
+ case PROP_VERIFICATION_MODE:
+ g_value_set_enum (value, self->verification_mode);
+ break;
+ case PROP_ALLOWED_USER:
+ g_value_set_uint (value, self->allowed_user);
+ break;
+ case PROP_CONVERSATION_ENVIRONMENT:
+ g_value_set_pointer (value, self->environment);
+ break;
+-#ifdef ENABLE_WAYLAND_SUPPORT
+- case PROP_IGNORE_WAYLAND:
+- g_value_set_boolean (value, self->ignore_wayland);
++ case PROP_SUPPORTED_SESSION_TYPES:
++ g_value_set_boxed (value, self->supported_session_types);
+ break;
+-#endif
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+ }
+
+ static void
+ gdm_session_dispose (GObject *object)
+ {
+ GdmSession *self;
+
+ self = GDM_SESSION (object);
+
+ g_debug ("GdmSession: Disposing session");
+
+ gdm_session_close (self);
+
++ g_clear_pointer (&self->supported_session_types,
++ g_strfreev);
+ g_clear_pointer (&self->conversations,
+ g_hash_table_unref);
+
+ g_clear_object (&self->user_verifier_interface);
+ g_clear_pointer (&self->user_verifier_extensions,
+ g_hash_table_unref);
+ g_clear_object (&self->greeter_interface);
+ g_clear_object (&self->remote_greeter_interface);
+ g_clear_object (&self->chooser_interface);
+
+ g_free (self->display_name);
+ self->display_name = NULL;
+
+ g_free (self->display_hostname);
+ self->display_hostname = NULL;
+
+ g_free (self->display_device);
+ self->display_device = NULL;
+
+ g_free (self->display_seat_id);
+ self->display_seat_id = NULL;
+
+ g_free (self->display_x11_authority_file);
+ self->display_x11_authority_file = NULL;
+
+ g_strfreev (self->conversation_environment);
+ self->conversation_environment = NULL;
+
+ if (self->worker_server != NULL) {
+ g_dbus_server_stop (self->worker_server);
+@@ -4007,69 +4020,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",
+ "display x11 authority file",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
+ /* not construct only */
+ g_object_class_install_property (object_class,
+ PROP_USER_X11_AUTHORITY_FILE,
+ g_param_spec_string ("user-x11-authority-file",
+ "",
+ "",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (object_class,
+ PROP_DISPLAY_DEVICE,
+ g_param_spec_string ("display-device",
+ "display device",
+ "display device",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (object_class,
+ PROP_DISPLAY_SEAT_ID,
+ g_param_spec_string ("display-seat-id",
+ "display seat id",
+ "display seat id",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
+
+-#ifdef ENABLE_WAYLAND_SUPPORT
+ g_object_class_install_property (object_class,
+- PROP_IGNORE_WAYLAND,
+- g_param_spec_boolean ("ignore-wayland",
+- "ignore wayland",
+- "ignore wayland",
+- FALSE,
+- G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
+-#endif
++ PROP_SUPPORTED_SESSION_TYPES,
++ g_param_spec_boxed ("supported-session-types",
++ "supported session types",
++ "supported session types",
++ G_TYPE_STRV,
++ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
+
+ /* Ensure we can resolve errors */
+ gdm_dbus_error_ensure (GDM_SESSION_WORKER_ERROR);
+ }
+
+ GdmSession *
+ gdm_session_new (GdmSessionVerificationMode verification_mode,
+ uid_t allowed_user,
+ const char *display_name,
+ const char *display_hostname,
+ const char *display_device,
+ const char *display_seat_id,
+ const char *display_x11_authority_file,
+ gboolean display_is_local,
+ const char * const *environment)
+ {
+ GdmSession *self;
+
+ self = g_object_new (GDM_TYPE_SESSION,
+ "verification-mode", verification_mode,
+ "allowed-user", (guint) allowed_user,
+ "display-name", display_name,
+ "display-hostname", display_hostname,
+ "display-device", display_device,
+ "display-seat-id", display_seat_id,
+ "display-x11-authority-file", display_x11_authority_file,
+ "display-is-local", display_is_local,
+ "conversation-environment", environment,
+ NULL);
+
+diff --git a/data/gdm.schemas.in b/data/gdm.schemas.in
+index 255bff023..a1035f95e 100644
+--- a/data/gdm.schemas.in
++++ b/data/gdm.schemas.in
+@@ -25,65 +25,75 @@
+ <schema>
+ <key>daemon/AutomaticLoginEnable</key>
+ <signature>b</signature>
+ <default>false</default>
+ </schema>
+ <schema>
+ <key>daemon/AutomaticLogin</key>
+ <signature>s</signature>
+ <default></default>
+ </schema>
+ <schema>
+ <key>daemon/TimedLoginEnable</key>
+ <signature>b</signature>
+ <default>false</default>
+ </schema>
+ <schema>
+ <key>daemon/TimedLogin</key>
+ <signature>s</signature>
+ <default></default>
+ </schema>
+ <schema>
+ <key>daemon/TimedLoginDelay</key>
+ <signature>i</signature>
+ <default>30</default>
+ </schema>
+ <schema>
+ <key>daemon/InitialSetupEnable</key>
+ <signature>b</signature>
+ <default>true</default>
+ </schema>
++ <schema>
++ <key>daemon/PreferredDisplayServer</key>
++ <signature>s</signature>
++ <default>wayland</default>
++ </schema>
+ <schema>
+ <key>daemon/WaylandEnable</key>
+ <signature>b</signature>
+ <default>true</default>
+ </schema>
++ <schema>
++ <key>daemon/XorgEnable</key>
++ <signature>b</signature>
++ <default>true</default>
++ </schema>
+ <schema>
+ <key>security/AllowRemoteAutoLogin</key>
+ <signature>b</signature>
+ <default>false</default>
+ </schema>
+
+ <schema>
+ <key>debug/Enable</key>
+ <signature>b</signature>
+ <default>false</default>
+ </schema>
+
+ <schema>
+ <key>security/DisallowTCP</key>
+ <signature>b</signature>
+ <default>true</default>
+ </schema>
+ <schema>
+ <key>xdmcp/Enable</key>
+ <signature>b</signature>
+ <default>false</default>
+ </schema>
+ <schema>
+ <key>xdmcp/ShowLocalGreeter</key>
+ <signature>b</signature>
+ <default>true</default>
+ </schema>
+ <schema>
+ <key>xdmcp/MaxPending</key>
+ <signature>i</signature>
+diff --git a/libgdm/gdm-sessions.c b/libgdm/gdm-sessions.c
+index a13225050..f078e04b8 100644
+--- a/libgdm/gdm-sessions.c
++++ b/libgdm/gdm-sessions.c
+@@ -163,171 +163,203 @@ load_session_file (const char *id,
+
+ static gboolean
+ remove_duplicate_sessions (gpointer key,
+ gpointer value,
+ gpointer user_data)
+ {
+ gboolean already_known;
+ GHashTable *names_seen_before;
+ GdmSessionFile *session;
+
+ names_seen_before = (GHashTable *) user_data;
+ session = (GdmSessionFile *) value;
+ already_known = !g_hash_table_add (names_seen_before, session->translated_name);
+
+ if (already_known)
+ g_debug ("GdmSession: Removing %s (%s) as we already have a session by this name",
+ session->id,
+ session->path);
+
+ return already_known;
+ }
+
+ static void
+ collect_sessions_from_directory (const char *dirname)
+ {
+ GDir *dir;
+ const char *filename;
+
+ gboolean is_x11 = g_getenv ("WAYLAND_DISPLAY") == NULL &&
+ g_getenv ("RUNNING_UNDER_GDM") != NULL;
++ gboolean is_wayland = g_getenv ("WAYLAND_DISPLAY") != NULL &&
++ g_getenv ("RUNNING_UNDER_GDM") != NULL;
+
+ /* FIXME: add file monitor to directory */
+
+ dir = g_dir_open (dirname, 0, NULL);
+ if (dir == NULL) {
+ return;
+ }
+
+ while ((filename = g_dir_read_name (dir))) {
+ char *id;
+ char *full_path;
+
+ if (! g_str_has_suffix (filename, ".desktop")) {
+ continue;
+ }
+
+- if (is_x11 && g_str_has_suffix (filename, "-xorg.desktop")) {
+- char *base_name = g_strndup (filename, strlen (filename) - strlen ("-xorg.desktop"));
+- char *fallback_name = g_strconcat (base_name, ".desktop", NULL);
+- g_free (base_name);
+- char *fallback_path = g_build_filename (dirname, fallback_name, NULL);
+- g_free (fallback_name);
+- if (g_file_test (fallback_path, G_FILE_TEST_EXISTS)) {
+- g_free (fallback_path);
+- g_debug ("Running under X11, ignoring %s", filename);
+- continue;
++ if (is_wayland) {
++ if (g_str_has_suffix (filename, "-wayland.desktop")) {
++ g_autofree char *base_name = g_strndup (filename, strlen (filename) - strlen ("-wayland.desktop"));
++ g_autofree char *other_name = g_strconcat (base_name, ".desktop", NULL);
++ g_autofree char *other_path = g_build_filename (dirname, other_name, NULL);
++
++ if (g_file_test (other_path, G_FILE_TEST_EXISTS)) {
++ g_debug ("Running under Wayland, ignoring %s", filename);
++ continue;
++ }
++ } else {
++ g_autofree char *base_name = g_strndup (filename, strlen (filename) - strlen (".desktop"));
++ g_autofree char *other_name = g_strdup_printf ("%s-xorg.desktop", base_name);
++ g_autofree char *other_path = g_build_filename (dirname, other_name, NULL);
++
++ if (g_file_test (other_path, G_FILE_TEST_EXISTS)) {
++ g_debug ("Running under Wayland, ignoring %s", filename);
++ continue;
++ }
++ }
++ } else if (is_x11) {
++ if (g_str_has_suffix (filename, "-xorg.desktop")) {
++ g_autofree char *base_name = g_strndup (filename, strlen (filename) - strlen ("-xorg.desktop"));
++ g_autofree char *other_name = g_strconcat (base_name, ".desktop", NULL);
++ g_autofree char *other_path = g_build_filename (dirname, other_name, NULL);
++
++ if (g_file_test (other_path, G_FILE_TEST_EXISTS)) {
++ g_debug ("Running under X11, ignoring %s", filename);
++ continue;
++ }
++ } else {
++ g_autofree char *base_name = g_strndup (filename, strlen (filename) - strlen (".desktop"));
++ g_autofree char *other_name = g_strdup_printf ("%s-wayland.desktop", base_name);
++ g_autofree char *other_path = g_build_filename (dirname, other_name, NULL);
++
++ if (g_file_test (other_path, G_FILE_TEST_EXISTS)) {
++ g_debug ("Running under X11, ignoring %s", filename);
++ continue;
++ }
+ }
+- g_free (fallback_path);
+ }
+
+ id = g_strndup (filename, strlen (filename) - strlen (".desktop"));
+
+ full_path = g_build_filename (dirname, filename, NULL);
+
+ load_session_file (id, full_path);
+
+ g_free (id);
+ g_free (full_path);
+ }
+
+ g_dir_close (dir);
+ }
+
+ static void
+ collect_sessions (void)
+ {
+ g_autoptr(GHashTable) names_seen_before = NULL;
+ g_autoptr(GPtrArray) xorg_search_array = NULL;
+ g_autoptr(GPtrArray) wayland_search_array = NULL;
+ gchar *session_dir = NULL;
+ int i;
+ const char *xorg_search_dirs[] = {
+ "/etc/X11/sessions/",
+ DMCONFDIR "/Sessions/",
+ DATADIR "/gdm/BuiltInSessions/",
+ DATADIR "/xsessions/",
+ };
++ g_auto (GStrv) supported_session_types = NULL;
++
++ supported_session_types = g_strsplit (g_getenv ("GDM_SUPPORTED_SESSION_TYPES"), ":", -1);
+
+ names_seen_before = g_hash_table_new (g_str_hash, g_str_equal);
+ xorg_search_array = g_ptr_array_new_with_free_func (g_free);
+
+ const gchar * const *system_data_dirs = g_get_system_data_dirs ();
+
+ for (i = 0; system_data_dirs[i]; i++) {
+ session_dir = g_build_filename (system_data_dirs[i], "xsessions", NULL);
+ g_ptr_array_add (xorg_search_array, session_dir);
+ }
+
+ for (i = 0; i < G_N_ELEMENTS (xorg_search_dirs); i++) {
+ g_ptr_array_add (xorg_search_array, g_strdup (xorg_search_dirs[i]));
+ }
+
+ #ifdef ENABLE_WAYLAND_SUPPORT
+ const char *wayland_search_dirs[] = {
+ DATADIR "/wayland-sessions/",
+ };
+
+ wayland_search_array = g_ptr_array_new_with_free_func (g_free);
+
+ for (i = 0; system_data_dirs[i]; i++) {
+ session_dir = g_build_filename (system_data_dirs[i], "wayland-sessions", NULL);
+ g_ptr_array_add (wayland_search_array, session_dir);
+ }
+
+ for (i = 0; i < G_N_ELEMENTS (wayland_search_dirs); i++) {
+ g_ptr_array_add (wayland_search_array, g_strdup (wayland_search_dirs[i]));
+ }
+ #endif
+
+ if (gdm_available_sessions_map == NULL) {
+ gdm_available_sessions_map = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, (GDestroyNotify)gdm_session_file_free);
+ }
+
+- for (i = 0; i < xorg_search_array->len; i++) {
+- collect_sessions_from_directory (g_ptr_array_index (xorg_search_array, i));
++ if (!supported_session_types || g_strv_contains ((const char * const *) supported_session_types, "x11")) {
++ for (i = 0; i < xorg_search_array->len; i++) {
++ collect_sessions_from_directory (g_ptr_array_index (xorg_search_array, i));
++ }
+ }
+
+ #ifdef ENABLE_WAYLAND_SUPPORT
+ #ifdef ENABLE_USER_DISPLAY_SERVER
+- if (g_getenv ("WAYLAND_DISPLAY") == NULL && g_getenv ("RUNNING_UNDER_GDM") != NULL) {
+- goto out;
++ if (!supported_session_types || g_strv_contains ((const char * const *) supported_session_types, "wayland")) {
++ for (i = 0; i < wayland_search_array->len; i++) {
++ collect_sessions_from_directory (g_ptr_array_index (wayland_search_array, i));
++ }
+ }
+ #endif
+-
+- for (i = 0; i < wayland_search_array->len; i++) {
+- collect_sessions_from_directory (g_ptr_array_index (wayland_search_array, i));
+- }
+ #endif
+
+-out:
+ g_hash_table_foreach_remove (gdm_available_sessions_map,
+ remove_duplicate_sessions,
+ names_seen_before);
+ }
+
+ static gint
+ compare_session_ids (gconstpointer a,
+ gconstpointer b)
+ {
+ GdmSessionFile *session_a, *session_b;
+ session_a = (GdmSessionFile *) g_hash_table_lookup (gdm_available_sessions_map, a);
+ session_b = (GdmSessionFile *) g_hash_table_lookup (gdm_available_sessions_map, b);
+
+ if (session_a == NULL)
+ return -1;
+
+ if (session_b == NULL)
+ return 1;
+
+ return g_strcmp0 (session_a->translated_name, session_b->translated_name);
+ }
+
+ /**
+ * gdm_get_session_ids:
+ *
+ * Reads /usr/share/xsessions and other relevant places for possible sessions
+ * to log into and returns the complete list.
+ *
+ * Returns: (transfer full): a %NULL terminated list of session ids
+ */
+--
+2.31.1
+
diff --git a/0001-local-display-factory-Stall-startup-until-main-graph.patch b/0001-local-display-factory-Stall-startup-until-main-graph.patch
new file mode 100644
index 0000000..d88da45
--- /dev/null
+++ b/0001-local-display-factory-Stall-startup-until-main-graph.patch
@@ -0,0 +1,729 @@
+From e88779b0785fe781608b10478ae092e8fd79ae0b Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Tue, 1 Mar 2022 13:25:02 -0500
+Subject: [PATCH 1/4] local-display-factory: Stall startup until main graphics
+ card is ready
+
+At the moment, GDM waits until systemd says the system supports
+graphics (via the CanGraphical logind property).
+
+Unfortunately, this property isn't really what we need, since it flips
+to true when *any* graphics are available, not when the main graphics
+for the system are ready.
+
+This is a problem on hybrid graphics systems, if one card is slower to
+load than another. In particular, the vendor nvidia driver can be slow
+to load because it has multiple kernel modules it loads in series.
+
+Indeed on fast systems, that use the vendor nvidia driver, it's not
+unusual for boot to get to a point where all of userspace up to and
+including GDM is executed before the graphics are ready to go.
+
+This commit tries to mitigate the situation by adding an additional,
+check aside from CanGraphical to test if the system is ready.
+
+This check waits for the graphics card associated with boot to be fully
+up and running before proceeding to start a login screen.
+
+Closes: https://gitlab.gnome.org/GNOME/gdm/-/issues/763
+---
+ daemon/gdm-local-display-factory.c | 168 ++++++++++++++++++++++++++---
+ daemon/meson.build | 4 +
+ meson.build | 2 +
+ 3 files changed, 162 insertions(+), 12 deletions(-)
+
+diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
+index ca14c31f5..56be1d9db 100644
+--- a/daemon/gdm-local-display-factory.c
++++ b/daemon/gdm-local-display-factory.c
+@@ -1,100 +1,112 @@
+ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+ #include "config.h"
+
+ #include <stdlib.h>
+ #include <stdio.h>
+
+ #include <glib.h>
+ #include <glib/gi18n.h>
+ #include <glib-object.h>
+ #include <gio/gio.h>
+
++#ifdef HAVE_UDEV
++#include <gudev/gudev.h>
++#endif
++
+ #include <systemd/sd-login.h>
+
+ #include "gdm-common.h"
+ #include "gdm-manager.h"
+ #include "gdm-display-factory.h"
+ #include "gdm-local-display-factory.h"
+ #include "gdm-local-display-factory-glue.h"
+
+ #include "gdm-settings-keys.h"
+ #include "gdm-settings-direct.h"
+ #include "gdm-display-store.h"
+ #include "gdm-local-display.h"
+ #include "gdm-legacy-display.h"
+
+ #define GDM_DBUS_PATH "/org/gnome/DisplayManager"
+ #define GDM_LOCAL_DISPLAY_FACTORY_DBUS_PATH GDM_DBUS_PATH "/LocalDisplayFactory"
+ #define GDM_MANAGER_DBUS_NAME "org.gnome.DisplayManager.LocalDisplayFactory"
+
+ #define MAX_DISPLAY_FAILURES 5
+ #define WAIT_TO_FINISH_TIMEOUT 10 /* seconds */
+ #define SEAT0_GRAPHICS_CHECK_TIMEOUT 10 /* seconds */
+
+ struct _GdmLocalDisplayFactory
+ {
+- GdmDisplayFactory parent;
++ GdmDisplayFactory parent;
++#ifdef HAVE_UDEV
++ GUdevClient *gudev_client;
++#endif
+
+ GdmDBusLocalDisplayFactory *skeleton;
+ GDBusConnection *connection;
+ GHashTable *used_display_numbers;
+
+ /* FIXME: this needs to be per seat? */
+ guint num_failures;
+
+ guint seat_new_id;
+ guint seat_removed_id;
+ guint seat_properties_changed_id;
+
++ gboolean seat0_has_platform_graphics;
++ gboolean seat0_has_boot_up_graphics;
++
+ gboolean seat0_graphics_check_timed_out;
+ guint seat0_graphics_check_timeout_id;
+
++ gulong uevent_handler_id;
++
+ #if defined(ENABLE_USER_DISPLAY_SERVER)
+ unsigned int active_vt;
+ guint active_vt_watch_id;
+ guint wait_to_finish_timeout_id;
+ #endif
+
+ gboolean is_started;
+ };
+
+ enum {
+ PROP_0,
+ };
+
+ static void gdm_local_display_factory_class_init (GdmLocalDisplayFactoryClass *klass);
+ static void gdm_local_display_factory_init (GdmLocalDisplayFactory *factory);
+ static void gdm_local_display_factory_finalize (GObject *object);
+
+ static void ensure_display_for_seat (GdmLocalDisplayFactory *factory,
+ const char *seat_id);
+
+ static void on_display_status_changed (GdmDisplay *display,
+ GParamSpec *arg1,
+ GdmLocalDisplayFactory *factory);
+
+ static gboolean gdm_local_display_factory_sync_seats (GdmLocalDisplayFactory *factory);
+ static gpointer local_display_factory_object = NULL;
+ static gboolean lookup_by_session_id (const char *id,
+ GdmDisplay *display,
+ gpointer user_data);
+
+@@ -594,142 +606,236 @@ lookup_by_seat_id (const char *id,
+ gpointer user_data)
+ {
+ const char *looking_for = user_data;
+ char *current;
+ gboolean res;
+
+ g_object_get (G_OBJECT (display), "seat-id", &current, NULL);
+
+ res = g_strcmp0 (current, looking_for) == 0;
+
+ g_free(current);
+
+ return res;
+ }
+
+ static gboolean
+ lookup_prepared_display_by_seat_id (const char *id,
+ GdmDisplay *display,
+ gpointer user_data)
+ {
+ int status;
+
+ status = gdm_display_get_status (display);
+
+ if (status != GDM_DISPLAY_PREPARED)
+ return FALSE;
+
+ return lookup_by_seat_id (id, display, user_data);
+ }
+
++#ifdef HAVE_UDEV
++static gboolean
++udev_is_settled (GdmLocalDisplayFactory *factory)
++{
++ g_autoptr (GUdevEnumerator) enumerator = NULL;
++ GList *devices;
++ GList *node;
++
++ gboolean is_settled = FALSE;
++
++ if (factory->seat0_has_platform_graphics) {
++ g_debug ("GdmLocalDisplayFactory: udev settled, platform graphics enabled.");
++ return TRUE;
++ }
++
++ if (factory->seat0_has_boot_up_graphics) {
++ g_debug ("GdmLocalDisplayFactory: udev settled, boot up graphics available.");
++ return TRUE;
++ }
++
++ if (factory->seat0_graphics_check_timed_out) {
++ g_debug ("GdmLocalDisplayFactory: udev timed out, proceeding anyway.");
++ return TRUE;
++ }
++
++ g_debug ("GdmLocalDisplayFactory: Checking if udev has settled enough to support graphics.");
++
++ enumerator = g_udev_enumerator_new (factory->gudev_client);
++
++ g_udev_enumerator_add_match_name (enumerator, "card*");
++ g_udev_enumerator_add_match_tag (enumerator, "master-of-seat");
++ g_udev_enumerator_add_match_subsystem (enumerator, "drm");
++
++ devices = g_udev_enumerator_execute (enumerator);
++ if (!devices) {
++ g_debug ("GdmLocalDisplayFactory: udev has no candidate graphics devices available yet.");
++ return FALSE;
++ }
++
++ node = devices;
++ while (node != NULL) {
++ GUdevDevice *device = node->data;
++ GList *next_node = node->next;
++ g_autoptr (GUdevDevice) platform_device = NULL;
++ g_autoptr (GUdevDevice) pci_device = NULL;
++
++ platform_device = g_udev_device_get_parent_with_subsystem (device, "platform", NULL);
++
++ if (platform_device != NULL) {
++ g_debug ("GdmLocalDisplayFactory: Found embedded platform graphics, proceeding.");
++ factory->seat0_has_platform_graphics = TRUE;
++ is_settled = TRUE;
++ break;
++ }
++
++ pci_device = g_udev_device_get_parent_with_subsystem (device, "pci", NULL);
++
++ if (pci_device != NULL) {
++ gboolean boot_vga;
++
++ boot_vga = g_udev_device_get_sysfs_attr_as_int (pci_device, "boot_vga");
++
++ if (boot_vga == 1) {
++ g_debug ("GdmLocalDisplayFactory: Found primary PCI graphics adapter, proceeding.");
++ factory->seat0_has_boot_up_graphics = TRUE;
++ is_settled = TRUE;
++ break;
++ } else {
++ g_debug ("GdmLocalDisplayFactory: Found secondary PCI graphics adapter, not proceeding yet.");
++ }
++ }
++ node = next_node;
++ }
++
++ g_debug ("GdmLocalDisplayFactory: udev has %ssettled enough for graphics.", is_settled? "" : "not ");
++ g_list_free_full (devices, g_object_unref);
++
++ if (is_settled)
++ g_clear_signal_handler (&factory->uevent_handler_id, factory->gudev_client);
++
++ return is_settled;
++}
++#endif
++
+ static int
+ on_seat0_graphics_check_timeout (gpointer user_data)
+ {
+ GdmLocalDisplayFactory *factory = user_data;
+
+ factory->seat0_graphics_check_timeout_id = 0;
+
+ /* Simply try to re-add seat0. If it is there already (i.e. CanGraphical
+ * turned TRUE, then we'll find it and it will not be created again).
+ */
+ factory->seat0_graphics_check_timed_out = TRUE;
+ ensure_display_for_seat (factory, "seat0");
+
+ return G_SOURCE_REMOVE;
+ }
+
+ static void
+ ensure_display_for_seat (GdmLocalDisplayFactory *factory,
+ const char *seat_id)
+ {
+ int ret;
+ gboolean seat_supports_graphics;
+ gboolean is_seat0;
+ 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;
+ gboolean wayland_enabled = FALSE, xorg_enabled = FALSE;
+ g_autofree gchar *preferred_display_server = NULL;
+ gboolean falling_back = FALSE;
++ gboolean waiting_on_udev = FALSE;
+
+ gdm_settings_direct_get_boolean (GDM_KEY_WAYLAND_ENABLE, &wayland_enabled);
+ gdm_settings_direct_get_boolean (GDM_KEY_XORG_ENABLE, &xorg_enabled);
+
+ preferred_display_server = get_preferred_display_server (factory);
+
+ if (g_strcmp0 (preferred_display_server, "none") == 0) {
+ g_debug ("GdmLocalDisplayFactory: Preferred display server is none, so not creating display");
+ return;
+ }
+
+- ret = sd_seat_can_graphical (seat_id);
++#ifdef HAVE_UDEV
++ waiting_on_udev = !udev_is_settled (factory);
++#endif
+
+- if (ret < 0) {
+- g_critical ("Failed to query CanGraphical information for seat %s", seat_id);
+- return;
+- }
++ if (!waiting_on_udev) {
++ ret = sd_seat_can_graphical (seat_id);
+
+- if (ret == 0) {
+- g_debug ("GdmLocalDisplayFactory: System doesn't currently support graphics");
+- seat_supports_graphics = FALSE;
++ if (ret < 0) {
++ g_critical ("Failed to query CanGraphical information for seat %s", seat_id);
++ return;
++ }
++
++ if (ret == 0) {
++ g_debug ("GdmLocalDisplayFactory: System doesn't currently support graphics");
++ seat_supports_graphics = FALSE;
++ } else {
++ g_debug ("GdmLocalDisplayFactory: System supports graphics");
++ seat_supports_graphics = TRUE;
++ }
+ } else {
+- g_debug ("GdmLocalDisplayFactory: System supports graphics");
+- seat_supports_graphics = TRUE;
++ g_debug ("GdmLocalDisplayFactory: udev is still settling, so not creating display yet");
++ seat_supports_graphics = FALSE;
+ }
+
+ if (g_strcmp0 (seat_id, "seat0") == 0) {
+ is_seat0 = TRUE;
+
+ falling_back = factory->num_failures > 0;
+ session_types = gdm_local_display_factory_get_session_types (factory, falling_back);
+
+ if (session_types == NULL) {
+ g_debug ("GdmLocalDisplayFactory: Both Wayland and Xorg are unavailable");
+ seat_supports_graphics = FALSE;
+ } else {
+ g_debug ("GdmLocalDisplayFactory: New displays on seat0 will use %s%s",
+ session_types[0], falling_back? " fallback" : "");
+ }
+ } 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_types = g_strdupv ((char **) legacy_session_types);
+ }
+
+ /* For seat0, we have a fallback logic to still try starting it after
+ * SEAT0_GRAPHICS_CHECK_TIMEOUT seconds. i.e. we simply continue even if
+- * CanGraphical is unset.
++ * CanGraphical is unset or udev otherwise never finds a suitable graphics card.
+ * This is ugly, but it means we'll come up eventually in some
+ * scenarios where no master device is present.
+ * Note that we'll force an X11 fallback even though there might be
+ * cases where an wayland capable device is present and simply not marked as
+ * master-of-seat. In these cases, this should likely be fixed in the
+ * udev rules.
+ *
+ * At the moment, systemd always sets CanGraphical for non-seat0 seats.
+ * This is because non-seat0 seats are defined by having master-of-seat
+ * set. This means we can avoid the fallback check for non-seat0 seats,
+ * which simplifies the code.
+ */
+ if (is_seat0) {
+ if (!seat_supports_graphics) {
+ if (!factory->seat0_graphics_check_timed_out) {
+ if (factory->seat0_graphics_check_timeout_id == 0) {
+ 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,
+ on_seat0_graphics_check_timeout,
+ factory);
+
+ } else {
+ /* It is not yet time to force X11 fallback. */
+ g_debug ("GdmLocalDisplayFactory: seat0 display requested when there is no graphics support before graphics check timeout.");
+ }
+
+ return;
+ }
+
+ g_debug ("GdmLocalDisplayFactory: Assuming we can use seat0 for X11 even though system says it doesn't support graphics!");
+@@ -1138,113 +1244,151 @@ on_vt_changed (GIOChannel *source,
+ if (factory->wait_to_finish_timeout_id != 0) {
+ g_debug ("GdmLocalDisplayFactory: deferring previous login screen clean up operation");
+ g_source_remove (factory->wait_to_finish_timeout_id);
+ }
+
+ factory->wait_to_finish_timeout_id = g_timeout_add_seconds (WAIT_TO_FINISH_TIMEOUT,
+ (GSourceFunc)
+ on_finish_waiting_for_seat0_displays_timeout,
+ factory);
+ }
+ }
+ }
+
+ /* if user jumped back to initial vt and it's empty put a login screen
+ * on it (unless a login screen is already running elsewhere, then
+ * jump to that login screen)
+ */
+ if (factory->active_vt != GDM_INITIAL_VT) {
+ g_debug ("GdmLocalDisplayFactory: active VT is not initial VT, so ignoring");
+ return G_SOURCE_CONTINUE;
+ }
+
+ g_debug ("GdmLocalDisplayFactory: creating new display on seat0 because of VT change");
+
+ ensure_display_for_seat (factory, "seat0");
+
+ return G_SOURCE_CONTINUE;
+ }
+ #endif
+
++#ifdef HAVE_UDEV
++static void
++on_uevent (GUdevClient *client,
++ const char *action,
++ GUdevDevice *device,
++ GdmLocalDisplayFactory *factory)
++{
++ if (!g_udev_device_get_device_file (device))
++ return;
++
++ if (g_strcmp0 (action, "add") != 0 &&
++ g_strcmp0 (action, "change") != 0)
++ return;
++
++ if (!udev_is_settled (factory))
++ return;
++
++ g_signal_handler_disconnect (factory->gudev_client, factory->uevent_handler_id);
++ factory->uevent_handler_id = 0;
++
++ ensure_display_for_seat (factory, "seat0");
++}
++#endif
++
+ static void
+ gdm_local_display_factory_start_monitor (GdmLocalDisplayFactory *factory)
+ {
+ g_autoptr (GIOChannel) io_channel = NULL;
++ const char *subsystems[] = { "drm", NULL };
+
+ factory->seat_new_id = g_dbus_connection_signal_subscribe (factory->connection,
+ "org.freedesktop.login1",
+ "org.freedesktop.login1.Manager",
+ "SeatNew",
+ "/org/freedesktop/login1",
+ NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ on_seat_new,
+ g_object_ref (factory),
+ g_object_unref);
+ factory->seat_removed_id = g_dbus_connection_signal_subscribe (factory->connection,
+ "org.freedesktop.login1",
+ "org.freedesktop.login1.Manager",
+ "SeatRemoved",
+ "/org/freedesktop/login1",
+ NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ on_seat_removed,
+ g_object_ref (factory),
+ g_object_unref);
+ factory->seat_properties_changed_id = g_dbus_connection_signal_subscribe (factory->connection,
+ "org.freedesktop.login1",
+ "org.freedesktop.DBus.Properties",
+ "PropertiesChanged",
+ NULL,
+ "org.freedesktop.login1.Seat",
+ G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_NAMESPACE,
+ on_seat_properties_changed,
+ g_object_ref (factory),
+ g_object_unref);
++#ifdef HAVE_UDEV
++ factory->gudev_client = g_udev_client_new (subsystems);
++ factory->uevent_handler_id = g_signal_connect (factory->gudev_client,
++ "uevent",
++ G_CALLBACK (on_uevent),
++ factory);
++#endif
+
+ #if defined(ENABLE_USER_DISPLAY_SERVER)
+ io_channel = g_io_channel_new_file ("/sys/class/tty/tty0/active", "r", NULL);
+
+ if (io_channel != NULL) {
+ factory->active_vt_watch_id =
+ g_io_add_watch (io_channel,
+ G_IO_PRI,
+ (GIOFunc)
+ on_vt_changed,
+ factory);
+ }
+ #endif
+ }
+
+ static void
+ gdm_local_display_factory_stop_monitor (GdmLocalDisplayFactory *factory)
+ {
++ if (factory->uevent_handler_id) {
++ g_signal_handler_disconnect (factory->gudev_client, factory->uevent_handler_id);
++ factory->uevent_handler_id = 0;
++ }
++ g_clear_object (&factory->gudev_client);
++
+ if (factory->seat_new_id) {
+ g_dbus_connection_signal_unsubscribe (factory->connection,
+ factory->seat_new_id);
+ factory->seat_new_id = 0;
+ }
+ if (factory->seat_removed_id) {
+ g_dbus_connection_signal_unsubscribe (factory->connection,
+ factory->seat_removed_id);
+ factory->seat_removed_id = 0;
+ }
+ if (factory->seat_properties_changed_id) {
+ g_dbus_connection_signal_unsubscribe (factory->connection,
+ factory->seat_properties_changed_id);
+ factory->seat_properties_changed_id = 0;
+ }
+ #if defined(ENABLE_USER_DISPLAY_SERVER)
+ if (factory->active_vt_watch_id) {
+ g_source_remove (factory->active_vt_watch_id);
+ factory->active_vt_watch_id = 0;
+ }
+ if (factory->wait_to_finish_timeout_id != 0) {
+ g_source_remove (factory->wait_to_finish_timeout_id);
+ factory->wait_to_finish_timeout_id = 0;
+ }
+ #endif
+ }
+
+ static void
+ on_display_added (GdmDisplayStore *display_store,
+ const char *id,
+diff --git a/daemon/meson.build b/daemon/meson.build
+index 2e61b6447..41f30abef 100644
+--- a/daemon/meson.build
++++ b/daemon/meson.build
+@@ -177,37 +177,41 @@ gdm_daemon_sources = files(
+ 'gdm-session-record.c',
+ 'gdm-session-worker-common.c',
+ 'gdm-session-worker-job.c',
+ 'gdm-session.c',
+ 'main.c',
+ )
+
+ gdm_daemon_gen_sources = [
+ display_dbus_gen,
+ local_display_factory_dbus_gen,
+ manager_dbus_gen,
+ local_display_dbus_gen,
+ session_dbus_gen,
+ session_worker_dbus_gen,
+ gdm_session_enums,
+ ]
+
+ if xdmcp_dep.found()
+ gdm_daemon_deps += xdmcp_dep
+
+ gdm_daemon_sources = [
+ gdm_daemon_sources,
+ files(
+ 'gdm-xdmcp-display-factory.c',
+ 'gdm-xdmcp-display.c',
+ 'gdm-xdmcp-chooser-display.c',
+ ),
+ ]
+ endif
+
++if gudev_dep.found()
++ gdm_daemon_deps += gudev_dep
++endif
++
+ gdm_daemon = executable('gdm',
+ [ gdm_daemon_sources, gdm_daemon_gen_sources ],
+ dependencies: gdm_daemon_deps,
+ include_directories: config_h_dir,
+ install: true,
+ install_dir: get_option('sbindir')
+ )
+diff --git a/meson.build b/meson.build
+index 02d609dc0..05d8da412 100644
+--- a/meson.build
++++ b/meson.build
+@@ -11,60 +11,61 @@ i18n = import('i18n')
+
+ # Compiler
+ cc = meson.get_compiler('c')
+
+ # Options
+ gdm_prefix = get_option('prefix')
+
+ gdmconfdir = (get_option('sysconfsubdir') == '')? gdm_prefix / get_option('sysconfdir') : gdm_prefix / get_option('sysconfdir') / get_option('sysconfsubdir')
+ dmconfdir = (get_option('dmconfdir') != '')? get_option('dmconfdir') : gdm_prefix / get_option('sysconfdir') / 'dm'
+ udev_dir = get_option('udev-dir')
+ at_spi_registryd_dir = (get_option('at-spi-registryd-dir') != '')? get_option('at-spi-registryd-dir') : gdm_prefix / get_option('libexecdir')
+ lang_config_file = (get_option('lang-file') != '')? get_option('lang-file') : gdm_prefix / get_option('sysconfdir') / 'locale.conf'
+ pam_mod_dir = (get_option('pam-mod-dir') != '')? get_option('pam-mod-dir') : gdm_prefix / get_option('libdir') / 'security'
+ dbus_sys_dir = (get_option('dbus-sys') != '')? get_option('dbus-sys') : get_option('sysconfdir') / 'dbus-1' / 'system.d'
+ gdm_defaults_conf = (get_option('defaults-conf') != '')? get_option('defaults-conf') : gdm_prefix / get_option('datadir') / 'gdm' / 'defaults.conf'
+ gdm_custom_conf = (get_option('custom-conf') != '')? get_option('custom-conf') : gdmconfdir / 'custom.conf'
+ gnome_settings_daemon_dir = (get_option('gnome-settings-daemon-dir') != '')? get_option('gnome-settings-daemon-dir') : gdm_prefix / get_option('libexecdir')
+ gdm_run_dir = (get_option('run-dir') != '')? get_option('run-dir') : gdm_prefix / get_option('localstatedir') / 'run' / 'gdm'
+ gdm_runtime_conf = (get_option('runtime-conf') != '')? get_option('runtime-conf') : gdm_run_dir / 'custom.conf'
+ gdm_pid_file = (get_option('pid-file') != '')? get_option('pid-file') : gdm_run_dir / 'gdm.pid'
+ ran_once_marker_dir = (get_option('ran-once-marker-dir') != '')? get_option('ran-once-marker-dir') : gdm_run_dir
+ working_dir = (get_option('working-dir') != '')? get_option('working-dir') : gdm_prefix / get_option('localstatedir') / 'lib' / 'gdm'
+ gdm_xauth_dir = (get_option('xauth-dir') != '')? get_option('xauth-dir') : gdm_run_dir
+ gdm_screenshot_dir = (get_option('screenshot-dir') != '')? get_option('screenshot-dir') : gdm_run_dir / 'greeter'
+
+ # Common variables
+ config_h_dir = include_directories('.')
+
+ # Dependencies
+ udev_dep = dependency('udev')
++gudev_dep = dependency('gudev-1.0', version: '>= 232')
+
+ glib_min_version = '2.56.0'
+
+ glib_dep = dependency('glib-2.0', version: '>=' + glib_min_version)
+ gobject_dep = dependency('gobject-2.0', version: '>=' + glib_min_version)
+ gio_dep = dependency('gio-2.0', version: '>=' + glib_min_version)
+ gio_unix_dep = dependency('gio-unix-2.0', version: '>=' + glib_min_version)
+ gtk_dep = dependency('gtk+-3.0', version: '>= 2.91.1')
+ libcanberra_gtk_dep = dependency('libcanberra-gtk3', version: '>= 0.4')
+ accountsservice_dep = dependency('accountsservice', version: '>= 0.6.35')
+ xcb_dep = dependency('xcb')
+ keyutils_dep = dependency('libkeyutils', required: false)
+ libselinux_dep = dependency('libselinux', required: get_option('selinux'))
+
+ # udev
+ if udev_dir == ''
+ if udev_dep.found()
+ udev_prefix = udev_dep.get_pkgconfig_variable('udevdir')
+ else
+ udev_prefix = gdm_prefix / 'lib' / 'udev'
+ endif
+ udev_dir = udev_prefix / 'rules.d'
+ endif
+
+ # X11
+ x_deps = declare_dependency(
+ dependencies: [
+ dependency('x11'),
+ dependency('xau'),
+ ],
+@@ -217,60 +218,61 @@ conf.set('HAVE_UTMP_H', have_utmp_header)
+ conf.set('HAVE_UTMPX_H', have_utmpx_header)
+ conf.set('HAVE_POSIX_GETPWNAM_R', have_posix_getpwnam_r)
+ conf.set('UTMP', utmp_struct)
+ conf.set('HAVE_GETUTXENT', cc.has_function('getutxent'))
+ conf.set('HAVE_UPDWTMP', cc.has_function('updwtmp'))
+ conf.set('HAVE_UPDWTMPX', cc.has_function('updwtmpx'))
+ conf.set('HAVE_LOGIN', cc.has_function('login', args: '-lutil'))
+ conf.set('HAVE_LOGOUT', cc.has_function('logout', args: '-lutil'))
+ conf.set('HAVE_LOGWTMP', cc.has_function('logwtmp', args: '-lutil'))
+ conf.set('HAVE_PAM_SYSLOG', have_pam_syslog)
+ conf.set('HAVE_KEYUTILS', keyutils_dep.found())
+ conf.set('SUPPORTS_PAM_EXTENSIONS', pam_extensions_supported)
+ conf.set('HAVE_SELINUX', libselinux_dep.found())
+ conf.set('HAVE_XSERVER_WITH_LISTEN', xserver_has_listen)
+ conf.set('ENABLE_USER_DISPLAY_SERVER', get_option('user-display-server'))
+ conf.set('ENABLE_SYSTEMD_JOURNAL', get_option('systemd-journal'))
+ conf.set('ENABLE_WAYLAND_SUPPORT', get_option('wayland-support'))
+ conf.set('ENABLE_PROFILING', get_option('profiling'))
+ conf.set('GDM_INITIAL_VT', get_option('initial-vt'))
+ conf.set_quoted('GDM_DEFAULTS_CONF', gdm_defaults_conf)
+ conf.set_quoted('GDM_CUSTOM_CONF', gdm_custom_conf)
+ conf.set_quoted('GDM_RUNTIME_CONF', gdm_runtime_conf)
+ conf.set_quoted('GDM_SESSION_DEFAULT_PATH', get_option('default-path'))
+ conf.set_quoted('GDM_USERNAME', get_option('user'))
+ conf.set_quoted('GDM_GROUPNAME', get_option('group'))
+ conf.set('HAVE_LIBXDMCP', xdmcp_dep.found())
+ conf.set_quoted('SYSTEMD_X_SERVER', systemd_x_server)
+ conf.set('WITH_PLYMOUTH', plymouth_dep.found())
+ conf.set_quoted('X_SERVER', x_bin)
+ conf.set_quoted('X_PATH', x_path)
++conf.set('HAVE_UDEV', gudev_dep.found())
+ conf.set('HAVE_UT_UT_HOST', utmp_has_host_field)
+ conf.set('HAVE_UT_UT_PID', utmp_has_pid_field)
+ conf.set('HAVE_UT_UT_ID', utmp_has_id_field)
+ conf.set('HAVE_UT_UT_NAME', utmp_has_name_field)
+ conf.set('HAVE_UT_UT_TYPE', utmp_has_type_field)
+ conf.set('HAVE_UT_UT_EXIT_E_TERMINATION', utmp_has_exit_e_termination_field)
+ conf.set('HAVE_UT_UT_USER', utmp_has_user_field)
+ conf.set('HAVE_UT_UT_TIME', utmp_has_time_field)
+ conf.set('HAVE_UT_UT_TV', utmp_has_tv_field)
+ conf.set('HAVE_UT_UT_SYSLEN', utmp_has_syslen_field)
+ conf.set('ENABLE_IPV6', get_option('ipv6'))
+ configure_file(output: 'config.h', configuration: conf)
+
+ # Subdirs
+ subdir('data')
+ subdir('common')
+ if pam_extensions_supported
+ subdir('pam-extensions')
+ endif
+ subdir('daemon')
+ subdir('libgdm')
+ subdir('utils')
+ subdir('pam_gdm')
+ subdir('po')
+ if libcheck_dep.found()
+ subdir('tests')
+ endif
+ if xdmcp_dep.found()
+ subdir('chooser')
+ endif
+--
+2.40.0
+
diff --git a/0001-manager-Fix-btmp-record-accounting.patch b/0001-manager-Fix-btmp-record-accounting.patch
new file mode 100644
index 0000000..411c374
--- /dev/null
+++ b/0001-manager-Fix-btmp-record-accounting.patch
@@ -0,0 +1,227 @@
+From d9dd381a574a02b239438db4fcc9d6ac2fd82ee0 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Wed, 19 Oct 2022 14:50:33 -0400
+Subject: [PATCH] manager: Fix btmp record accounting
+
+Before a user logs in they don't have a display.
+
+btmp records currently need a display though, and they
+get written when the user can't log in.
+
+Furthermore, the display from X11 point of view is
+somewhat archaic. We use wayland by default now.
+
+In lieu of a display, this commit gives the btmp record
+the seat id instead.
+---
+ daemon/gdm-manager.c | 11 +++++++++--
+ daemon/gdm-session-record.c | 8 ++++++--
+ 2 files changed, 15 insertions(+), 4 deletions(-)
+
+diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
+index cc61efc9..e1bc62d7 100644
+--- a/daemon/gdm-manager.c
++++ b/daemon/gdm-manager.c
+@@ -628,113 +628,120 @@ switch_to_compatible_user_session (GdmManager *manager,
+
+ ret = TRUE;
+
+ out:
+ return ret;
+ }
+
+ static GdmDisplay *
+ get_display_for_user_session (GdmSession *session)
+ {
+ return g_object_get_data (G_OBJECT (session), "gdm-display");
+ }
+
+ static GdmSession *
+ get_user_session_for_display (GdmDisplay *display)
+ {
+ if (display == NULL) {
+ return NULL;
+ }
+
+ return g_object_get_data (G_OBJECT (display), "gdm-user-session");
+ }
+
+ static gboolean
+ add_session_record (GdmManager *manager,
+ GdmSession *session,
+ GPid pid,
+ SessionRecord record)
+ {
+ const char *username;
+- char *display_name, *hostname, *display_device;
++ char *display_name, *hostname, *display_device, *display_seat_id;
+ gboolean recorded = FALSE;
+
+ display_name = NULL;
+ username = NULL;
+ hostname = NULL;
+ display_device = NULL;
++ display_seat_id = NULL;
+
+ username = gdm_session_get_username (session);
+
+ if (username == NULL) {
+ goto out;
+ }
+
+ g_object_get (G_OBJECT (session),
+ "display-name", &display_name,
+ "display-hostname", &hostname,
+ "display-device", &display_device,
++ "display-seat-id", &display_seat_id,
+ NULL);
+
+ if (display_name == NULL && display_device == NULL) {
+- goto out;
++ if (display_seat_id == NULL)
++ goto out;
++
++ display_name = g_strdup ("login screen");
++ display_device = g_strdup (display_seat_id);
+ }
+
+ switch (record) {
+ case SESSION_RECORD_LOGIN:
+ gdm_session_record_login (pid,
+ username,
+ hostname,
+ display_name,
+ display_device);
+ break;
+ case SESSION_RECORD_LOGOUT:
+ gdm_session_record_logout (pid,
+ username,
+ hostname,
+ display_name,
+ display_device);
+ break;
+ case SESSION_RECORD_FAILED:
+ gdm_session_record_failed (pid,
+ username,
+ hostname,
+ display_name,
+ display_device);
+ break;
+ }
+
+ recorded = TRUE;
+ out:
+ g_free (display_name);
+ g_free (hostname);
+ g_free (display_device);
++ g_free (display_seat_id);
+
+ return recorded;
+ }
+
+ static GdmSession *
+ find_user_session_for_display (GdmManager *self,
+ GdmDisplay *display)
+ {
+
+ GList *node = self->priv->user_sessions;
+
+ while (node != NULL) {
+ GdmSession *session = node->data;
+ GdmDisplay *candidate_display;
+ GList *next_node = node->next;
+
+ candidate_display = get_display_for_user_session (session);
+
+ if (candidate_display == display)
+ return session;
+
+ node = next_node;
+ }
+
+ return NULL;
+ }
+
+ static gboolean
+ gdm_manager_handle_register_display (GdmDBusManager *manager,
+ GDBusMethodInvocation *invocation,
+diff --git a/daemon/gdm-session-record.c b/daemon/gdm-session-record.c
+index 7719d0a8..310323b6 100644
+--- a/daemon/gdm-session-record.c
++++ b/daemon/gdm-session-record.c
+@@ -125,66 +125,70 @@ record_set_host (UTMP *u,
+ */
+ if (host_name != NULL
+ && x11_display_name != NULL
+ && g_str_has_prefix (x11_display_name, ":")) {
+ hostname = g_strdup_printf ("%s%s", host_name, x11_display_name);
+ } else {
+ hostname = g_strdup (x11_display_name);
+ }
+
+ if (hostname != NULL) {
+ memccpy (u->ut_host, hostname, '\0', sizeof (u->ut_host));
+ g_debug ("using ut_host %.*s", (int) sizeof (u->ut_host), u->ut_host);
+ #ifdef HAVE_UT_UT_SYSLEN
+ u->ut_syslen = MIN (strlen (hostname), sizeof (u->ut_host));
+ #endif
+ g_free (hostname);
+ }
+ #endif
+ }
+
+ static void
+ record_set_line (UTMP *u,
+ const char *display_device,
+ const char *x11_display_name)
+ {
+ /*
+ * Set ut_line to the device name associated with this display
+ * but remove the "/dev/" prefix. If no device, then use the
+ * $DISPLAY value.
+ */
+- if (display_device != NULL
+- && g_str_has_prefix (display_device, "/dev/")) {
++ if (display_device != NULL && g_str_has_prefix (display_device, "/dev/")) {
+ memccpy (u->ut_line,
+ display_device + strlen ("/dev/"),
+ '\0',
+ sizeof (u->ut_line));
++ } else if (display_device != NULL && g_str_has_prefix (display_device, "seat")) {
++ memccpy (u->ut_line,
++ display_device,
++ '\0',
++ sizeof (u->ut_line));
+ } else if (x11_display_name != NULL) {
+ memccpy (u->ut_line,
+ x11_display_name,
+ '\0',
+ sizeof (u->ut_line));
+ }
+
+ g_debug ("using ut_line %.*s", (int) sizeof (u->ut_line), u->ut_line);
+ }
+
+ void
+ gdm_session_record_login (GPid session_pid,
+ const char *user_name,
+ const char *host_name,
+ const char *x11_display_name,
+ const char *display_device)
+ {
+ UTMP session_record = { 0 };
+
+ if (x11_display_name == NULL)
+ x11_display_name = display_device;
+
+ record_set_username (&session_record, user_name);
+
+ g_debug ("Writing login record");
+
+ #if defined(HAVE_UT_UT_TYPE)
+ session_record.ut_type = USER_PROCESS;
+ g_debug ("using ut_type USER_PROCESS");
+ #endif
+--
+2.37.3
+
diff --git a/0001-manager-allow-multiple-xdmcp-logins-for-the-same-use.patch b/0001-manager-allow-multiple-xdmcp-logins-for-the-same-use.patch
new file mode 100644
index 0000000..f514073
--- /dev/null
+++ b/0001-manager-allow-multiple-xdmcp-logins-for-the-same-use.patch
@@ -0,0 +1,344 @@
+From 58f2bb3560f1066d0cda93a749a6d1648e3c3d0c Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Thu, 20 Dec 2018 14:51:38 -0500
+Subject: [PATCH 1/3] manager: allow multiple xdmcp logins for the same user
+
+---
+ common/gdm-settings-keys.h | 1 +
+ daemon/gdm-manager.c | 71 ++++++++++++++++++++++++++++----------
+ data/gdm.schemas.in | 5 +++
+ 3 files changed, 59 insertions(+), 18 deletions(-)
+
+diff --git a/common/gdm-settings-keys.h b/common/gdm-settings-keys.h
+index 87685d3c..4b3a1ffe 100644
+--- a/common/gdm-settings-keys.h
++++ b/common/gdm-settings-keys.h
+@@ -30,37 +30,38 @@ G_BEGIN_DECLS
+ #define GDM_KEY_AUTO_LOGIN_ENABLE "daemon/AutomaticLoginEnable"
+ #define GDM_KEY_AUTO_LOGIN_USER "daemon/AutomaticLogin"
+ #define GDM_KEY_TIMED_LOGIN_ENABLE "daemon/TimedLoginEnable"
+ #define GDM_KEY_TIMED_LOGIN_USER "daemon/TimedLogin"
+ #define GDM_KEY_TIMED_LOGIN_DELAY "daemon/TimedLoginDelay"
+ #define GDM_KEY_INITIAL_SETUP_ENABLE "daemon/InitialSetupEnable"
+ #define GDM_KEY_PREFERRED_DISPLAY_SERVER "daemon/PreferredDisplayServer"
+ #define GDM_KEY_WAYLAND_ENABLE "daemon/WaylandEnable"
+ #define GDM_KEY_XORG_ENABLE "daemon/XorgEnable"
+
+ #define GDM_KEY_DEBUG "debug/Enable"
+
+ #define GDM_KEY_INCLUDE "greeter/Include"
+ #define GDM_KEY_EXCLUDE "greeter/Exclude"
+ #define GDM_KEY_INCLUDE_ALL "greeter/IncludeAll"
+
+ #define GDM_KEY_DISALLOW_TCP "security/DisallowTCP"
+ #define GDM_KEY_ALLOW_REMOTE_AUTOLOGIN "security/AllowRemoteAutoLogin"
+
+ #define GDM_KEY_XDMCP_ENABLE "xdmcp/Enable"
+ #define GDM_KEY_SHOW_LOCAL_GREETER "xdmcp/ShowLocalGreeter"
+ #define GDM_KEY_MAX_PENDING "xdmcp/MaxPending"
+ #define GDM_KEY_MAX_SESSIONS "xdmcp/MaxSessions"
+ #define GDM_KEY_MAX_WAIT "xdmcp/MaxWait"
+ #define GDM_KEY_DISPLAYS_PER_HOST "xdmcp/DisplaysPerHost"
+ #define GDM_KEY_UDP_PORT "xdmcp/Port"
+ #define GDM_KEY_INDIRECT "xdmcp/HonorIndirect"
+ #define GDM_KEY_MAX_WAIT_INDIRECT "xdmcp/MaxWaitIndirect"
+ #define GDM_KEY_PING_INTERVAL "xdmcp/PingIntervalSeconds"
+ #define GDM_KEY_WILLING "xdmcp/Willing"
++#define GDM_KEY_ALLOW_MULTIPLE_SESSIONS_PER_USER "xdmcp/AllowMultipleSessionsPerUser"
+
+ #define GDM_KEY_MULTICAST "chooser/Multicast"
+ #define GDM_KEY_MULTICAST_ADDR "chooser/MulticastAddr"
+
+ G_END_DECLS
+
+ #endif /* _GDM_SETTINGS_KEYS_H */
+diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
+index e1bc62d7..08c3cc17 100644
+--- a/daemon/gdm-manager.c
++++ b/daemon/gdm-manager.c
+@@ -566,93 +566,106 @@ get_display_and_details_for_bus_sender (GdmManager *self,
+ *out_tty = get_tty_for_session_id (session_id, &error);
+
+ if (error != NULL) {
+ g_debug ("GdmManager: Error while retrieving tty for session: %s",
+ error->message);
+ g_clear_error (&error);
+ }
+ }
+
+ display = gdm_display_store_find (self->priv->display_store,
+ lookup_by_session_id,
+ (gpointer) session_id);
+
+ out:
+ if (out_display != NULL) {
+ *out_display = display;
+ }
+
+ g_free (session_id);
+ }
+
+ static gboolean
+ switch_to_compatible_user_session (GdmManager *manager,
+ GdmSession *session,
+ gboolean fail_if_already_switched)
+ {
+ gboolean res;
+ gboolean ret;
+ const char *username;
+ const char *seat_id;
+- const char *ssid_to_activate;
++ const char *ssid_to_activate = NULL;
+ GdmSession *existing_session;
+
+ ret = FALSE;
+
+ username = gdm_session_get_username (session);
+ seat_id = gdm_session_get_display_seat_id (session);
+
+- if (!fail_if_already_switched) {
+- session = NULL;
+- }
++ if (!fail_if_already_switched)
++ ssid_to_activate = gdm_session_get_session_id (session);
+
+- existing_session = find_session_for_user_on_seat (manager, username, seat_id, session);
++ if (ssid_to_activate == NULL) {
++ if (!seat_id || !sd_seat_can_multi_session (seat_id)) {
++ g_debug ("GdmManager: unable to activate existing sessions from login screen unless on seat0");
++ goto out;
++ }
+
+- if (existing_session != NULL) {
+- ssid_to_activate = gdm_session_get_session_id (existing_session);
+- if (seat_id != NULL) {
+- res = gdm_activate_session_by_id (manager->priv->connection, seat_id, ssid_to_activate);
+- if (! res) {
+- g_debug ("GdmManager: unable to activate session: %s", ssid_to_activate);
+- goto out;
+- }
++ if (!fail_if_already_switched) {
++ session = NULL;
+ }
+
+- res = session_unlock (manager, ssid_to_activate);
+- if (!res) {
+- /* this isn't fatal */
+- g_debug ("GdmManager: unable to unlock session: %s", ssid_to_activate);
++ existing_session = find_session_for_user_on_seat (manager, username, seat_id, session);
++
++ if (existing_session != NULL) {
++ ssid_to_activate = gdm_session_get_session_id (existing_session);
+ }
+- } else {
++ }
++
++ if (ssid_to_activate == NULL) {
+ goto out;
+ }
+
++ if (seat_id != NULL) {
++ res = gdm_activate_session_by_id (manager->priv->connection, seat_id, ssid_to_activate);
++ if (! res) {
++ g_debug ("GdmManager: unable to activate session: %s", ssid_to_activate);
++ goto out;
++ }
++ }
++
++ res = session_unlock (manager, ssid_to_activate);
++ if (!res) {
++ /* this isn't fatal */
++ g_debug ("GdmManager: unable to unlock session: %s", ssid_to_activate);
++ }
++
+ ret = TRUE;
+
+ out:
+ return ret;
+ }
+
+ static GdmDisplay *
+ get_display_for_user_session (GdmSession *session)
+ {
+ return g_object_get_data (G_OBJECT (session), "gdm-display");
+ }
+
+ static GdmSession *
+ get_user_session_for_display (GdmDisplay *display)
+ {
+ if (display == NULL) {
+ return NULL;
+ }
+
+ return g_object_get_data (G_OBJECT (display), "gdm-user-session");
+ }
+
+ static gboolean
+ add_session_record (GdmManager *manager,
+ GdmSession *session,
+ GPid pid,
+ SessionRecord record)
+ {
+ const char *username;
+ char *display_name, *hostname, *display_device, *display_seat_id;
+@@ -1096,92 +1109,114 @@ open_temporary_reauthentication_channel (GdmManager *self,
+ g_signal_connect (session,
+ "client-disconnected",
+ G_CALLBACK (on_reauthentication_client_disconnected),
+ self);
+ g_signal_connect (session,
+ "client-rejected",
+ G_CALLBACK (on_reauthentication_client_rejected),
+ self);
+ g_signal_connect (session,
+ "cancelled",
+ G_CALLBACK (on_reauthentication_cancelled),
+ self);
+ g_signal_connect (session,
+ "conversation-started",
+ G_CALLBACK (on_reauthentication_conversation_started),
+ self);
+ g_signal_connect (session,
+ "conversation-stopped",
+ G_CALLBACK (on_reauthentication_conversation_stopped),
+ self);
+ g_signal_connect (session,
+ "verification-complete",
+ G_CALLBACK (on_reauthentication_verification_complete),
+ self);
+
+ address = gdm_session_get_server_address (session);
+
+ return g_strdup (address);
+ }
+
++static gboolean
++remote_users_can_log_in_more_than_once (GdmManager *manager)
++{
++ gboolean enabled;
++
++ enabled = FALSE;
++
++ gdm_settings_direct_get_boolean (GDM_KEY_ALLOW_MULTIPLE_SESSIONS_PER_USER, &enabled);
++
++ g_debug ("GdmDisplay: Remote users allowed to log in more than once: %s", enabled? "yes" : "no");
++
++ return enabled;
++}
++
+ static gboolean
+ gdm_manager_handle_open_reauthentication_channel (GdmDBusManager *manager,
+ GDBusMethodInvocation *invocation,
+ const char *username)
+ {
+ GdmManager *self = GDM_MANAGER (manager);
+ const char *sender;
+ GdmDisplay *display = NULL;
+ GdmSession *session;
+ GDBusConnection *connection;
+ char *seat_id = NULL;
+ char *session_id = NULL;
+ GPid pid = 0;
+ uid_t uid = (uid_t) -1;
+ gboolean is_login_screen = FALSE;
+ gboolean is_remote = FALSE;
+
+ g_debug ("GdmManager: trying to open reauthentication channel for user %s", username);
+
+ sender = g_dbus_method_invocation_get_sender (invocation);
+ connection = g_dbus_method_invocation_get_connection (invocation);
+ get_display_and_details_for_bus_sender (self, connection, sender, &display, &seat_id, &session_id, NULL, &pid, &uid, &is_login_screen, &is_remote);
+
+ if (session_id == NULL || pid == 0 || uid == (uid_t) -1) {
+ g_dbus_method_invocation_return_error_literal (invocation,
+ G_DBUS_ERROR,
+ G_DBUS_ERROR_ACCESS_DENIED,
+ _("No session available"));
+
+ return TRUE;
+ }
+
++ if (is_login_screen && is_remote && remote_users_can_log_in_more_than_once (self)) {
++ g_dbus_method_invocation_return_error_literal (invocation,
++ G_DBUS_ERROR,
++ G_DBUS_ERROR_ACCESS_DENIED,
++ "Login screen creates new sessions for remote connections");
++ return TRUE;
++ }
++
+ if (is_login_screen) {
+ g_debug ("GdmManager: looking for login screen session for user %s on seat %s", username, seat_id);
+ session = find_session_for_user_on_seat (self,
+ username,
+ seat_id,
+ NULL);
+ } else {
+ g_debug ("GdmManager: looking for user session on display");
+ session = get_user_session_for_display (display);
+ }
+
+ if (session != NULL && gdm_session_is_running (session)) {
+ gdm_session_start_reauthentication (session, pid, uid);
+ g_hash_table_insert (self->priv->open_reauthentication_requests,
+ GINT_TO_POINTER (pid),
+ invocation);
+ } else if (is_login_screen) {
+ g_dbus_method_invocation_return_error_literal (invocation,
+ G_DBUS_ERROR,
+ G_DBUS_ERROR_ACCESS_DENIED,
+ "Login screen only allowed to open reauthentication channels for running sessions");
+ return TRUE;
+ } else {
+ char *address;
+ address = open_temporary_reauthentication_channel (self,
+ seat_id,
+ session_id,
+ pid,
+ uid,
+ is_remote);
+diff --git a/data/gdm.schemas.in b/data/gdm.schemas.in
+index a1035f95..929d13d9 100644
+--- a/data/gdm.schemas.in
++++ b/data/gdm.schemas.in
+@@ -112,33 +112,38 @@
+ <schema>
+ <key>xdmcp/DisplaysPerHost</key>
+ <signature>i</signature>
+ <default>1</default>
+ </schema>
+ <schema>
+ <key>xdmcp/Port</key>
+ <signature>i</signature>
+ <default>177</default>
+ </schema>
+ <schema>
+ <key>xdmcp/HonorIndirect</key>
+ <signature>b</signature>
+ <default>true</default>
+ </schema>
+ <schema>
+ <key>xdmcp/MaxWaitIndirect</key>
+ <signature>i</signature>
+ <default>30</default>
+ </schema>
+ <schema>
+ <key>xdmcp/PingIntervalSeconds</key>
+ <signature>i</signature>
+ <default>0</default>
+ </schema>
+ <schema>
+ <key>xdmcp/Willing</key>
+ <signature>s</signature>
+ <default>@gdmconfdir@/Xwilling</default>
+ </schema>
++ <schema>
++ <key>xdmcp/AllowMultipleSessionsPerUser</key>
++ <signature>b</signature>
++ <default>false</default>
++ </schema>
+ </schemalist>
+ </gdmschemafile>
+
+--
+2.37.3
+
diff --git a/0001-meson-Fix-detection-of-Xorg-versions-that-need-liste.patch b/0001-meson-Fix-detection-of-Xorg-versions-that-need-liste.patch
new file mode 100644
index 0000000..0b6b1ec
--- /dev/null
+++ b/0001-meson-Fix-detection-of-Xorg-versions-that-need-liste.patch
@@ -0,0 +1,144 @@
+From b8caa1a18f284cc9b59a2e0273780a51b6fd7528 Mon Sep 17 00:00:00 2001
+From: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date: Thu, 7 Oct 2021 18:22:11 -0700
+Subject: [PATCH 1/2] meson: Fix detection of Xorg versions that need -listen
+ tcp
+
+Closes #704
+---
+ meson.build | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/meson.build b/meson.build
+index 64b98628..52ac1941 100644
+--- a/meson.build
++++ b/meson.build
+@@ -42,60 +42,63 @@ udev_dep = dependency('udev')
+ glib_min_version = '2.56.0'
+
+ glib_dep = dependency('glib-2.0', version: '>=' + glib_min_version)
+ gobject_dep = dependency('gobject-2.0', version: '>=' + glib_min_version)
+ gio_dep = dependency('gio-2.0', version: '>=' + glib_min_version)
+ gio_unix_dep = dependency('gio-unix-2.0', version: '>=' + glib_min_version)
+ gtk_dep = dependency('gtk+-3.0', version: '>= 2.91.1')
+ libcanberra_gtk_dep = dependency('libcanberra-gtk3', version: '>= 0.4')
+ accountsservice_dep = dependency('accountsservice', version: '>= 0.6.35')
+ xcb_dep = dependency('xcb')
+ keyutils_dep = dependency('libkeyutils', required: false)
+ libselinux_dep = dependency('libselinux', required: get_option('selinux'))
+
+ # udev
+ if udev_dir == ''
+ if udev_dep.found()
+ udev_prefix = udev_dep.get_pkgconfig_variable('udevdir')
+ else
+ udev_prefix = gdm_prefix / 'lib' / 'udev'
+ endif
+ udev_dir = udev_prefix / 'rules.d'
+ endif
+
+ # X11
+ x_deps = declare_dependency(
+ dependencies: [
+ dependency('x11'),
+ dependency('xau'),
+ ],
+ )
++# Xserver 1.17 & later default to -nolisten and require -listen for remote access
++xserver_deps = dependency('xorg-server', version : '>=1.17', required : false)
++xserver_nolisten_default = xserver_deps.found()
+ find_x_server_script = find_program('build-aux/find-x-server.sh', native: true)
+ find_x_server_out = run_command(find_x_server_script).stdout().strip()
+ if find_x_server_out != ''
+ x_bin = find_x_server_out
+ x_bin_path_split = x_bin.split('/')
+ i = 0
+ x_path = '/'
+ foreach dir : x_bin_path_split
+ if i < x_bin_path_split.length() - 1
+ x_path = x_path / dir
+ endif
+ i = i + 1
+ endforeach
+ else
+ # what to do, what to do, this is wrong, but this just sets the
+ # defaults, perhaps this user is cross compiling or some such
+ x_path = '/usr/bin/X11:/usr/X11R6/bin:/opt/X11R6/bin'
+ x_bin = '/usr/bin/X'
+ endif
+ xdmcp_dep = cc.find_library('Xdmcp', required: get_option('xdmcp'))
+ if xdmcp_dep.found() and get_option('tcp-wrappers')
+ libwrap_dep = cc.find_library('wrap')
+ endif
+ # systemd
+ systemd_dep = dependency('systemd')
+ libsystemd_dep = dependency('libsystemd')
+ if meson.version().version_compare('>= 0.53')
+ systemd_multiseat_x = find_program('systemd-multi-seat-x',
+ required: false,
+ dirs: [
+@@ -197,60 +200,61 @@ conf.set_quoted('SYSCONFDIR', gdm_prefix / get_option('sysconfdir'))
+ conf.set_quoted('BINDIR', gdm_prefix / get_option('bindir'))
+ conf.set_quoted('LIBDIR', gdm_prefix / get_option('libdir'))
+ conf.set_quoted('LIBEXECDIR', gdm_prefix / get_option('libexecdir'))
+ conf.set_quoted('LOGDIR', get_option('log-dir'))
+ conf.set_quoted('DMCONFDIR', dmconfdir)
+ conf.set_quoted('GDMCONFDIR', gdmconfdir)
+ conf.set_quoted('GDM_SCREENSHOT_DIR', gdm_screenshot_dir)
+ conf.set_quoted('GDM_XAUTH_DIR', gdm_xauth_dir)
+ conf.set_quoted('GDM_RAN_ONCE_MARKER_DIR', ran_once_marker_dir)
+ conf.set_quoted('GDM_RUN_DIR', gdm_run_dir)
+ conf.set_quoted('GNOMELOCALEDIR', gdm_prefix / get_option('localedir'))
+ conf.set_quoted('AT_SPI_REGISTRYD_DIR', at_spi_registryd_dir)
+ conf.set_quoted('GDM_PID_FILE', gdm_pid_file)
+ conf.set_quoted('GNOME_SETTINGS_DAEMON_DIR', gnome_settings_daemon_dir)
+ conf.set_quoted('LANG_CONFIG_FILE', lang_config_file)
+ conf.set('HAVE_ADT', have_adt)
+ conf.set('HAVE_UTMP_H', have_utmp_header)
+ conf.set('HAVE_UTMPX_H', have_utmpx_header)
+ conf.set('HAVE_POSIX_GETPWNAM_R', have_posix_getpwnam_r)
+ conf.set('UTMP', utmp_struct)
+ conf.set('HAVE_GETUTXENT', cc.has_function('getutxent'))
+ conf.set('HAVE_UPDWTMP', cc.has_function('updwtmp'))
+ conf.set('HAVE_UPDWTMPX', cc.has_function('updwtmpx'))
+ conf.set('HAVE_LOGIN', cc.has_function('login', args: '-lutil'))
+ conf.set('HAVE_LOGOUT', cc.has_function('logout', args: '-lutil'))
+ conf.set('HAVE_LOGWTMP', cc.has_function('logwtmp', args: '-lutil'))
+ conf.set('HAVE_PAM_SYSLOG', have_pam_syslog)
+ conf.set('HAVE_KEYUTILS', keyutils_dep.found())
+ conf.set('SUPPORTS_PAM_EXTENSIONS', pam_extensions_supported)
+ conf.set('HAVE_SELINUX', libselinux_dep.found())
++conf.set('HAVE_XSERVER_THAT_DEFAULTS_TO_LOCAL_ONLY', xserver_nolisten_default)
+ conf.set('ENABLE_USER_DISPLAY_SERVER', get_option('user-display-server'))
+ conf.set('ENABLE_SYSTEMD_JOURNAL', get_option('systemd-journal'))
+ conf.set('ENABLE_WAYLAND_SUPPORT', get_option('wayland-support'))
+ conf.set('ENABLE_PROFILING', get_option('profiling'))
+ conf.set('GDM_INITIAL_VT', get_option('initial-vt'))
+ conf.set_quoted('GDM_DEFAULTS_CONF', gdm_defaults_conf)
+ conf.set_quoted('GDM_CUSTOM_CONF', gdm_custom_conf)
+ conf.set_quoted('GDM_RUNTIME_CONF', gdm_runtime_conf)
+ conf.set_quoted('GDM_SESSION_DEFAULT_PATH', get_option('default-path'))
+ conf.set_quoted('GDM_USERNAME', get_option('user'))
+ conf.set_quoted('GDM_GROUPNAME', get_option('group'))
+ conf.set('HAVE_LIBXDMCP', xdmcp_dep.found())
+ conf.set_quoted('SYSTEMD_X_SERVER', systemd_x_server)
+ conf.set('WITH_PLYMOUTH', plymouth_dep.found())
+ conf.set_quoted('X_SERVER', x_bin)
+ conf.set_quoted('X_PATH', x_path)
+ conf.set('HAVE_UT_UT_HOST', utmp_has_host_field)
+ conf.set('HAVE_UT_UT_PID', utmp_has_pid_field)
+ conf.set('HAVE_UT_UT_ID', utmp_has_id_field)
+ conf.set('HAVE_UT_UT_NAME', utmp_has_name_field)
+ conf.set('HAVE_UT_UT_TYPE', utmp_has_type_field)
+ conf.set('HAVE_UT_UT_EXIT_E_TERMINATION', utmp_has_exit_e_termination_field)
+ conf.set('HAVE_UT_UT_USER', utmp_has_user_field)
+ conf.set('HAVE_UT_UT_TIME', utmp_has_time_field)
+ conf.set('HAVE_UT_UT_TV', utmp_has_tv_field)
+ conf.set('HAVE_UT_UT_SYSLEN', utmp_has_syslen_field)
+ conf.set('ENABLE_IPV6', get_option('ipv6'))
+ configure_file(output: 'config.h', configuration: conf)
+
+ # Subdirs
+--
+2.34.1
+
diff --git a/0001-session-settings-Explicitly-cache-remote-users.patch b/0001-session-settings-Explicitly-cache-remote-users.patch
new file mode 100644
index 0000000..b5da396
--- /dev/null
+++ b/0001-session-settings-Explicitly-cache-remote-users.patch
@@ -0,0 +1,45 @@
+From cf4664891ede9648d096569900e8b95abd91a633 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Thu, 7 Apr 2022 12:44:10 -0400
+Subject: [PATCH] session-settings: Explicitly cache remote users
+
+Right now a user's cache file won't get written out if they are logging
+in with entirely default settings.
+
+This means remote users have to type in their usernames manually until
+they change their session.
+
+This commit explicitly caches remote users.
+
+Closes: https://gitlab.gnome.org/GNOME/gdm/-/issues/743
+---
+ daemon/gdm-session-settings.c | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+diff --git a/daemon/gdm-session-settings.c b/daemon/gdm-session-settings.c
+index 5b64cb65b..ef5d72e7f 100644
+--- a/daemon/gdm-session-settings.c
++++ b/daemon/gdm-session-settings.c
+@@ -406,6 +406,19 @@ gdm_session_settings_save (GdmSessionSettings *settings,
+ if (settings->priv->language_name != NULL) {
+ act_user_set_language (user, settings->priv->language_name);
+ }
++
++ if (!act_user_is_local_account (user)) {
++ g_autoptr (GError) error = NULL;
++
++ act_user_manager_cache_user (settings->priv->user_manager, username, &error);
++
++ if (error != NULL) {
++ g_debug ("GdmSessionSettings: Could not locally cache remote user: %s", error->message);
++ g_object_unref (user);
++ return FALSE;
++ }
++
++ }
+ g_object_unref (user);
+
+ return TRUE;
+--
+GitLab
+
diff --git a/0001-session-settings-Fetch-session-from-user-even-if-use.patch b/0001-session-settings-Fetch-session-from-user-even-if-use.patch
new file mode 100644
index 0000000..109ec15
--- /dev/null
+++ b/0001-session-settings-Fetch-session-from-user-even-if-use.patch
@@ -0,0 +1,89 @@
+From 8a29f79124f38e2106b263bacb6b5ab4cdb255d0 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Wed, 9 Mar 2022 10:46:21 -0500
+Subject: [PATCH] session-settings: Fetch session from user even if user isn't
+ cached
+
+Now that accountsservice supports session templates, GDM can't assume
+that no-cache file means, there's nothing worth reading.
+
+Unfortunately, GDM does exactly that. It bypasses fetching the users
+session if it doesn't think the user has one.
+
+This commit removes that no-longer-correct optimization.
+---
+ daemon/gdm-session-settings.c | 4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/daemon/gdm-session-settings.c b/daemon/gdm-session-settings.c
+index 5b64cb65..fbf6897b 100644
+--- a/daemon/gdm-session-settings.c
++++ b/daemon/gdm-session-settings.c
+@@ -270,64 +270,60 @@ gdm_session_settings_new (void)
+ GdmSessionSettings *settings;
+
+ settings = g_object_new (GDM_TYPE_SESSION_SETTINGS,
+ NULL);
+
+ return settings;
+ }
+
+ gboolean
+ gdm_session_settings_is_loaded (GdmSessionSettings *settings)
+ {
+ if (settings->priv->user == NULL) {
+ return FALSE;
+ }
+
+ return act_user_is_loaded (settings->priv->user);
+ }
+
+ static void
+ load_settings_from_user (GdmSessionSettings *settings)
+ {
+ const char *session_name;
+ const char *session_type;
+ const char *language_name;
+
+ if (!act_user_is_loaded (settings->priv->user)) {
+ g_warning ("GdmSessionSettings: trying to load user settings from unloaded user");
+ return;
+ }
+
+- /* if the user doesn't have saved state, they don't have any settings worth reading */
+- if (!act_user_get_saved (settings->priv->user))
+- goto out;
+-
+ session_type = act_user_get_session_type (settings->priv->user);
+ session_name = act_user_get_session (settings->priv->user);
+
+ g_debug ("GdmSessionSettings: saved session is %s (type %s)", session_name, session_type);
+
+ if (session_type != NULL && session_type[0] != '\0') {
+ gdm_session_settings_set_session_type (settings, session_type);
+ }
+
+ if (session_name != NULL && session_name[0] != '\0') {
+ gdm_session_settings_set_session_name (settings, session_name);
+ }
+
+ language_name = act_user_get_language (settings->priv->user);
+
+ g_debug ("GdmSessionSettings: saved language is %s", language_name);
+ if (language_name != NULL && language_name[0] != '\0') {
+ gdm_session_settings_set_language_name (settings, language_name);
+ }
+
+ out:
+ g_object_notify (G_OBJECT (settings), "is-loaded");
+ }
+
+ static void
+ on_user_is_loaded_changed (ActUser *user,
+ GParamSpec *pspec,
+ GdmSessionSettings *settings)
+ {
+ if (act_user_is_loaded (settings->priv->user)) {
+--
+2.34.1
+
diff --git a/0001-session-worker-Set-session_vt-0-out-of-pam-uninitial.patch b/0001-session-worker-Set-session_vt-0-out-of-pam-uninitial.patch
new file mode 100644
index 0000000..f69ae2b
--- /dev/null
+++ b/0001-session-worker-Set-session_vt-0-out-of-pam-uninitial.patch
@@ -0,0 +1,84 @@
+From 26705ee64f4d3628eaaf45db980c435fa26e112a Mon Sep 17 00:00:00 2001
+From: Chingkai Chu <3013329+chuchingkai@users.noreply.github.com>
+Date: Thu, 12 Aug 2021 10:34:01 +0800
+Subject: [PATCH] session-worker: Set session_vt=0 out of pam uninitialization
+
+MR GNOME/gdm!123 moved jump_to_vt and session_vt reseting to a
+separate function, so we don't need to reset session_vt in pam
+uninitialization.
+
+https://gitlab.gnome.org/GNOME/gdm/-/issues/719
+---
+ daemon/gdm-session-worker.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
+index 7d7d2496..3ad94e2a 100644
+--- a/daemon/gdm-session-worker.c
++++ b/daemon/gdm-session-worker.c
+@@ -1076,62 +1076,60 @@ gdm_session_worker_set_state (GdmSessionWorker *worker,
+
+ static void
+ gdm_session_worker_uninitialize_pam (GdmSessionWorker *worker,
+ int status)
+ {
+ g_debug ("GdmSessionWorker: uninitializing PAM");
+
+ if (worker->priv->pam_handle == NULL)
+ return;
+
+ gdm_session_worker_get_username (worker, NULL);
+
+ if (worker->priv->state >= GDM_SESSION_WORKER_STATE_SESSION_OPENED) {
+ pam_close_session (worker->priv->pam_handle, 0);
+ gdm_session_auditor_report_logout (worker->priv->auditor);
+ } else {
+ gdm_session_auditor_report_login_failure (worker->priv->auditor,
+ status,
+ pam_strerror (worker->priv->pam_handle, status));
+ }
+
+ if (worker->priv->state >= GDM_SESSION_WORKER_STATE_ACCREDITED) {
+ pam_setcred (worker->priv->pam_handle, PAM_DELETE_CRED);
+ }
+
+ pam_end (worker->priv->pam_handle, status);
+ worker->priv->pam_handle = NULL;
+
+ gdm_session_worker_stop_auditor (worker);
+
+- worker->priv->session_vt = 0;
+-
+ g_debug ("GdmSessionWorker: state NONE");
+ gdm_session_worker_set_state (worker, GDM_SESSION_WORKER_STATE_NONE);
+ }
+
+ static char *
+ _get_tty_for_pam (const char *x11_display_name,
+ const char *display_device)
+ {
+ #ifdef __sun
+ return g_strdup (display_device);
+ #else
+ return g_strdup (x11_display_name);
+ #endif
+ }
+
+ #ifdef PAM_XAUTHDATA
+ static struct pam_xauth_data *
+ _get_xauth_for_pam (const char *x11_authority_file)
+ {
+ FILE *fh;
+ Xauth *auth = NULL;
+ struct pam_xauth_data *retval = NULL;
+ gsize len = sizeof (*retval) + 1;
+
+ fh = fopen (x11_authority_file, "r");
+ if (fh) {
+ auth = XauReadAuth (fh);
+ fclose (fh);
+ }
+ if (auth) {
+--
+2.32.0
+
diff --git a/0001-xdmcp-display-factory-Set-supported-session-types-fo.patch b/0001-xdmcp-display-factory-Set-supported-session-types-fo.patch
new file mode 100644
index 0000000..f3eefe7
--- /dev/null
+++ b/0001-xdmcp-display-factory-Set-supported-session-types-fo.patch
@@ -0,0 +1,122 @@
+From 36b9fd4f6e055e236175979d9a1527df71aeac1f Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Tue, 14 Sep 2021 11:00:33 -0400
+Subject: [PATCH 1/5] xdmcp-display-factory: Set supported session types for
+ XDMCP displays
+
+The lower levels of GDM now expect the session types supported by a
+display to be specified up front.
+
+This commit makes sure XDMCP displays do that.
+---
+ daemon/gdm-xdmcp-display-factory.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/daemon/gdm-xdmcp-display-factory.c b/daemon/gdm-xdmcp-display-factory.c
+index ce8f026e..abb58fae 100644
+--- a/daemon/gdm-xdmcp-display-factory.c
++++ b/daemon/gdm-xdmcp-display-factory.c
+@@ -2104,94 +2104,100 @@ on_display_status_changed (GdmDisplay *display,
+ break;
+ case GDM_DISPLAY_MANAGED:
+ if (session != NULL) {
+ g_signal_connect_object (G_OBJECT (session),
+ "client-disconnected",
+ G_CALLBACK (on_client_disconnected),
+ display, G_CONNECT_SWAPPED);
+ g_signal_connect_object (G_OBJECT (session),
+ "disconnected",
+ G_CALLBACK (on_client_disconnected),
+ display, G_CONNECT_SWAPPED);
+ }
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ g_clear_object (&launch_environment);
+ }
+
+ static GdmDisplay *
+ gdm_xdmcp_display_create (GdmXdmcpDisplayFactory *factory,
+ const char *hostname,
+ GdmAddress *address,
+ int displaynum)
+ {
+ GdmDisplay *display;
+ GdmDisplayStore *store;
+ gboolean use_chooser;
++ const char *session_types[] = { "x11", NULL };
+
+ g_debug ("GdmXdmcpDisplayFactory: Creating xdmcp display for %s:%d",
+ hostname ? hostname : "(null)", displaynum);
+
+ use_chooser = FALSE;
+ if (factory->honor_indirect) {
+ IndirectClient *ic;
+
+ ic = indirect_client_lookup (factory, address);
+
+ /* This was an indirect thingie and nothing was yet chosen,
+ * use a chooser */
+ if (ic != NULL && ic->chosen_address == NULL) {
+ use_chooser = TRUE;
+ }
+ }
+
+ if (use_chooser) {
+ display = gdm_xdmcp_chooser_display_new (hostname,
+ displaynum,
+ address,
+ get_next_session_serial (factory));
+ g_signal_connect (display, "hostname-selected", G_CALLBACK (on_hostname_selected), factory);
+ } else {
+ display = gdm_xdmcp_display_new (hostname,
+ displaynum,
+ address,
+ get_next_session_serial (factory));
+ }
+
+ if (display == NULL) {
+ goto out;
+ }
+
++ g_object_set (G_OBJECT (display),
++ "session-type", session_types[0],
++ "supported-session-types", session_types,
++ NULL);
++
+ if (! gdm_display_prepare (display)) {
+ gdm_display_unmanage (display);
+ g_object_unref (display);
+ display = NULL;
+ goto out;
+ }
+
+ g_signal_connect_after (display,
+ "notify::status",
+ G_CALLBACK (on_display_status_changed),
+ factory);
+
+ store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
+ gdm_display_store_add (store, display);
+
+ factory->num_pending_sessions++;
+ out:
+
+ return display;
+ }
+
+ static void
+ gdm_xdmcp_send_accept (GdmXdmcpDisplayFactory *factory,
+ GdmAddress *address,
+ CARD32 session_id,
+ ARRAY8Ptr authentication_name,
+ ARRAY8Ptr authentication_data,
+ ARRAY8Ptr authorization_name,
+ ARRAY8Ptr authorization_data)
+ {
+--
+2.34.1
+
diff --git a/0002-common-Add-API-to-reload-settings-from-disk.patch b/0002-common-Add-API-to-reload-settings-from-disk.patch
new file mode 100644
index 0000000..b6696e6
--- /dev/null
+++ b/0002-common-Add-API-to-reload-settings-from-disk.patch
@@ -0,0 +1,356 @@
+From d3e073fa1cd314b344db1ec22f0add2702a6c299 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Tue, 15 Feb 2022 14:33:22 -0500
+Subject: [PATCH 2/4] common: Add API to reload settings from disk
+
+Ideally we would reread /run/gdm/custom.conf after we've decided
+graphics setup is complete. This is because the file may not
+get written out by udev until after GDM is already started and waiting.
+
+As a first step to get there, this commit adds an API for rereading
+the file, and changes the SIGHUP handler to use it (instead of
+the complete teardown and reinitialization it was doing before).
+---
+ common/gdm-settings-direct.c | 9 +++++++++
+ common/gdm-settings-direct.h | 2 ++
+ common/gdm-settings.c | 14 ++++++++++++--
+ common/gdm-settings.h | 1 +
+ daemon/main.c | 12 ++----------
+ 5 files changed, 26 insertions(+), 12 deletions(-)
+
+diff --git a/common/gdm-settings-direct.c b/common/gdm-settings-direct.c
+index ddb31908..5fbe0326 100644
+--- a/common/gdm-settings-direct.c
++++ b/common/gdm-settings-direct.c
+@@ -224,35 +224,44 @@ hashify_list (GdmSettingsEntry *entry,
+
+ gboolean
+ gdm_settings_direct_init (GdmSettings *settings,
+ const char *file,
+ const char *root)
+ {
+ GSList *list;
+
+ g_return_val_if_fail (file != NULL, FALSE);
+ g_return_val_if_fail (root != NULL, FALSE);
+
+ g_debug ("Settings Direct Init");
+ if (schemas != NULL) {
+ g_hash_table_unref (schemas);
+ schemas = NULL;
+ }
+
+ if (! gdm_settings_parse_schemas (file, root, &list)) {
+ g_warning ("Unable to parse schemas");
+ return FALSE;
+ }
+
+ schemas = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)gdm_settings_entry_free);
+ g_slist_foreach (list, (GFunc)hashify_list, NULL);
+
+ settings_object = settings;
+
+ return TRUE;
+ }
+
++void
++gdm_settings_direct_reload (void)
++{
++ if (!settings_object)
++ return;
++
++ gdm_settings_reload (settings_object);
++}
++
+ void
+ gdm_settings_direct_shutdown (void)
+ {
+
+ }
+diff --git a/common/gdm-settings-direct.h b/common/gdm-settings-direct.h
+index 156489cd..6754955f 100644
+--- a/common/gdm-settings-direct.h
++++ b/common/gdm-settings-direct.h
+@@ -3,48 +3,50 @@
+ * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+
+ #ifndef __GDM_SETTINGS_DIRECT_H
+ #define __GDM_SETTINGS_DIRECT_H
+
+ #include <glib-object.h>
+ #include "gdm-settings.h"
+
+ G_BEGIN_DECLS
+
+ gboolean gdm_settings_direct_init (GdmSettings *settings,
+ const char *schemas_file,
+ const char *root);
++
++void gdm_settings_direct_reload (void);
+ void gdm_settings_direct_shutdown (void);
+
+ gboolean gdm_settings_direct_get (const char *key,
+ GValue *value);
+ gboolean gdm_settings_direct_set (const char *key,
+ GValue *value);
+ gboolean gdm_settings_direct_get_int (const char *key,
+ int *value);
+ gboolean gdm_settings_direct_get_uint (const char *key,
+ uint *value);
+ gboolean gdm_settings_direct_get_boolean (const char *key,
+ gboolean *value);
+ gboolean gdm_settings_direct_get_string (const char *key,
+ char **value);
+
+ G_END_DECLS
+
+ #endif /* __GDM_SETTINGS_DIRECT_H */
+diff --git a/common/gdm-settings.c b/common/gdm-settings.c
+index e6f46ec3..96c2f8d3 100644
+--- a/common/gdm-settings.c
++++ b/common/gdm-settings.c
+@@ -157,84 +157,94 @@ gdm_settings_class_init (GdmSettingsClass *klass)
+ object_class->finalize = gdm_settings_finalize;
+
+ signals [VALUE_CHANGED] =
+ g_signal_new ("value-changed",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL,
+ NULL,
+ g_cclosure_marshal_generic,
+ G_TYPE_NONE,
+ 3,
+ G_TYPE_STRING,
+ G_TYPE_STRING,
+ G_TYPE_STRING);
+ }
+
+ static void
+ backend_value_changed (GdmSettingsBackend *backend,
+ const char *key,
+ const char *old_value,
+ const char *new_value,
+ GdmSettings *settings)
+ {
+ g_debug ("Emitting value-changed %s %s %s", key, old_value, new_value);
+
+ /* proxy it to internal listeners */
+ g_signal_emit (settings, signals [VALUE_CHANGED], 0, key, old_value, new_value);
+ }
+
+-static void
+-gdm_settings_init (GdmSettings *settings)
++void
++gdm_settings_reload (GdmSettings *settings)
+ {
+ GList *l;
+ GdmSettingsBackend *backend;
+
++ g_list_foreach (settings->backends, (GFunc) g_object_unref, NULL);
++ g_list_free (settings->backends);
++ settings->backends = NULL;
++
+ backend = gdm_settings_desktop_backend_new (GDM_CUSTOM_CONF);
+ if (backend)
+ settings->backends = g_list_prepend (NULL, backend);
+
+ backend = gdm_settings_desktop_backend_new (GDM_RUNTIME_CONF);
+ if (backend)
+ settings->backends = g_list_prepend (settings->backends, backend);
+
+ for (l = settings->backends; l; l = g_list_next (l)) {
+ backend = l->data;
+
+ g_signal_connect (backend,
+ "value-changed",
+ G_CALLBACK (backend_value_changed),
+ settings);
+ }
+ }
+
++static void
++gdm_settings_init (GdmSettings *settings)
++{
++ gdm_settings_reload (settings);
++}
++
+ static void
+ gdm_settings_finalize (GObject *object)
+ {
+ GdmSettings *settings;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (GDM_IS_SETTINGS (object));
+
+ settings = GDM_SETTINGS (object);
+
+ g_return_if_fail (settings != NULL);
+
+ g_list_foreach (settings->backends, (GFunc) g_object_unref, NULL);
+ g_list_free (settings->backends);
+ settings->backends = NULL;
+
+ settings_object = NULL;
+
+ G_OBJECT_CLASS (gdm_settings_parent_class)->finalize (object);
+ }
+
+ GdmSettings *
+ gdm_settings_new (void)
+ {
+ if (settings_object != NULL) {
+ g_object_ref (settings_object);
+ } else {
+ settings_object = g_object_new (GDM_TYPE_SETTINGS, NULL);
+ }
+
+diff --git a/common/gdm-settings.h b/common/gdm-settings.h
+index 786868a9..07b64785 100644
+--- a/common/gdm-settings.h
++++ b/common/gdm-settings.h
+@@ -13,45 +13,46 @@
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+
+ #ifndef __GDM_SETTINGS_H
+ #define __GDM_SETTINGS_H
+
+ #include <glib-object.h>
+
+ G_BEGIN_DECLS
+
+ #define GDM_TYPE_SETTINGS (gdm_settings_get_type ())
+ G_DECLARE_FINAL_TYPE (GdmSettings, gdm_settings, GDM, SETTINGS, GObject)
+
+ typedef enum
+ {
+ GDM_SETTINGS_ERROR_GENERAL,
+ GDM_SETTINGS_ERROR_KEY_NOT_FOUND
+ } GdmSettingsError;
+
+ #define GDM_SETTINGS_ERROR gdm_settings_error_quark ()
+
+ GQuark gdm_settings_error_quark (void);
+
+ GdmSettings * gdm_settings_new (void);
++void gdm_settings_reload (GdmSettings *settings);
+
+ /* exported */
+
+ gboolean gdm_settings_get_value (GdmSettings *settings,
+ const char *key,
+ char **value,
+ GError **error);
+ gboolean gdm_settings_set_value (GdmSettings *settings,
+ const char *key,
+ const char *value,
+ GError **error);
+
+ G_END_DECLS
+
+ #endif /* __GDM_SETTINGS_H */
+diff --git a/daemon/main.c b/daemon/main.c
+index 1b893fe0..344d1b74 100644
+--- a/daemon/main.c
++++ b/daemon/main.c
+@@ -240,70 +240,62 @@ gdm_daemon_lookup_user (uid_t *uidp,
+ if G_UNLIKELY (gid == 0) {
+ gdm_fail (_("The GDM group should not be root. Aborting!"));
+ }
+
+ if (uidp != NULL) {
+ *uidp = uid;
+ }
+
+ if (gidp != NULL) {
+ *gidp = gid;
+ }
+
+ g_free (username);
+ g_free (groupname);
+ }
+
+ static gboolean
+ on_shutdown_signal_cb (gpointer user_data)
+ {
+ GMainLoop *mainloop = user_data;
+
+ g_main_loop_quit (mainloop);
+
+ return FALSE;
+ }
+
+ static gboolean
+ on_sighup_cb (gpointer user_data)
+ {
+ g_debug ("Got HUP signal");
+- /* Reread config stuff like system config files, VPN service
+- * files, etc
+- */
+- g_object_unref (settings);
+- settings = gdm_settings_new ();
+- if (settings != NULL) {
+- if (! gdm_settings_direct_init (settings, DATADIR "/gdm/gdm.schemas", "/")) {
+- g_warning ("Unable to initialize settings");
+- }
+- }
++
++ gdm_settings_reload (settings);
+
+ return TRUE;
+ }
+
+ static gboolean
+ is_debug_set (void)
+ {
+ gboolean debug;
+ gdm_settings_direct_get_boolean (GDM_KEY_DEBUG, &debug);
+ return debug;
+ }
+
+ /* SIGUSR1 is used by the X server to tell us that we're ready, so
+ * block it. We'll unblock it in the worker thread in gdm-server.c
+ */
+ static void
+ block_sigusr1 (void)
+ {
+ sigset_t mask;
+
+ sigemptyset (&mask);
+ sigaddset (&mask, SIGUSR1);
+ sigprocmask (SIG_BLOCK, &mask, NULL);
+ }
+
+ int
+ main (int argc,
+ char **argv)
+ {
+ GMainLoop *main_loop;
+--
+2.34.1
+
diff --git a/0002-daemon-Don-t-update-session-type-if-no-saved-session.patch b/0002-daemon-Don-t-update-session-type-if-no-saved-session.patch
new file mode 100644
index 0000000..c6b5abc
--- /dev/null
+++ b/0002-daemon-Don-t-update-session-type-if-no-saved-session.patch
@@ -0,0 +1,109 @@
+From b09ab8a73d5a4133f72846d529bbbfb7802ca535 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Mon, 6 Sep 2021 08:40:46 -0400
+Subject: [PATCH 2/5] daemon: Don't update session type if no saved session
+
+At the moment we always set the session type when the session name
+is read. But users don't always have a session type specified.
+
+If they don't, then don't set the session type.
+
+https://gitlab.gnome.org/GNOME/gdm/-/merge_requests/153
+---
+ daemon/gdm-session.c | 23 +++++++++++++----------
+ 1 file changed, 13 insertions(+), 10 deletions(-)
+
+diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
+index 2b941e5e..b54687d5 100644
+--- a/daemon/gdm-session.c
++++ b/daemon/gdm-session.c
+@@ -995,73 +995,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, self->saved_session_type, 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 void
+ worker_on_saved_session_type_read (GdmDBusWorker *worker,
+ const char *session_type,
+ GdmSessionConversation *conversation)
+ {
+ GdmSession *self = conversation->session;
+
+ g_free (self->saved_session_type);
+ self->saved_session_type = g_strdup (session_type);
+ }
+
+ 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;
+ }
+ }
+--
+2.34.1
+
diff --git a/0002-daemon-Support-X-servers-built-with-Dlisten_tcp-true.patch b/0002-daemon-Support-X-servers-built-with-Dlisten_tcp-true.patch
new file mode 100644
index 0000000..a822f49
--- /dev/null
+++ b/0002-daemon-Support-X-servers-built-with-Dlisten_tcp-true.patch
@@ -0,0 +1,327 @@
+From cc67c8de39358031fddc5ca7d8c993271d6606a7 Mon Sep 17 00:00:00 2001
+From: Alan Coopersmith <alan.coopersmith@oracle.com>
+Date: Thu, 7 Oct 2021 18:22:11 -0700
+Subject: [PATCH 2/2] daemon: Support X servers built with -Dlisten_tcp=true
+
+Xorg since version 1.17 doesn't listen to tcp sockets by default
+unless it's explicitly built with -Dlisten_tcp=true.
+
+GDM currently assumes X servers 1.17 and later are always built
+without specifying -Dlisten_tcp=true and doesn't work properly
+otherwise.
+
+This commit enhances GDM to better handle these non-standard builds by
+always passing '-nolisten tcp' on the command line when tcp should
+be disabled, and likewise always passing '-listen tcp' on the command
+line, assuming the X server is new enough to support it, when tcp
+should be enabled.
+
+Related #704
+---
+ daemon/gdm-server.c | 21 +++++++++++----------
+ daemon/gdm-x-session.c | 12 ++++++------
+ meson.build | 4 ++--
+ 3 files changed, 19 insertions(+), 18 deletions(-)
+
+diff --git a/daemon/gdm-server.c b/daemon/gdm-server.c
+index 1ba00d45..e5d23521 100644
+--- a/daemon/gdm-server.c
++++ b/daemon/gdm-server.c
+@@ -290,72 +290,73 @@ gdm_server_resolve_command_line (GdmServer *server,
+ if (strcmp (arg, "-query") == 0 ||
+ strcmp (arg, "-indirect") == 0)
+ query_in_arglist = TRUE;
+ }
+
+ argv = g_renew (char *, argv, len + 12);
+ /* shift args down one */
+ for (i = len - 1; i >= 1; i--) {
+ argv[i+1] = argv[i];
+ }
+
+ /* server number is the FIRST argument, before any others */
+ argv[1] = g_strdup (server->display_name);
+ len++;
+
+ if (server->auth_file != NULL) {
+ argv[len++] = g_strdup ("-auth");
+ argv[len++] = g_strdup (server->auth_file);
+ }
+
+ if (server->display_seat_id != NULL) {
+ argv[len++] = g_strdup ("-seat");
+ argv[len++] = g_strdup (server->display_seat_id);
+ }
+
+ /* If we were compiled with Xserver >= 1.17 we need to specify
+ * '-listen tcp' as the X server dosen't listen on tcp sockets
+ * by default anymore. In older versions we need to pass
+ * -nolisten tcp to disable listening on tcp sockets.
+ */
+-#ifdef HAVE_XSERVER_THAT_DEFAULTS_TO_LOCAL_ONLY
+- if (!server->disable_tcp && ! query_in_arglist) {
+- argv[len++] = g_strdup ("-listen");
+- argv[len++] = g_strdup ("tcp");
+- }
+-#else
+- if (server->disable_tcp && ! query_in_arglist) {
+- argv[len++] = g_strdup ("-nolisten");
+- argv[len++] = g_strdup ("tcp");
+- }
++ if (!query_in_arglist) {
++ if (server->disable_tcp) {
++ argv[len++] = g_strdup ("-nolisten");
++ argv[len++] = g_strdup ("tcp");
++ }
+
++#ifdef HAVE_XSERVER_WITH_LISTEN
++ if (!server->disable_tcp) {
++ argv[len++] = g_strdup ("-listen");
++ argv[len++] = g_strdup ("tcp");
++ }
+ #endif
++ }
+
+ if (vtarg != NULL && ! gotvtarg) {
+ argv[len++] = g_strdup (vtarg);
+ }
+
+ argv[len++] = NULL;
+
+ *argvp = argv;
+ *argcp = len;
+
+ return TRUE;
+ }
+
+ static void
+ rotate_logs (const char *path,
+ guint n_copies)
+ {
+ int i;
+
+ for (i = n_copies - 1; i > 0; i--) {
+ char *name_n;
+ char *name_n1;
+
+ name_n = g_strdup_printf ("%s.%d", path, i);
+ if (i > 1) {
+ name_n1 = g_strdup_printf ("%s.%d", path, i - 1);
+ } else {
+ name_n1 = g_strdup (path);
+ }
+
+diff --git a/daemon/gdm-x-session.c b/daemon/gdm-x-session.c
+index 5962da57..0b07ab5b 100644
+--- a/daemon/gdm-x-session.c
++++ b/daemon/gdm-x-session.c
+@@ -233,70 +233,70 @@ spawn_x_server (State *state,
+
+ if (g_getenv ("XDG_VTNR") != NULL) {
+ int vt;
+
+ vt = atoi (g_getenv ("XDG_VTNR"));
+
+ if (vt > 0 && vt < 64) {
+ vt_string = g_strdup_printf ("vt%d", vt);
+ }
+ }
+
+ display_fd_string = g_strdup_printf ("%d", DISPLAY_FILENO);
+
+ g_ptr_array_add (arguments, X_SERVER);
+
+ if (vt_string != NULL) {
+ g_ptr_array_add (arguments, vt_string);
+ }
+
+ g_ptr_array_add (arguments, "-displayfd");
+ g_ptr_array_add (arguments, display_fd_string);
+
+ g_ptr_array_add (arguments, "-auth");
+ g_ptr_array_add (arguments, auth_file);
+
+ /* If we were compiled with Xserver >= 1.17 we need to specify
+ * '-listen tcp' as the X server doesn't listen on tcp sockets
+ * by default anymore. In older versions we need to pass
+ * -nolisten tcp to disable listening on tcp sockets.
+ */
+-#ifdef HAVE_XSERVER_THAT_DEFAULTS_TO_LOCAL_ONLY
+- if (allow_remote_connections) {
+- g_ptr_array_add (arguments, "-listen");
+- g_ptr_array_add (arguments, "tcp");
+- }
+-#else
+ if (!allow_remote_connections) {
+ g_ptr_array_add (arguments, "-nolisten");
+ g_ptr_array_add (arguments, "tcp");
+ }
++
++#ifdef HAVE_XSERVER_WITH_LISTEN
++ if (allow_remote_connections) {
++ g_ptr_array_add (arguments, "-listen");
++ g_ptr_array_add (arguments, "tcp");
++ }
+ #endif
+
+ g_ptr_array_add (arguments, "-background");
+ g_ptr_array_add (arguments, "none");
+
+ g_ptr_array_add (arguments, "-noreset");
+ g_ptr_array_add (arguments, "-keeptty");
+ g_ptr_array_add (arguments, "-novtswitch");
+
+ g_ptr_array_add (arguments, "-verbose");
+ if (state->debug_enabled) {
+ g_ptr_array_add (arguments, "7");
+ } else {
+ g_ptr_array_add (arguments, "3");
+ }
+
+ if (state->debug_enabled) {
+ g_ptr_array_add (arguments, "-core");
+ }
+ g_ptr_array_add (arguments, NULL);
+
+ subprocess = g_subprocess_launcher_spawnv (launcher,
+ (const char * const *) arguments->pdata,
+ &error);
+ g_free (display_fd_string);
+ g_clear_object (&launcher);
+ g_ptr_array_free (arguments, TRUE);
+
+ if (subprocess == NULL) {
+ g_debug ("could not start X server: %s", error->message);
+diff --git a/meson.build b/meson.build
+index 52ac1941..02d609dc 100644
+--- a/meson.build
++++ b/meson.build
+@@ -44,61 +44,61 @@ glib_min_version = '2.56.0'
+ glib_dep = dependency('glib-2.0', version: '>=' + glib_min_version)
+ gobject_dep = dependency('gobject-2.0', version: '>=' + glib_min_version)
+ gio_dep = dependency('gio-2.0', version: '>=' + glib_min_version)
+ gio_unix_dep = dependency('gio-unix-2.0', version: '>=' + glib_min_version)
+ gtk_dep = dependency('gtk+-3.0', version: '>= 2.91.1')
+ libcanberra_gtk_dep = dependency('libcanberra-gtk3', version: '>= 0.4')
+ accountsservice_dep = dependency('accountsservice', version: '>= 0.6.35')
+ xcb_dep = dependency('xcb')
+ keyutils_dep = dependency('libkeyutils', required: false)
+ libselinux_dep = dependency('libselinux', required: get_option('selinux'))
+
+ # udev
+ if udev_dir == ''
+ if udev_dep.found()
+ udev_prefix = udev_dep.get_pkgconfig_variable('udevdir')
+ else
+ udev_prefix = gdm_prefix / 'lib' / 'udev'
+ endif
+ udev_dir = udev_prefix / 'rules.d'
+ endif
+
+ # X11
+ x_deps = declare_dependency(
+ dependencies: [
+ dependency('x11'),
+ dependency('xau'),
+ ],
+ )
+ # Xserver 1.17 & later default to -nolisten and require -listen for remote access
+ xserver_deps = dependency('xorg-server', version : '>=1.17', required : false)
+-xserver_nolisten_default = xserver_deps.found()
++xserver_has_listen = xserver_deps.found()
+ find_x_server_script = find_program('build-aux/find-x-server.sh', native: true)
+ find_x_server_out = run_command(find_x_server_script).stdout().strip()
+ if find_x_server_out != ''
+ x_bin = find_x_server_out
+ x_bin_path_split = x_bin.split('/')
+ i = 0
+ x_path = '/'
+ foreach dir : x_bin_path_split
+ if i < x_bin_path_split.length() - 1
+ x_path = x_path / dir
+ endif
+ i = i + 1
+ endforeach
+ else
+ # what to do, what to do, this is wrong, but this just sets the
+ # defaults, perhaps this user is cross compiling or some such
+ x_path = '/usr/bin/X11:/usr/X11R6/bin:/opt/X11R6/bin'
+ x_bin = '/usr/bin/X'
+ endif
+ xdmcp_dep = cc.find_library('Xdmcp', required: get_option('xdmcp'))
+ if xdmcp_dep.found() and get_option('tcp-wrappers')
+ libwrap_dep = cc.find_library('wrap')
+ endif
+ # systemd
+ systemd_dep = dependency('systemd')
+ libsystemd_dep = dependency('libsystemd')
+ if meson.version().version_compare('>= 0.53')
+ systemd_multiseat_x = find_program('systemd-multi-seat-x',
+ required: false,
+ dirs: [
+@@ -200,61 +200,61 @@ conf.set_quoted('SYSCONFDIR', gdm_prefix / get_option('sysconfdir'))
+ conf.set_quoted('BINDIR', gdm_prefix / get_option('bindir'))
+ conf.set_quoted('LIBDIR', gdm_prefix / get_option('libdir'))
+ conf.set_quoted('LIBEXECDIR', gdm_prefix / get_option('libexecdir'))
+ conf.set_quoted('LOGDIR', get_option('log-dir'))
+ conf.set_quoted('DMCONFDIR', dmconfdir)
+ conf.set_quoted('GDMCONFDIR', gdmconfdir)
+ conf.set_quoted('GDM_SCREENSHOT_DIR', gdm_screenshot_dir)
+ conf.set_quoted('GDM_XAUTH_DIR', gdm_xauth_dir)
+ conf.set_quoted('GDM_RAN_ONCE_MARKER_DIR', ran_once_marker_dir)
+ conf.set_quoted('GDM_RUN_DIR', gdm_run_dir)
+ conf.set_quoted('GNOMELOCALEDIR', gdm_prefix / get_option('localedir'))
+ conf.set_quoted('AT_SPI_REGISTRYD_DIR', at_spi_registryd_dir)
+ conf.set_quoted('GDM_PID_FILE', gdm_pid_file)
+ conf.set_quoted('GNOME_SETTINGS_DAEMON_DIR', gnome_settings_daemon_dir)
+ conf.set_quoted('LANG_CONFIG_FILE', lang_config_file)
+ conf.set('HAVE_ADT', have_adt)
+ conf.set('HAVE_UTMP_H', have_utmp_header)
+ conf.set('HAVE_UTMPX_H', have_utmpx_header)
+ conf.set('HAVE_POSIX_GETPWNAM_R', have_posix_getpwnam_r)
+ conf.set('UTMP', utmp_struct)
+ conf.set('HAVE_GETUTXENT', cc.has_function('getutxent'))
+ conf.set('HAVE_UPDWTMP', cc.has_function('updwtmp'))
+ conf.set('HAVE_UPDWTMPX', cc.has_function('updwtmpx'))
+ conf.set('HAVE_LOGIN', cc.has_function('login', args: '-lutil'))
+ conf.set('HAVE_LOGOUT', cc.has_function('logout', args: '-lutil'))
+ conf.set('HAVE_LOGWTMP', cc.has_function('logwtmp', args: '-lutil'))
+ conf.set('HAVE_PAM_SYSLOG', have_pam_syslog)
+ conf.set('HAVE_KEYUTILS', keyutils_dep.found())
+ conf.set('SUPPORTS_PAM_EXTENSIONS', pam_extensions_supported)
+ conf.set('HAVE_SELINUX', libselinux_dep.found())
+-conf.set('HAVE_XSERVER_THAT_DEFAULTS_TO_LOCAL_ONLY', xserver_nolisten_default)
++conf.set('HAVE_XSERVER_WITH_LISTEN', xserver_has_listen)
+ conf.set('ENABLE_USER_DISPLAY_SERVER', get_option('user-display-server'))
+ conf.set('ENABLE_SYSTEMD_JOURNAL', get_option('systemd-journal'))
+ conf.set('ENABLE_WAYLAND_SUPPORT', get_option('wayland-support'))
+ conf.set('ENABLE_PROFILING', get_option('profiling'))
+ conf.set('GDM_INITIAL_VT', get_option('initial-vt'))
+ conf.set_quoted('GDM_DEFAULTS_CONF', gdm_defaults_conf)
+ conf.set_quoted('GDM_CUSTOM_CONF', gdm_custom_conf)
+ conf.set_quoted('GDM_RUNTIME_CONF', gdm_runtime_conf)
+ conf.set_quoted('GDM_SESSION_DEFAULT_PATH', get_option('default-path'))
+ conf.set_quoted('GDM_USERNAME', get_option('user'))
+ conf.set_quoted('GDM_GROUPNAME', get_option('group'))
+ conf.set('HAVE_LIBXDMCP', xdmcp_dep.found())
+ conf.set_quoted('SYSTEMD_X_SERVER', systemd_x_server)
+ conf.set('WITH_PLYMOUTH', plymouth_dep.found())
+ conf.set_quoted('X_SERVER', x_bin)
+ conf.set_quoted('X_PATH', x_path)
+ conf.set('HAVE_UT_UT_HOST', utmp_has_host_field)
+ conf.set('HAVE_UT_UT_PID', utmp_has_pid_field)
+ conf.set('HAVE_UT_UT_ID', utmp_has_id_field)
+ conf.set('HAVE_UT_UT_NAME', utmp_has_name_field)
+ conf.set('HAVE_UT_UT_TYPE', utmp_has_type_field)
+ conf.set('HAVE_UT_UT_EXIT_E_TERMINATION', utmp_has_exit_e_termination_field)
+ conf.set('HAVE_UT_UT_USER', utmp_has_user_field)
+ conf.set('HAVE_UT_UT_TIME', utmp_has_time_field)
+ conf.set('HAVE_UT_UT_TV', utmp_has_tv_field)
+ conf.set('HAVE_UT_UT_SYSLEN', utmp_has_syslen_field)
+ conf.set('ENABLE_IPV6', get_option('ipv6'))
+ configure_file(output: 'config.h', configuration: conf)
+
+ # Subdirs
+--
+2.34.1
+
diff --git a/0002-gdm-x-session-run-session-bus-on-non-seat0-seats.patch b/0002-gdm-x-session-run-session-bus-on-non-seat0-seats.patch
new file mode 100644
index 0000000..000b95c
--- /dev/null
+++ b/0002-gdm-x-session-run-session-bus-on-non-seat0-seats.patch
@@ -0,0 +1,151 @@
+From ea1de1173b46f76fe00b4f52b2b71ad16e35acc3 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Wed, 5 Feb 2020 15:20:48 -0500
+Subject: [PATCH 2/3] gdm-x-session: run session bus on non-seat0 seats
+
+GNOME doesn't deal very well with multiple sessions
+running on a multiple seats at the moment.
+
+Until that's fixed, ensure sessions run on auxillary
+seats get their own session bus.
+---
+ daemon/gdm-session.c | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
+index a65fa0f9..f13b54af 100644
+--- a/daemon/gdm-session.c
++++ b/daemon/gdm-session.c
+@@ -2864,119 +2864,128 @@ on_start_program_cb (GdmDBusWorker *worker,
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CLOSED) ||
+ g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ return;
+
+ self = conversation->session;
+ service_name = conversation->service_name;
+
+ if (worked) {
+ self->session_pid = pid;
+ self->session_conversation = conversation;
+
+ g_debug ("GdmSession: Emitting 'session-started' signal with pid '%d'", pid);
+ g_signal_emit (self, signals[SESSION_STARTED], 0, service_name, pid);
+ } else {
+ gdm_session_stop_conversation (self, service_name);
+
+ g_debug ("GdmSession: Emitting 'session-start-failed' signal");
+ g_signal_emit (self, signals[SESSION_START_FAILED], 0, service_name, error->message);
+ }
+ }
+
+ void
+ gdm_session_start_session (GdmSession *self,
+ const char *service_name)
+ {
+ GdmSessionConversation *conversation;
+ GdmSessionDisplayMode display_mode;
+ gboolean is_x11 = TRUE;
+ gboolean run_launcher = FALSE;
+ gboolean allow_remote_connections = FALSE;
++ gboolean run_separate_bus = FALSE;
+ char *command;
+ char *program;
+ gboolean register_session;
+
+ g_return_if_fail (GDM_IS_SESSION (self));
+ g_return_if_fail (self->session_conversation == NULL);
+
+ conversation = find_conversation_by_name (self, service_name);
+
+ if (conversation == NULL) {
+ g_warning ("GdmSession: Tried to start session of "
+ "nonexistent conversation %s", service_name);
+ return;
+ }
+
+ stop_all_other_conversations (self, conversation, FALSE);
+
+ display_mode = gdm_session_get_display_mode (self);
+
+ #ifdef ENABLE_WAYLAND_SUPPORT
+ is_x11 = g_strcmp0 (self->session_type, "wayland") != 0;
+ #endif
+
+ if (display_mode == GDM_SESSION_DISPLAY_MODE_LOGIND_MANAGED ||
+ display_mode == GDM_SESSION_DISPLAY_MODE_NEW_VT) {
+ run_launcher = TRUE;
+ }
+
+ register_session = !gdm_session_session_registers (self);
+
++ if (g_strcmp0 (self->display_seat_id, "seat0") != 0 && !run_launcher) {
++ run_separate_bus = TRUE;
++ }
++
+ if (self->selected_program == NULL) {
+ gboolean run_xsession_script;
+
+ command = get_session_command (self);
+
+ run_xsession_script = !gdm_session_bypasses_xsession (self);
+
+ if (self->display_is_local) {
+ gboolean disallow_tcp = TRUE;
+ gdm_settings_direct_get_boolean (GDM_KEY_DISALLOW_TCP, &disallow_tcp);
+ allow_remote_connections = !disallow_tcp;
+ } else {
+ allow_remote_connections = TRUE;
+ }
+
+ if (run_launcher) {
+ if (is_x11) {
+ program = g_strdup_printf (LIBEXECDIR "/gdm-x-session %s%s %s\"%s\"",
+ register_session ? "--register-session " : "",
+ run_xsession_script? "--run-script " : "",
+ allow_remote_connections? "--allow-remote-connections " : "",
+ command);
+ } else {
+ program = g_strdup_printf (LIBEXECDIR "/gdm-wayland-session %s\"%s\"",
+ register_session ? "--register-session " : "",
+ command);
+ }
+ } else if (run_xsession_script) {
+- program = g_strdup_printf (GDMCONFDIR "/Xsession \"%s\"", command);
++ if (run_separate_bus) {
++ program = g_strdup_printf ("dbus-run-session -- " GDMCONFDIR "/Xsession \"%s\"", command);
++ } else {
++ program = g_strdup_printf (GDMCONFDIR "/Xsession \"%s\"", command);
++ }
+ } else {
+ program = g_strdup (command);
+ }
+
+ g_free (command);
+ } else {
+ /* FIXME:
+ * Always use a separate DBus bus for each greeter session.
+ * Firstly, this means that if we run multiple greeter session
+ * (which we really should not do, but have to currently), then
+ * each one will get its own DBus session bus.
+ * But, we also explicitly do this for seat0, because that way
+ * it cannot make use of systemd to run the GNOME session. This
+ * prevents the session lookup logic from getting confused.
+ * This has a similar effect as passing --builtin to gnome-session.
+ *
+ * We really should not be doing this. But the fix is to use
+ * separate dynamically created users and that requires some
+ * major refactorings.
+ */
+ if (run_launcher) {
+ if (is_x11) {
+ program = g_strdup_printf (LIBEXECDIR "/gdm-x-session %s\"dbus-run-session -- %s\"",
+ register_session ? "--register-session " : "",
+ self->selected_program);
+ } else {
+ program = g_strdup_printf (LIBEXECDIR "/gdm-wayland-session %s\"dbus-run-session -- %s\"",
+ register_session ? "--register-session " : "",
+ self->selected_program);
+ }
+--
+2.37.3
+
diff --git a/0002-local-display-factory-Fix-user-switching-with-legacy.patch b/0002-local-display-factory-Fix-user-switching-with-legacy.patch
new file mode 100644
index 0000000..42465d5
--- /dev/null
+++ b/0002-local-display-factory-Fix-user-switching-with-legacy.patch
@@ -0,0 +1,384 @@
+From 510566699c480226b189215c6222f7e72979baf8 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Wed, 22 May 2024 14:05:20 -0400
+Subject: [PATCH 2/2] local-display-factory: Fix user switching with legacy
+ xorg
+
+legacy-xorg sessions currently fail to completely user switch.
+
+This is because the wrong session types are attached to the generated
+login screen display.
+
+This commit refactors the code so the same session types are used for
+user switching as are used for the initial login.
+---
+ daemon/gdm-local-display-factory.c | 78 +++++++++++++++++++++---------
+ 1 file changed, 54 insertions(+), 24 deletions(-)
+
+diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
+index 7447b985a..4efbf0a6d 100644
+--- a/daemon/gdm-local-display-factory.c
++++ b/daemon/gdm-local-display-factory.c
+@@ -331,118 +331,131 @@ gdm_local_display_factory_get_session_types (GdmLocalDisplayFactory *factory,
+ 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
+ on_display_disposed (GdmLocalDisplayFactory *factory,
+ GdmDisplay *display)
+ {
+ g_debug ("GdmLocalDisplayFactory: Display %p disposed", display);
+ }
+
+ static void
+ store_display (GdmLocalDisplayFactory *factory,
+ GdmDisplay *display)
+ {
+ GdmDisplayStore *store;
+
+ store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
+ gdm_display_store_add (store, display);
+ }
+
++static GdmDisplay *
++create_legacy_xorg_display (GdmLocalDisplayFactory *factory)
++{
++ guint32 display_number;
++ const char *session_types[] = { "x11", NULL };
++ GdmDisplay *display;
++
++ display_number = take_next_display_number (factory);
++
++ g_debug ("GdmLocalDisplayFactory: Creating legacy Xorg display at :%d", display_number);
++
++ display = gdm_legacy_display_new (display_number);
++ g_object_set (G_OBJECT (display),
++ "session-type", session_types[0],
++ "supported-session-types", session_types,
++ NULL);
++
++ return display;
++}
++
+ /*
+ Example:
+ dbus-send --system --dest=org.gnome.DisplayManager \
+ --type=method_call --print-reply --reply-timeout=2000 \
+ /org/gnome/DisplayManager/Manager \
+ org.gnome.DisplayManager.Manager.GetDisplays
+ */
+ gboolean
+ gdm_local_display_factory_create_transient_display (GdmLocalDisplayFactory *factory,
+ char **id,
+ GError **error)
+ {
+ gboolean ret;
+ GdmDisplay *display = NULL;
+ gboolean is_initial = FALSE;
+ const char *session_type;
+ g_autofree gchar *preferred_display_server = NULL;
+
+ g_return_val_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (factory), FALSE);
+
+ ret = FALSE;
+
+ g_debug ("GdmLocalDisplayFactory: Creating transient display");
+
+ preferred_display_server = get_preferred_display_server (factory);
+
+ #ifdef ENABLE_USER_DISPLAY_SERVER
+ if (g_strcmp0 (preferred_display_server, "wayland") == 0 ||
+ g_strcmp0 (preferred_display_server, "xorg") == 0) {
+ g_auto(GStrv) session_types = 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,
+ "Both Wayland and Xorg are unavailable");
+ return FALSE;
+ }
+
+ display = gdm_local_display_new ();
+ g_object_set (G_OBJECT (display),
+ "session-type", session_types[0],
+ "supported-session-types", session_types,
+ NULL);
+ is_initial = TRUE;
+ }
+ #endif
+- if (g_strcmp0 (preferred_display_server, "legacy-xorg") == 0) {
+- if (display == NULL) {
+- guint32 num;
+-
+- num = take_next_display_number (factory);
+-
+- display = gdm_legacy_display_new (num);
+- }
+- }
++ if (g_strcmp0 (preferred_display_server, "legacy-xorg") == 0)
++ display = create_legacy_xorg_display (factory);
+
+ if (display == NULL) {
+ g_set_error_literal (error,
+ GDM_DISPLAY_ERROR,
+ GDM_DISPLAY_ERROR_GENERAL,
+ "Invalid preferred display server configured");
+ return FALSE;
+ }
+
+ g_object_set (display,
+ "seat-id", "seat0",
+ "allow-timed-login", FALSE,
+ "is-initial", is_initial,
+ NULL);
+
+ store_display (factory, display);
+
+ if (! gdm_display_manage (display)) {
+ display = NULL;
+ goto out;
+ }
+
+ if (! gdm_display_get_id (display, id, NULL)) {
+ display = NULL;
+ goto out;
+ }
+
+ ret = TRUE;
+ out:
+ /* ref either held by store or not at all */
+@@ -591,70 +604,87 @@ on_display_status_changed (GdmDisplay *display,
+ case GDM_DISPLAY_WAITING_TO_FINISH:
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ g_free (seat_id);
+ g_free (session_type);
+ g_free (session_class);
+ }
+
+ static gboolean
+ lookup_by_seat_id (const char *id,
+ GdmDisplay *display,
+ gpointer user_data)
+ {
+ const char *looking_for = user_data;
+ char *current;
+ gboolean res;
+
+ g_object_get (G_OBJECT (display), "seat-id", &current, NULL);
+
+ res = g_strcmp0 (current, looking_for) == 0;
+
+ g_free(current);
+
+ return res;
+ }
+
++static gboolean
++lookup_initial_display (const char *id,
++ GdmDisplay *display)
++{
++ gboolean is_initial = FALSE;
++ int status;
++
++ status = gdm_display_get_status (display);
++
++ if (status != GDM_DISPLAY_PREPARED && status != GDM_DISPLAY_MANAGED)
++ return FALSE;
++
++ g_object_get (G_OBJECT (display), "is-initial", &is_initial, NULL);
++
++ return is_initial;
++}
++
+ static gboolean
+ lookup_prepared_display_by_seat_id (const char *id,
+ GdmDisplay *display,
+ gpointer user_data)
+ {
+ int status;
+
+ status = gdm_display_get_status (display);
+
+- if (status != GDM_DISPLAY_PREPARED)
++ if (status != GDM_DISPLAY_PREPARED && status != GDM_DISPLAY_MANAGED)
+ return FALSE;
+
+ return lookup_by_seat_id (id, display, user_data);
+ }
+
+ #ifdef HAVE_UDEV
+ static gboolean
+ udev_is_settled (GdmLocalDisplayFactory *factory)
+ {
+ g_autoptr (GUdevEnumerator) enumerator = NULL;
+ GList *devices;
+ GList *node;
+
+ gboolean is_settled = FALSE;
+
+ if (factory->seat0_has_platform_graphics) {
+ g_debug ("GdmLocalDisplayFactory: udev settled, platform graphics enabled.");
+ return TRUE;
+ }
+
+ if (factory->seat0_has_boot_up_graphics) {
+ g_debug ("GdmLocalDisplayFactory: udev settled, boot up graphics available.");
+ return TRUE;
+ }
+
+ if (factory->seat0_graphics_check_timed_out) {
+ g_debug ("GdmLocalDisplayFactory: udev timed out, proceeding anyway.");
+ return TRUE;
+ }
+
+@@ -834,115 +864,115 @@ ensure_display_for_seat (GdmLocalDisplayFactory *factory,
+ /* It is not yet time to force X11 fallback. */
+ g_debug ("GdmLocalDisplayFactory: seat0 display requested when there is no graphics support before graphics check timeout.");
+ }
+
+ return;
+ }
+
+ g_debug ("GdmLocalDisplayFactory: Assuming we can use seat0 for X11 even though system says it doesn't support graphics!");
+ 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;
+ 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);
+ }
+ }
+
+ if (!seat_supports_graphics)
+ return;
+
+ if (session_types != NULL)
+ g_debug ("GdmLocalDisplayFactory: %s login display for seat %s requested",
+ 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);
+
+ store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
+
+- if (is_seat0)
+- display = gdm_display_store_find (store, lookup_prepared_display_by_seat_id, (gpointer) seat_id);
+- else
++ if (is_seat0) {
++ display = gdm_display_store_find (store, lookup_prepared_display_by_seat_id, (gpointer) seat_id);
++ if (display != NULL && g_strcmp0 (preferred_display_server, "legacy-xorg") == 0) {
++ GdmDisplay *initial_display = NULL;
++
++ initial_display = gdm_display_store_find (store, lookup_initial_display, (gpointer) NULL);
++
++ if (initial_display == NULL)
++ display = NULL;
++ }
++ } else {
+ display = gdm_display_store_find (store, lookup_by_seat_id, (gpointer) seat_id);
++ }
+
+ /* Ensure we don't create the same display more than once */
+ if (display != NULL) {
+ g_debug ("GdmLocalDisplayFactory: display already created");
+ return;
+ }
+
+ /* If we already have a login window, switch to it */
+ if (gdm_get_login_window_session_id (seat_id, &login_session_id)) {
+ GdmDisplay *display;
+
+ display = gdm_display_store_find (store,
+ lookup_by_session_id,
+ (gpointer) login_session_id);
+ if (display != NULL &&
+ (gdm_display_get_status (display) == GDM_DISPLAY_MANAGED ||
+ gdm_display_get_status (display) == GDM_DISPLAY_WAITING_TO_FINISH)) {
+ g_object_set (G_OBJECT (display), "status", GDM_DISPLAY_MANAGED, NULL);
+ g_debug ("GdmLocalDisplayFactory: session %s found, activating.",
+ login_session_id);
+ gdm_activate_session_by_id (factory->connection, seat_id, login_session_id);
+ return;
+ }
+ }
+
+ g_debug ("GdmLocalDisplayFactory: Adding display on seat %s", seat_id);
+
+ #ifdef ENABLE_USER_DISPLAY_SERVER
+ if (g_strcmp0 (preferred_display_server, "wayland") == 0 ||
+ g_strcmp0 (preferred_display_server, "xorg") == 0) {
+ if (is_seat0) {
+ display = gdm_local_display_new ();
+ g_object_set (G_OBJECT (display),
+ "session-type", session_types[0],
+ "supported-session-types", session_types,
+ NULL);
+ }
+ }
+ #endif
+
+- if (display == NULL) {
+- guint32 num;
+-
+- num = take_next_display_number (factory);
+-
+- display = gdm_legacy_display_new (num);
+- g_object_set (G_OBJECT (display),
+- "session-type", legacy_session_types[0],
+- "supported-session-types", legacy_session_types,
+- NULL);
+- }
++ if (display == NULL)
++ display = create_legacy_xorg_display (factory);
+
+ g_object_set (display, "seat-id", seat_id, NULL);
+ g_object_set (display, "is-initial", is_seat0, NULL);
+
+ store_display (factory, display);
+
+ /* let store own the ref */
+ g_object_unref (display);
+
+ if (! gdm_display_manage (display)) {
+ gdm_display_unmanage (display);
+ }
+
+ return;
+ }
+
+ static void
+ delete_display (GdmLocalDisplayFactory *factory,
+ const char *seat_id) {
+
+ GdmDisplayStore *store;
+
+ g_debug ("GdmLocalDisplayFactory: Removing used_display_numbers on seat %s", seat_id);
+
+ store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
+ gdm_display_store_foreach_remove (store, lookup_by_seat_id, (gpointer) seat_id);
+ }
+
+ static gboolean
+ gdm_local_display_factory_sync_seats (GdmLocalDisplayFactory *factory)
+--
+2.40.0
+
diff --git a/0003-common-Reload-settings-when-graphics-initialize.patch b/0003-common-Reload-settings-when-graphics-initialize.patch
new file mode 100644
index 0000000..4113958
--- /dev/null
+++ b/0003-common-Reload-settings-when-graphics-initialize.patch
@@ -0,0 +1,155 @@
+From a9928bfcc9c6d81d60e047b7838d4107835b8f89 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Tue, 15 Feb 2022 14:33:22 -0500
+Subject: [PATCH 3/4] common: Reload settings when graphics initialize
+
+If GDM starts faster than graphics initialize, then the
+udev rules that write out /run/gdm/custom.conf might get
+run too late for GDM to notice.
+
+This commit changes GDM to reread its config after graphicals
+initialization completes.
+
+https://gitlab.gnome.org/GNOME/gdm/-/issues/763
+---
+ daemon/gdm-local-display-factory.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
+index 0b1d3482..8bca8ce9 100644
+--- a/daemon/gdm-local-display-factory.c
++++ b/daemon/gdm-local-display-factory.c
+@@ -1023,64 +1023,66 @@ on_seat_properties_changed (GDBusConnection *connection,
+ g_autoptr(GVariant) changed_prop = NULL;
+ g_autofree const gchar **invalidated_props = NULL;
+ gboolean changed = FALSE;
+ int ret;
+
+ /* Extract seat id, i.e. the last element of the object path. */
+ seat = strrchr (object_path, '/');
+ if (seat == NULL)
+ return;
+ seat += 1;
+
+ /* Valid seat IDs must start with seat, i.e. ignore "auto" */
+ if (!g_str_has_prefix (seat, "seat"))
+ return;
+
+ g_variant_get (parameters, "(s@a{sv}^a&s)", NULL, &changed_props, &invalidated_props);
+
+ changed_prop = g_variant_lookup_value (changed_props, "CanGraphical", NULL);
+ if (changed_prop)
+ changed = TRUE;
+ if (!changed && g_strv_contains (invalidated_props, "CanGraphical"))
+ changed = TRUE;
+
+ if (!changed)
+ return;
+
+ ret = sd_seat_can_graphical (seat);
+ if (ret < 0)
+ return;
+
+- if (ret != 0)
++ if (ret != 0) {
++ gdm_settings_direct_reload ();
+ ensure_display_for_seat (GDM_LOCAL_DISPLAY_FACTORY (user_data), seat);
+- else
++ } else {
+ delete_display (GDM_LOCAL_DISPLAY_FACTORY (user_data), seat);
++ }
+ }
+
+ static gboolean
+ lookup_by_session_id (const char *id,
+ GdmDisplay *display,
+ gpointer user_data)
+ {
+ const char *looking_for = user_data;
+ const char *current;
+
+ current = gdm_display_get_session_id (display);
+ return g_strcmp0 (current, looking_for) == 0;
+ }
+
+ static gboolean
+ lookup_by_tty (const char *id,
+ GdmDisplay *display,
+ gpointer user_data)
+ {
+ const char *tty_to_find = user_data;
+ g_autofree char *tty_to_check = NULL;
+ const char *session_id;
+ int ret;
+
+ session_id = gdm_display_get_session_id (display);
+
+ if (!session_id)
+ return FALSE;
+
+ ret = sd_session_get_tty (session_id, &tty_to_check);
+@@ -1260,60 +1262,61 @@ on_vt_changed (GIOChannel *source,
+ }
+
+ g_debug ("GdmLocalDisplayFactory: creating new display on seat0 because of VT change");
+
+ ensure_display_for_seat (factory, "seat0");
+
+ return G_SOURCE_CONTINUE;
+ }
+ #endif
+
+ #ifdef HAVE_UDEV
+ static void
+ on_uevent (GUdevClient *client,
+ const char *action,
+ GUdevDevice *device,
+ GdmLocalDisplayFactory *factory)
+ {
+ if (!g_udev_device_get_device_file (device))
+ return;
+
+ if (g_strcmp0 (action, "add") != 0 &&
+ g_strcmp0 (action, "change") != 0)
+ return;
+
+ if (!udev_is_settled (factory))
+ return;
+
+ g_signal_handler_disconnect (factory->gudev_client, factory->uevent_handler_id);
+ factory->uevent_handler_id = 0;
+
++ gdm_settings_direct_reload ();
+ ensure_display_for_seat (factory, "seat0");
+ }
+ #endif
+
+ static void
+ gdm_local_display_factory_start_monitor (GdmLocalDisplayFactory *factory)
+ {
+ g_autoptr (GIOChannel) io_channel = NULL;
+ const char *subsystems[] = { "drm", NULL };
+
+ factory->seat_new_id = g_dbus_connection_signal_subscribe (factory->connection,
+ "org.freedesktop.login1",
+ "org.freedesktop.login1.Manager",
+ "SeatNew",
+ "/org/freedesktop/login1",
+ NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ on_seat_new,
+ g_object_ref (factory),
+ g_object_unref);
+ factory->seat_removed_id = g_dbus_connection_signal_subscribe (factory->connection,
+ "org.freedesktop.login1",
+ "org.freedesktop.login1.Manager",
+ "SeatRemoved",
+ "/org/freedesktop/login1",
+ NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ on_seat_removed,
+ g_object_ref (factory),
+ g_object_unref);
+--
+2.34.1
+
diff --git a/0003-daemon-Infer-session-type-from-desktop-file-if-user-.patch b/0003-daemon-Infer-session-type-from-desktop-file-if-user-.patch
new file mode 100644
index 0000000..f0d568b
--- /dev/null
+++ b/0003-daemon-Infer-session-type-from-desktop-file-if-user-.patch
@@ -0,0 +1,87 @@
+From 7084aea50bdc16ccecb4474ca79403429e79ec0e Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Wed, 29 Sep 2021 11:03:41 -0400
+Subject: [PATCH 3/5] daemon: Infer session type from desktop file if user has
+ no saved session type
+
+The accountsservice user cache file can specify a session type
+associated with the saved session. This is optional though. If one
+isn't specified GDM needs to figure out the session type based on the
+list of preferred session types for the system and the session file
+itself.
+
+It was failing to do the latter, though. This commit fixes that.
+---
+ daemon/gdm-session.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
+index b54687d5..a65fa0f9 100644
+--- a/daemon/gdm-session.c
++++ b/daemon/gdm-session.c
+@@ -1009,60 +1009,62 @@ worker_on_saved_language_name_read (GdmDBusWorker *worker,
+ }
+ }
+ }
+
+ 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, self->saved_session_type, 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;
+ 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);
++ else
++ update_session_type (self);
+ }
+
+ }
+
+ static void
+ worker_on_saved_session_type_read (GdmDBusWorker *worker,
+ const char *session_type,
+ GdmSessionConversation *conversation)
+ {
+ GdmSession *self = conversation->session;
+
+ g_free (self->saved_session_type);
+ self->saved_session_type = g_strdup (session_type);
+ }
+
+ 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;
+--
+2.34.1
+
diff --git a/0003-session-ensure-login-screen-over-XDMCP-connects-to-i.patch b/0003-session-ensure-login-screen-over-XDMCP-connects-to-i.patch
new file mode 100644
index 0000000..21efc57
--- /dev/null
+++ b/0003-session-ensure-login-screen-over-XDMCP-connects-to-i.patch
@@ -0,0 +1,105 @@
+From 73ccd50cabda8102b724d9bf647ac5a74963040d Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Mon, 11 Feb 2019 10:32:55 -0500
+Subject: [PATCH 3/3] session: ensure login screen over XDMCP connects to its
+ session
+
+Right now GTK preferentially picks the wayland display over an
+X11 display if it finds one.
+
+That causes a problem for XDMCP sessions, since there may be a
+wayland display running on the local console for the GDM user.
+
+This commit addresses the issue by forcing the X11 backend if
+the session is X11.
+---
+ daemon/gdm-session.c | 19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
+index f13b54af..9f68166e 100644
+--- a/daemon/gdm-session.c
++++ b/daemon/gdm-session.c
+@@ -2739,60 +2739,79 @@ set_up_session_environment (GdmSession *self)
+ }
+
+ static void
+ send_display_mode (GdmSession *self,
+ GdmSessionConversation *conversation)
+ {
+ GdmSessionDisplayMode mode;
+
+ mode = gdm_session_get_display_mode (self);
+ gdm_dbus_worker_call_set_session_display_mode (conversation->worker_proxy,
+ gdm_session_display_mode_to_string (mode),
+ conversation->worker_cancellable,
+ NULL, NULL);
+ }
+
+ static void
+ send_session_type (GdmSession *self,
+ GdmSessionConversation *conversation)
+ {
+ const char *session_type = "x11";
+
+ if (self->session_type != NULL) {
+ session_type = self->session_type;
+ }
+
+ gdm_dbus_worker_call_set_environment_variable (conversation->worker_proxy,
+ "XDG_SESSION_TYPE",
+ session_type,
+ conversation->worker_cancellable,
+ NULL, NULL);
++
++ /* If the session type is x11, then set GDK_BACKEND to x11 as well.
++ * This is so gnome-session-check-accelerated from an XDMCP connection doesn't
++ * try to use the wayland display running on the local console for the gdm
++ * user login screen session.
++ *
++ * That's the only case where we let a user log in more than once, so it's
++ * the only situation that matters.
++ *
++ * We can drop this code if we ever switch the login screen to use systemd's
++ * DynamicUser feature.
++ */
++ if (g_strcmp0 (session_type, "x11") == 0) {
++ gdm_dbus_worker_call_set_environment_variable (conversation->worker_proxy,
++ "GDK_BACKEND",
++ "x11",
++ conversation->worker_cancellable,
++ NULL, NULL);
++ }
+ }
+
+ void
+ gdm_session_open_session (GdmSession *self,
+ const char *service_name)
+ {
+ GdmSessionConversation *conversation;
+
+ g_return_if_fail (GDM_IS_SESSION (self));
+
+ conversation = find_conversation_by_name (self, service_name);
+
+ if (conversation != NULL) {
+ send_display_mode (self, conversation);
+ send_session_type (self, conversation);
+
+ gdm_dbus_worker_call_open (conversation->worker_proxy,
+ conversation->worker_cancellable,
+ (GAsyncReadyCallback) on_opened, conversation);
+ }
+ }
+
+ static void
+ stop_all_other_conversations (GdmSession *self,
+ GdmSessionConversation *conversation_to_keep,
+ gboolean now)
+ {
+ GHashTableIter iter;
+ gpointer key, value;
+
+--
+2.37.3
+
diff --git a/0004-daemon-Consolidate-session-type-and-supported-sessio.patch b/0004-daemon-Consolidate-session-type-and-supported-sessio.patch
new file mode 100644
index 0000000..9a91510
--- /dev/null
+++ b/0004-daemon-Consolidate-session-type-and-supported-sessio.patch
@@ -0,0 +1,559 @@
+From d76d6ff0761d47df938f1dab0daeeecac2feb56e Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Mon, 6 Sep 2021 08:43:28 -0400
+Subject: [PATCH 4/5] daemon: Consolidate session-type and
+ supported-session-types list
+
+There's currently a bug in computing the session-type to use.
+
+The `i > 0` check means wayland will overwrite x11 in the
+transient session type list.
+
+Morever, the separation between "session-type" and
+"supported-session-types" is a little redundant. Since
+supported-session-types is a sorted list, the first item should
+always be the same as "session-type".
+
+This commit addresses the bug and the redundant logic, by computing
+the supported session types early in the function and indexing into
+it to get the session-type.
+
+A future cleanup could probably get rid of session-type entirely.
+
+https://gitlab.gnome.org/GNOME/gdm/-/merge_requests/153
+---
+ daemon/gdm-local-display-factory.c | 193 +++++++++++++++++------------
+ 1 file changed, 116 insertions(+), 77 deletions(-)
+
+diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
+index 141d64c6..eba38671 100644
+--- a/daemon/gdm-local-display-factory.c
++++ b/daemon/gdm-local-display-factory.c
+@@ -197,164 +197,226 @@ get_preferred_display_server (GdmLocalDisplayFactory *factory)
+ }
+
+ if (!wayland_enabled && !xorg_enabled) {
+ return g_strdup ("none");
+ }
+
+ gdm_settings_direct_get_string (GDM_KEY_PREFERRED_DISPLAY_SERVER, &preferred_display_server);
+
+ if (g_strcmp0 (preferred_display_server, "wayland") == 0) {
+ if (wayland_enabled)
+ return g_strdup (preferred_display_server);
+ else
+ return g_strdup ("xorg");
+ }
+
+ if (g_strcmp0 (preferred_display_server, "xorg") == 0) {
+ if (xorg_enabled)
+ return g_strdup (preferred_display_server);
+ else
+ return g_strdup ("wayland");
+ }
+
+ if (g_strcmp0 (preferred_display_server, "legacy-xorg") == 0) {
+ if (xorg_enabled)
+ return g_strdup (preferred_display_server);
+ }
+
+ 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;
+ 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;
++ g_debug ("GdmLocalDisplayFactory: Getting session type (prefers %s, falling back: %s)",
++ preferred_display_server, should_fall_back? "yes" : "no");
+
+- for (i = 0; i < G_N_ELEMENTS (session_types) - 1; i++) {
+-#ifdef ENABLE_WAYLAND_SUPPORT
+- if (i > 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";
+- continue;
+- }
+- }
+- }
+-#endif
++ 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 (i > 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";
+- continue;
+- }
+- }
+- }
++ 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++;
++ 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));
+
+- return session_types[session_type_index];
++ 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
+ on_display_disposed (GdmLocalDisplayFactory *factory,
+ GdmDisplay *display)
+ {
+ g_debug ("GdmLocalDisplayFactory: Display %p disposed", display);
+ }
+
+ static void
+ store_display (GdmLocalDisplayFactory *factory,
+ GdmDisplay *display)
+ {
+ GdmDisplayStore *store;
+
+ store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
+ gdm_display_store_add (store, display);
+ }
+
+ /*
+ Example:
+ dbus-send --system --dest=org.gnome.DisplayManager \
+ --type=method_call --print-reply --reply-timeout=2000 \
+ /org/gnome/DisplayManager/Manager \
+ org.gnome.DisplayManager.Manager.GetDisplays
+ */
+ gboolean
+ gdm_local_display_factory_create_transient_display (GdmLocalDisplayFactory *factory,
+ char **id,
+ GError **error)
+ {
+ gboolean ret;
+ GdmDisplay *display = NULL;
+ gboolean is_initial = FALSE;
+ const char *session_type;
+ g_autofree gchar *preferred_display_server = NULL;
+
+ g_return_val_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (factory), FALSE);
+
+ ret = FALSE;
+
+ g_debug ("GdmLocalDisplayFactory: Creating transient display");
+
+ preferred_display_server = get_preferred_display_server (factory);
+
+ #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,
+ "Both Wayland and Xorg are unavailable");
+ return FALSE;
+ }
+
+ 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-types", session_types,
++ NULL);
+ is_initial = TRUE;
+ }
+ #endif
+ if (g_strcmp0 (preferred_display_server, "legacy-xorg") == 0) {
+ if (display == NULL) {
+ guint32 num;
+
+ num = take_next_display_number (factory);
+
+ display = gdm_legacy_display_new (num);
+ }
+ }
+
+ if (display == NULL) {
+ g_set_error_literal (error,
+ GDM_DISPLAY_ERROR,
+ GDM_DISPLAY_ERROR_GENERAL,
+ "Invalid preferred display server configured");
+ return FALSE;
+ }
+
+ g_object_set (display,
+ "seat-id", "seat0",
+ "allow-timed-login", FALSE,
+ "is-initial", is_initial,
+ NULL);
+
+ store_display (factory, display);
+
+ if (! gdm_display_manage (display)) {
+@@ -549,243 +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);
+ }
+
+ static int
+ on_seat0_graphics_check_timeout (gpointer user_data)
+ {
+ GdmLocalDisplayFactory *factory = user_data;
+
+ factory->seat0_graphics_check_timeout_id = 0;
+
+ /* Simply try to re-add seat0. If it is there already (i.e. CanGraphical
+ * turned TRUE, then we'll find it and it will not be created again).
+ */
+ factory->seat0_graphics_check_timed_out = TRUE;
+ ensure_display_for_seat (factory, "seat0");
+
+ return G_SOURCE_REMOVE;
+ }
+
+ static void
+ ensure_display_for_seat (GdmLocalDisplayFactory *factory,
+ const char *seat_id)
+ {
+ int ret;
+ gboolean seat_supports_graphics;
+ gboolean is_seat0;
+- 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;
+ gboolean wayland_enabled = FALSE, xorg_enabled = FALSE;
+ g_autofree gchar *preferred_display_server = NULL;
+- gboolean falling_back;
++ gboolean falling_back = FALSE;
+
+ gdm_settings_direct_get_boolean (GDM_KEY_WAYLAND_ENABLE, &wayland_enabled);
+ gdm_settings_direct_get_boolean (GDM_KEY_XORG_ENABLE, &xorg_enabled);
+
+ preferred_display_server = get_preferred_display_server (factory);
+
+ if (g_strcmp0 (preferred_display_server, "none") == 0) {
+ g_debug ("GdmLocalDisplayFactory: Preferred display server is none, so not creating display");
+ return;
+ }
+
+ ret = sd_seat_can_graphical (seat_id);
+
+ if (ret < 0) {
+ g_critical ("Failed to query CanGraphical information for seat %s", seat_id);
+ return;
+ }
+
+ if (ret == 0) {
+ g_debug ("GdmLocalDisplayFactory: System doesn't currently support graphics");
+ seat_supports_graphics = FALSE;
+ } else {
+ g_debug ("GdmLocalDisplayFactory: System supports graphics");
+ seat_supports_graphics = TRUE;
+ }
+
+ if (g_strcmp0 (seat_id, "seat0") == 0) {
+ 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" : "");
+ } 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
+ * SEAT0_GRAPHICS_CHECK_TIMEOUT seconds. i.e. we simply continue even if
+ * CanGraphical is unset.
+ * This is ugly, but it means we'll come up eventually in some
+ * scenarios where no master device is present.
+ * Note that we'll force an X11 fallback even though there might be
+ * cases where an wayland capable device is present and simply not marked as
+ * master-of-seat. In these cases, this should likely be fixed in the
+ * udev rules.
+ *
+ * At the moment, systemd always sets CanGraphical for non-seat0 seats.
+ * This is because non-seat0 seats are defined by having master-of-seat
+ * set. This means we can avoid the fallback check for non-seat0 seats,
+ * which simplifies the code.
+ */
+ if (is_seat0) {
+ if (!seat_supports_graphics) {
+ if (!factory->seat0_graphics_check_timed_out) {
+ if (factory->seat0_graphics_check_timeout_id == 0) {
+ 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,
+ on_seat0_graphics_check_timeout,
+ factory);
+
+ } else {
+ /* It is not yet time to force X11 fallback. */
+ g_debug ("GdmLocalDisplayFactory: seat0 display requested when there is no graphics support before graphics check timeout.");
+ }
+
+ return;
+ }
+
+ g_debug ("GdmLocalDisplayFactory: Assuming we can use seat0 for X11 even though system says it doesn't support graphics!");
+ 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 = "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);
+ }
+ }
+
+ if (!seat_supports_graphics)
+ return;
+
+- 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);
+
+ store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
+
+ if (is_seat0)
+ display = gdm_display_store_find (store, lookup_prepared_display_by_seat_id, (gpointer) seat_id);
+ else
+ display = gdm_display_store_find (store, lookup_by_seat_id, (gpointer) seat_id);
+
+ /* Ensure we don't create the same display more than once */
+ if (display != NULL) {
+ g_debug ("GdmLocalDisplayFactory: display already created");
+ return;
+ }
+
+ /* If we already have a login window, switch to it */
+ if (gdm_get_login_window_session_id (seat_id, &login_session_id)) {
+ GdmDisplay *display;
+
+ display = gdm_display_store_find (store,
+ lookup_by_session_id,
+ (gpointer) login_session_id);
+ if (display != NULL &&
+ (gdm_display_get_status (display) == GDM_DISPLAY_MANAGED ||
+ gdm_display_get_status (display) == GDM_DISPLAY_WAITING_TO_FINISH)) {
+ g_object_set (G_OBJECT (display), "status", GDM_DISPLAY_MANAGED, NULL);
+ g_debug ("GdmLocalDisplayFactory: session %s found, activating.",
+ login_session_id);
+ gdm_activate_session_by_id (factory->connection, seat_id, login_session_id);
+ return;
+ }
+ }
+
+ g_debug ("GdmLocalDisplayFactory: Adding display on seat %s", seat_id);
+
+ #ifdef ENABLE_USER_DISPLAY_SERVER
+ 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);
+ g_object_set (display, "is-initial", is_seat0, NULL);
+
+ store_display (factory, display);
+
+ /* let store own the ref */
+ g_object_unref (display);
+
+ if (! gdm_display_manage (display)) {
+ gdm_display_unmanage (display);
+ }
+
+ return;
+ }
+
+ static void
+ delete_display (GdmLocalDisplayFactory *factory,
+ const char *seat_id) {
+
+ GdmDisplayStore *store;
+
+ g_debug ("GdmLocalDisplayFactory: Removing used_display_numbers on seat %s", seat_id);
+
+ store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
+ gdm_display_store_foreach_remove (store, lookup_by_seat_id, (gpointer) seat_id);
+ }
+
+ static gboolean
+--
+2.34.1
+
diff --git a/0004-data-Use-latest-upstream-udev-rules.patch b/0004-data-Use-latest-upstream-udev-rules.patch
new file mode 100644
index 0000000..fca1f4a
--- /dev/null
+++ b/0004-data-Use-latest-upstream-udev-rules.patch
@@ -0,0 +1,149 @@
+From 0131864b339dc0cc5f23def75e6caa5872c9ed11 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Mon, 7 Mar 2022 10:16:39 -0500
+Subject: [PATCH 4/4] data: Use latest upstream udev rules
+
+This pulls in the latest udev rule from upstream that gives us
+wayland on nvidia when we can, and disables wayland on nvidia
+when we should.
+
+It also pulls in the latest handling for passthrough gpus.
+---
+ data/61-gdm.rules.in | 139 +++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 135 insertions(+), 4 deletions(-)
+
+diff --git a/data/61-gdm.rules.in b/data/61-gdm.rules.in
+index b1da191f..5dae00ea 100644
+--- a/data/61-gdm.rules.in
++++ b/data/61-gdm.rules.in
+@@ -1,6 +1,123 @@
++# identify virtio graphics cards to find passthrough setups
++SUBSYSTEM!="virtio", GOTO="gdm_virtio_device_end"
++ACTION!="add", GOTO="gdm_virtio_device_end"
++ATTR{vendor}=="0x1af4", ATTR{device}=="0x0010", RUN+="/usr/bin/touch /run/udev/gdm-machine-has-virtual-gpu", ENV{GDM_MACHINE_HAS_VIRTUAL_GPU}="1", GOTO="gdm_virtio_device_end"
++LABEL="gdm_virtio_device_end"
++
++SUBSYSTEM!="pci", GOTO="gdm_pci_device_end"
++ACTION!="bind", ACTION!="add", GOTO="gdm_pci_device_end"
++
++# identify virtio graphics cards to find passthrough setups
++# cirrus
++ATTR{vendor}=="0x1013", ATTR{device}=="0x00b8", ATTR{subsystem_vendor}=="0x1af4", ATTR{subsystem_device}=="0x1100", RUN+="/usr/bin/touch /run/udev/gdm-machine-has-virtual-gpu", ENV{GDM_MACHINE_HAS_VIRTUAL_GPU}="1", GOTO="gdm_pci_device_end"
++# vga
++ATTR{vendor}=="0x1b36", ATTR{device}=="0x0100", RUN+="/usr/bin/touch /run/udev/gdm-machine-has-virtual-gpu", ENV{GDM_MACHINE_HAS_VIRTUAL_GPU}="1", GOTO="gdm_pci_device_end"
++# qxl
++ATTR{vendor}=="0x1234", ATTR{device}=="0x1111", RUN+="/usr/bin/touch /run/udev/gdm-machine-has-virtual-gpu", ENV{GDM_MACHINE_HAS_VIRTUAL_GPU}="1", GOTO="gdm_pci_device_end"
++
+ # 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
+-DRIVER=="nvidia", RUN+="@libexecdir@/gdm-runtime-config set daemon WaylandEnable false"
++ATTR{vendor}=="0x19e5", ATTR{device}=="0x1711", GOTO="gdm_disable_wayland"
++
++LABEL="gdm_pci_device_end"
++
+ # disable Wayland if modesetting is disabled
+-IMPORT{cmdline}="nomodeset", RUN+="@libexecdir@/gdm-runtime-config set daemon WaylandEnable false"
++KERNEL!="card[0-9]*", GOTO="gdm_nomodeset_end"
++SUBSYSTEM!="drm", GOTO="gdm_nomodeset_end"
++IMPORT{parent}="GDM_MACHINE_HAS_VIRTUAL_GPU"
++ENV{GDM_MACHINE_HAS_VIRTUAL_GPU}!="1", RUN+="/usr/bin/touch /run/udev/gdm-machine-has-hardware-gpu"
++# but keep it enabled for simple framebuffer drivers
++DRIVERS=="simple-framebuffer", GOTO="gdm_nomodeset_end"
++IMPORT{cmdline}="nomodeset", GOTO="gdm_disable_wayland"
++LABEL="gdm_nomodeset_end"
++
++# The vendor nvidia driver has multiple modules that need to be loaded before GDM can make an
++# informed choice on which way to proceed, so force GDM to wait until NVidia's modules are
++# loaded before starting up.
++KERNEL!="nvidia", GOTO="gdm_nvidia_end"
++SUBSYSTEM!="module", GOTO="gdm_nvidia_end"
++ACTION!="add", GOTO="gdm_nvidia_end"
++RUN+="/usr/bin/touch /run/udev/gdm-machine-has-vendor-nvidia-driver"
++
++# Check if suspend/resume services necessary for working wayland support is available
++TEST{0711}!="/usr/bin/nvidia-sleep.sh", GOTO="gdm_disable_wayland"
++TEST{0711}!="/usr/lib/systemd/system-sleep/nvidia", GOTO="gdm_disable_wayland"
++IMPORT{program}="/bin/sh -c \"sed -e 's/: /=/g' -e 's/\([^[:upper:]]\)\([[:upper:]]\)/\1_\2/g' -e 's/[[:lower:]]/\U&/g' -e 's/^/NVIDIA_/' /proc/driver/nvidia/params\""
++ENV{NVIDIA_PRESERVE_VIDEO_MEMORY_ALLOCATIONS}!="1", GOTO="gdm_disable_wayland"
++IMPORT{program}="/bin/sh -c 'echo NVIDIA_HIBERNATE=`systemctl is-enabled nvidia-hibernate`'"
++ENV{NVIDIA_HIBERNATE}!="enabled", GOTO="gdm_disable_wayland"
++IMPORT{program}="/bin/sh -c 'echo NVIDIA_RESUME=`systemctl is-enabled nvidia-resume`'"
++ENV{NVIDIA_RESUME}!="enabled", GOTO="gdm_disable_wayland"
++IMPORT{program}="/bin/sh -c 'echo NVIDIA_SUSPEND=`systemctl is-enabled nvidia-suspend`'"
++ENV{NVIDIA_SUSPEND}!="enabled", GOTO="gdm_disable_wayland"
++LABEL="gdm_nvidia_end"
++
++# If this machine has an internal panel, take note, since it's probably a laptop
++# FIXME: It could be "ghost connectors" make this pop positive for some workstations
++# in the wild. If so, we may have to fallback to looking at the chassis type from
++# dmi data or acpi
++KERNEL!="card[0-9]-eDP-*", GOTO="gdm_laptop_check_end"
++SUBSYSTEM!="drm", GOTO="gdm_laptop_check_end"
++ACTION!="add", GOTO="gdm_laptop_check_end"
++RUN+="/usr/bin/touch /run/udev/gdm-machine-is-laptop"
++GOTO="gdm_hybrid_nvidia_laptop_check"
++LABEL="gdm_laptop_check_end"
++
++# If this is a hybrid graphics setup, take note
++KERNEL!="card[1-9]*", GOTO="gdm_hybrid_graphics_check_end"
++KERNEL=="card[1-9]-*", GOTO="gdm_hybrid_graphics_check_end"
++SUBSYSTEM!="drm", GOTO="gdm_hybrid_graphics_check_end"
++ACTION!="add", GOTO="gdm_hybrid_graphics_check_end"
++RUN+="/usr/bin/touch /run/udev/gdm-machine-has-hybrid-graphics"
++LABEL="gdm_hybrid_graphics_check_end"
++
++# If this is a hybrid graphics laptop with vendor nvidia driver, disable wayland
++LABEL="gdm_hybrid_nvidia_laptop_check"
++TEST!="/run/udev/gdm-machine-is-laptop", GOTO="gdm_hybrid_nvidia_laptop_check_end"
++TEST!="/run/udev/gdm-machine-has-hybrid-graphics", GOTO="gdm_hybrid_nvidia_laptop_check_end"
++TEST!="/run/udev/gdm-machine-has-vendor-nvidia-driver", GOTO="gdm_hybrid_nvidia_laptop_check_end"
++GOTO="gdm_disable_wayland"
++LABEL="gdm_hybrid_nvidia_laptop_check_end"
++
++# Disable wayland in situation where we're in a guest with a virtual gpu and host passthrough gpu
++LABEL="gdm_virt_passthrough_check"
++TEST!="/run/udev/gdm-machine-has-hybrid-graphics", GOTO="gdm_virt_passthrough_check_end"
++TEST!="/run/udev/gdm-machine-has-virtual-gpu", GOTO="gdm_virt_passthrough_check_end"
++TEST!="/run/udev/gdm-machine-has-hardware-gpu", GOTO="gdm_virt_passthrough_check_end"
++GOTO="gdm_disable_wayland"
++LABEL="gdm_virt_passthrough_check_end"
++
++# Disable wayland when there are multiple virtual gpus
++LABEL="gdm_virt_multi_gpu_check"
++TEST!="/run/udev/gdm-machine-has-hybrid-graphics", GOTO="gdm_virt_multi_gpu_check_end"
++TEST!="/run/udev/gdm-machine-has-virtual-gpu", GOTO="gdm_virt_multi_gpu_check_end"
++TEST=="/run/udev/gdm-machine-has-hardware-gpu", GOTO="gdm_virt_multi_gpu_check_end"
++LABEL="gdm_virt_multi_gpu_check_end"
++
++# Disable wayland when nvidia modeset is disabled or when drivers are a lower
++# version than 470,
++# For versions above 470 but lower than 510 prefer Xorg,
++# Above 510, prefer Wayland.
++KERNEL!="nvidia_drm", GOTO="gdm_nvidia_drm_end"
++SUBSYSTEM!="module", GOTO="gdm_nvidia_drm_end"
++ACTION!="add", GOTO="gdm_nvidia_drm_end"
++# disable wayland if nvidia-drm modeset is not enabled
++ATTR{parameters/modeset}!="Y", GOTO="gdm_disable_wayland"
++# disable wayland for nvidia drivers versions lower than 470
++ATTR{version}=="4[0-6][0-9].*|[0-3][0-9][0-9].*|[0-9][0-9].*|[0-9].*", GOTO="gdm_disable_wayland"
++# For nvidia drivers versions Above 510, keep Wayland by default
++ATTR{version}=="[5-9][1-9][0-9].*", GOTO="gdm_end"
++# For nvidia drivers versions 470-495, prefer Xorg by default
++GOTO="gdm_prefer_xorg"
++LABEL="gdm_nvidia_drm_end"
++
++GOTO="gdm_end"
++
++LABEL="gdm_prefer_xorg"
++RUN+="@libexecdir@/gdm-runtime-config set daemon PreferredDisplayServer xorg"
++GOTO="gdm_end"
++
++LABEL="gdm_disable_wayland"
++RUN+="@libexecdir@/gdm-runtime-config set daemon WaylandEnable false"
++GOTO="gdm_end"
++
++LABEL="gdm_end"
+--
+2.34.1
+
diff --git a/0005-local-display-factory-Don-t-crash-if-Xorg-and-Waylan.patch b/0005-local-display-factory-Don-t-crash-if-Xorg-and-Waylan.patch
new file mode 100644
index 0000000..800ed00
--- /dev/null
+++ b/0005-local-display-factory-Don-t-crash-if-Xorg-and-Waylan.patch
@@ -0,0 +1,96 @@
+From 0e467e3fb32d9e2a7499069699527638eb2c2be1 Mon Sep 17 00:00:00 2001
+From: Ray Strode <rstrode@redhat.com>
+Date: Thu, 7 Oct 2021 15:34:27 -0400
+Subject: [PATCH 5/5] local-display-factory: Don't crash if Xorg and Wayland
+ are both unavailable
+
+At the moment if Wayland doesn't work, the login screen will fall back
+to Xorg, and if Xorg doesn't work the login screen will fall back to
+Wayland.
+
+But if the fall back choice is disabled explicitly, GDM will just crash.
+
+This commit fixes the crash.
+
+Closes: https://gitlab.gnome.org/GNOME/gdm/-/issues/739
+---
+ daemon/gdm-local-display-factory.c | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
+index eba38671..120847f9 100644
+--- a/daemon/gdm-local-display-factory.c
++++ b/daemon/gdm-local-display-factory.c
+@@ -651,62 +651,67 @@ ensure_display_for_seat (GdmLocalDisplayFactory *factory,
+ gdm_settings_direct_get_boolean (GDM_KEY_XORG_ENABLE, &xorg_enabled);
+
+ preferred_display_server = get_preferred_display_server (factory);
+
+ if (g_strcmp0 (preferred_display_server, "none") == 0) {
+ g_debug ("GdmLocalDisplayFactory: Preferred display server is none, so not creating display");
+ return;
+ }
+
+ ret = sd_seat_can_graphical (seat_id);
+
+ if (ret < 0) {
+ g_critical ("Failed to query CanGraphical information for seat %s", seat_id);
+ return;
+ }
+
+ if (ret == 0) {
+ g_debug ("GdmLocalDisplayFactory: System doesn't currently support graphics");
+ seat_supports_graphics = FALSE;
+ } else {
+ g_debug ("GdmLocalDisplayFactory: System supports graphics");
+ seat_supports_graphics = TRUE;
+ }
+
+ if (g_strcmp0 (seat_id, "seat0") == 0) {
+ is_seat0 = TRUE;
+
+ falling_back = factory->num_failures > 0;
+ session_types = gdm_local_display_factory_get_session_types (factory, falling_back);
+
+- g_debug ("GdmLocalDisplayFactory: New displays on seat0 will use %s%s",
+- session_types[0], falling_back? " fallback" : "");
++ if (session_types == NULL) {
++ g_debug ("GdmLocalDisplayFactory: Both Wayland and Xorg are unavailable");
++ seat_supports_graphics = FALSE;
++ } else {
++ g_debug ("GdmLocalDisplayFactory: New displays on seat0 will use %s%s",
++ session_types[0], falling_back? " fallback" : "");
++ }
+ } 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_types = g_strdupv ((char **) legacy_session_types);
+ }
+
+ /* For seat0, we have a fallback logic to still try starting it after
+ * SEAT0_GRAPHICS_CHECK_TIMEOUT seconds. i.e. we simply continue even if
+ * CanGraphical is unset.
+ * This is ugly, but it means we'll come up eventually in some
+ * scenarios where no master device is present.
+ * Note that we'll force an X11 fallback even though there might be
+ * cases where an wayland capable device is present and simply not marked as
+ * master-of-seat. In these cases, this should likely be fixed in the
+ * udev rules.
+ *
+ * At the moment, systemd always sets CanGraphical for non-seat0 seats.
+ * This is because non-seat0 seats are defined by having master-of-seat
+ * set. This means we can avoid the fallback check for non-seat0 seats,
+ * which simplifies the code.
+ */
+ if (is_seat0) {
+ if (!seat_supports_graphics) {
+ if (!factory->seat0_graphics_check_timed_out) {
+ if (factory->seat0_graphics_check_timeout_id == 0) {
+ 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.34.1
+
diff --git a/default.pa-for-gdm b/default.pa-for-gdm
new file mode 100644
index 0000000..145bd31
--- /dev/null
+++ b/default.pa-for-gdm
@@ -0,0 +1,9 @@
+load-module module-device-restore
+load-module module-card-restore
+load-module module-udev-detect
+load-module module-native-protocol-unix
+load-module module-default-device-restore
+load-module module-always-sink
+load-module module-intended-roles
+load-module module-suspend-on-idle
+load-module module-position-event-sounds
diff --git a/gdm-tmpfiles.conf b/gdm-tmpfiles.conf
new file mode 100644
index 0000000..8998e6b
--- /dev/null
+++ b/gdm-tmpfiles.conf
@@ -0,0 +1,7 @@
+# These directories should be automatically created by systemd-tmpfiles(8) during boot
+d /run/gdm 0711 root gdm - -
+d /var/lib/gdm 1770 gdm gdm - -
+d /var/lib/gdm/.config 0700 gdm gdm - -
+d /var/lib/gdm/.config/pulse 0700 gdm gdm - -
+d /var/log/gdm 0711 root gdm - -
+
diff --git a/gdm.spec b/gdm.spec
new file mode 100644
index 0000000..3a58c2a
--- /dev/null
+++ b/gdm.spec
@@ -0,0 +1,3342 @@
+%global _hardened_build 1
+
+%define libauditver 1.0.6
+%define gtk3_version 2.99.2
+%define pam_version 0.99.8.1-11
+%define desktop_file_utils_version 0.2.90
+%define nss_version 3.11.1
+
+%global tarball_version %%(echo %{version} | tr '~' '.')
+
+Name: gdm
+Epoch: 1
+Version: 40.1
+Release: 25%{?dist}
+Summary: The GNOME Display Manager
+
+License: GPLv2+
+URL: https://wiki.gnome.org/Projects/GDM
+Source0: http://download.gnome.org/sources/gdm/40/gdm-%{tarball_version}.tar.xz
+Source1: org.gnome.login-screen.gschema.override
+Source2: gdm-tmpfiles.conf
+
+# moved here from pulseaudio-gdm-hooks-11.1-16
+Source5: default.pa-for-gdm
+
+# Upstream backports
+Patch10001: 0001-local-display-factory-Provide-more-flexibility-for-c.patch
+
+Patch20001: 0001-xdmcp-display-factory-Set-supported-session-types-fo.patch
+Patch20002: 0002-daemon-Don-t-update-session-type-if-no-saved-session.patch
+Patch20003: 0003-daemon-Infer-session-type-from-desktop-file-if-user-.patch
+Patch20004: 0004-daemon-Consolidate-session-type-and-supported-sessio.patch
+Patch20005: 0005-local-display-factory-Don-t-crash-if-Xorg-and-Waylan.patch
+
+Patch30001: 0001-local-display-factory-Don-t-try-to-respawn-displays-.patch
+
+Patch40001: 0001-session-worker-Set-session_vt-0-out-of-pam-uninitial.patch
+
+Patch50001: 0001-meson-Fix-detection-of-Xorg-versions-that-need-liste.patch
+Patch50002: 0002-daemon-Support-X-servers-built-with-Dlisten_tcp-true.patch
+
+Patch60001: 0001-session-settings-Fetch-session-from-user-even-if-use.patch
+
+Patch70001: 0001-manager-Fix-btmp-record-accounting.patch
+
+Patch80002: 0001-session-settings-Explicitly-cache-remote-users.patch
+
+# Latest udev rules and support code
+Patch90001: 0001-local-display-factory-Stall-startup-until-main-graph.patch
+Patch90002: 0002-common-Add-API-to-reload-settings-from-disk.patch
+Patch90003: 0003-common-Reload-settings-when-graphics-initialize.patch
+Patch90004: 0004-data-Use-latest-upstream-udev-rules.patch
+
+Patch100001: 0001-gdm-session-Force-reuse-vt-mode-for-legacy-Xorg-mode.patch
+Patch100002: 0002-local-display-factory-Fix-user-switching-with-legacy.patch
+
+# Non-upstreamable workarounds
+Patch66610001: 0001-data-reap-gdm-sessions-on-shutdown.patch
+
+# Questionable feature to support logging in over multiple XDMCP consoles at the same time
+Patch66620001: 0001-manager-allow-multiple-xdmcp-logins-for-the-same-use.patch
+Patch66620002: 0002-gdm-x-session-run-session-bus-on-non-seat0-seats.patch
+Patch66620003: 0003-session-ensure-login-screen-over-XDMCP-connects-to-i.patch
+
+# Non-upstreamable integration patches
+Patch99910001: 0001-Honor-initial-setup-being-disabled-by-distro-install.patch
+
+Patch99930001: 0001-data-add-system-dconf-databases-to-gdm-profile.patch
+
+Patch99950001: 0001-data-Disable-network-configuration-on-login-screen.patch
+
+
+BuildRequires: accountsservice-devel
+BuildRequires: audit-libs-devel >= %{libauditver}
+BuildRequires: dconf
+BuildRequires: desktop-file-utils >= %{desktop_file_utils_version}
+BuildRequires: gettext-devel
+BuildRequires: git
+BuildRequires: keyutils-libs-devel
+BuildRequires: libXdmcp-devel
+BuildRequires: libattr-devel
+BuildRequires: libdmx-devel
+BuildRequires: meson
+BuildRequires: nss-devel >= %{nss_version}
+BuildRequires: pam-devel >= 0:%{pam_version}
+BuildRequires: pkgconfig(accountsservice) >= 0.6.3
+BuildRequires: pkgconfig(check)
+BuildRequires: pkgconfig(gobject-introspection-1.0)
+BuildRequires: pkgconfig(gtk+-3.0) >= %{gtk3_version}
+BuildRequires: pkgconfig(gudev-1.0)
+BuildRequires: pkgconfig(iso-codes)
+BuildRequires: pkgconfig(libcanberra-gtk3)
+BuildRequires: pkgconfig(libselinux)
+BuildRequires: pkgconfig(libsystemd)
+BuildRequires: pkgconfig(ply-boot-client)
+BuildRequires: pkgconfig(systemd)
+BuildRequires: pkgconfig(x11)
+BuildRequires: pkgconfig(xau)
+BuildRequires: pkgconfig(xorg-server)
+BuildRequires: plymouth-devel
+BuildRequires: systemd
+BuildRequires: systemd-devel
+BuildRequires: which
+BuildRequires: xorg-x11-server-Xorg
+BuildRequires: xorg-x11-server-devel
+BuildRequires: yelp-devel
+BuildRequires: yelp-tools
+
+Requires(pre): /usr/sbin/useradd
+%{?systemd_requires}
+
+Provides: service(graphical-login) = %{name}
+
+Requires: accountsservice
+Requires: audit-libs >= %{libauditver}
+Requires: dconf
+# since we use it, and pam spams the log if the module is missing
+Requires: gnome-keyring-pam
+Requires: gnome-session
+Requires: gnome-session-wayland-session
+Requires: gnome-settings-daemon >= 3.27.90
+Requires: gnome-shell
+Requires: iso-codes
+# We need 1.0.4-5 since it lets us use "localhost" in auth cookies
+Requires: libXau >= 1.0.4-4
+Requires: pam >= 0:%{pam_version}
+Requires: /sbin/nologin
+Requires: setxkbmap
+Requires: systemd >= 186
+Requires: system-logos
+Requires: xhost xmodmap xrdb
+Requires: xorg-x11-xinit
+
+# Until the greeter gets dynamic user support, it can't
+# use a user bus
+Requires: /usr/bin/dbus-run-session
+
+Requires(posttrans): dconf
+
+Provides: gdm-libs%{?_isa} = %{epoch}:%{version}-%{release}
+
+%description
+GDM, the GNOME Display Manager, handles authentication-related backend
+functionality for logging in a user and unlocking the user's session after
+it's been locked. GDM also provides functionality for initiating user-switching,
+so more than one user can be logged in at the same time. It handles
+graphical session registration with the system for both local and remote
+sessions (in the latter case, via the XDMCP protocol). In cases where the
+session doesn't provide it's own display server, GDM can start the display
+server on behalf of the session.
+
+%package devel
+Summary: Development files for gdm
+Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release}
+Requires: gdm-pam-extensions-devel = %{epoch}:%{version}-%{release}
+
+%description devel
+The gdm-devel package contains headers and other
+files needed to build custom greeters.
+
+%package pam-extensions-devel
+Summary: Macros for developing GDM extensions to PAM
+Requires: pam-devel
+
+%description pam-extensions-devel
+The gdm-pam-extensions-devel package contains headers and other
+files that are helpful to PAM modules wishing to support
+GDM specific authentication features.
+
+%prep
+%autosetup -S git -n gdm-%{tarball_version}
+
+%build
+%meson -Dpam-prefix=%{_sysconfdir} \
+ -Drun-dir=/run/gdm \
+ -Dudev-dir=%{_udevrulesdir} \
+ -Ddefault-path=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin \
+ -Dipv6=true \
+ -Dprofiling=true \
+ -Dplymouth=enabled \
+ -Dselinux=enabled
+%meson_build
+
+
+%install
+mkdir -p %{buildroot}%{_sysconfdir}/gdm/Init
+mkdir -p %{buildroot}%{_sysconfdir}/gdm/PreSession
+mkdir -p %{buildroot}%{_sysconfdir}/gdm/PostSession
+
+%meson_install
+
+install -p -m644 -D %{SOURCE2} %{buildroot}%{_tmpfilesdir}/%{name}.conf
+install -p -m644 -D %{SOURCE5} %{buildroot}%{_localstatedir}/lib/gdm/.config/pulse/default.pa
+
+rm -f %{buildroot}%{_sysconfdir}/pam.d/gdm
+
+# add logo to shell greeter
+cp -a %{SOURCE1} %{buildroot}%{_datadir}/glib-2.0/schemas
+
+# docs go elsewhere
+rm -rf %{buildroot}/%{_prefix}/doc
+
+# create log dir
+mkdir -p %{buildroot}/var/log/gdm
+
+(cd %{buildroot}%{_sysconfdir}/gdm; ln -sf ../X11/xinit/Xsession .)
+
+mkdir -p %{buildroot}%{_datadir}/gdm/autostart/LoginWindow
+
+mkdir -p %{buildroot}/run/gdm
+
+mkdir -p %{buildroot}%{_sysconfdir}/dconf/db/gdm.d/locks
+
+%find_lang gdm --with-gnome
+
+%pre
+/usr/sbin/useradd -M -u 42 -d /var/lib/gdm -s /sbin/nologin -r gdm > /dev/null 2>&1
+/usr/sbin/usermod -d /var/lib/gdm -s /sbin/nologin gdm >/dev/null 2>&1
+# ignore errors, as we can't disambiguate between gdm already existed
+# and couldn't create account with the current adduser.
+exit 0
+
+%post
+# if the user already has a config file, then migrate it to the new
+# location; rpm will ensure that old file will be renamed
+
+custom=/etc/gdm/custom.conf
+
+if [ $1 -ge 2 ] ; then
+ if [ -f /usr/share/gdm/config/gdm.conf-custom ]; then
+ oldconffile=/usr/share/gdm/config/gdm.conf-custom
+ elif [ -f /etc/X11/gdm/gdm.conf ]; then
+ oldconffile=/etc/X11/gdm/gdm.conf
+ fi
+
+ # Comment out some entries from the custom config file that may
+ # have changed locations in the update. Also move various
+ # elements to their new locations.
+
+ [ -n "$oldconffile" ] && sed \
+ -e 's@^command=/usr/X11R6/bin/X@#command=/usr/bin/Xorg@' \
+ -e 's@^Xnest=/usr/X11R6/bin/Xnest@#Xnest=/usr/X11R6/bin/Xnest@' \
+ -e 's@^BaseXsession=/etc/X11/xdm/Xsession@#BaseXsession=/etc/X11/xinit/Xsession@' \
+ -e 's@^BaseXsession=/etc/X11/gdm/Xsession@#&@' \
+ -e 's@^BaseXsession=/etc/gdm/Xsession@#&@' \
+ -e 's@^Greeter=/usr/bin/gdmgreeter@#Greeter=/usr/libexec/gdmgreeter@' \
+ -e 's@^RemoteGreeter=/usr/bin/gdmlogin@#RemoteGreeter=/usr/libexec/gdmlogin@' \
+ -e 's@^GraphicalTheme=Bluecurve@#&@' \
+ -e 's@^BackgroundColor=#20305a@#&@' \
+ -e 's@^DefaultPath=/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin@#&@' \
+ -e 's@^RootPath=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin@#&@' \
+ -e 's@^HostImageDir=/usr/share/hosts/@#HostImageDir=/usr/share/pixmaps/faces/@' \
+ -e 's@^LogDir=/var/log/gdm@#&@' \
+ -e 's@^PostLoginScriptDir=/etc/X11/gdm/PostLogin@#&@' \
+ -e 's@^PreLoginScriptDir=/etc/X11/gdm/PreLogin@#&@' \
+ -e 's@^PreSessionScriptDir=/etc/X11/gdm/PreSession@#&@' \
+ -e 's@^PostSessionScriptDir=/etc/X11/gdm/PostSession@#&@' \
+ -e 's@^DisplayInitDir=/var/run/gdm.pid@#&@' \
+ -e 's@^RebootCommand=/sbin/reboot;/sbin/shutdown -r now;/usr/sbin/shutdown -r now;/usr/bin/reboot@#&@' \
+ -e 's@^HaltCommand=/sbin/poweroff;/sbin/shutdown -h now;/usr/sbin/shutdown -h now;/usr/bin/poweroff@#&@' \
+ -e 's@^ServAuthDir=/var/gdm@#&@' \
+ -e 's@^Greeter=/usr/bin/gdmlogin@Greeter=/usr/libexec/gdmlogin@' \
+ -e 's@^RemoteGreeter=/usr/bin/gdmgreeter@RemoteGreeter=/usr/libexec/gdmgreeter@' \
+ $oldconffile > $custom
+fi
+
+if [ $1 -ge 2 -a -f $custom ] && grep -q /etc/X11/gdm $custom ; then
+ sed -i -e 's@/etc/X11/gdm@/etc/gdm@g' $custom
+fi
+
+%systemd_post gdm.service
+
+%preun
+%systemd_preun gdm.service
+
+%postun
+%systemd_postun gdm.service
+
+%posttrans
+dconf update || :
+
+%files -f gdm.lang
+%doc AUTHORS NEWS README.md
+%license COPYING
+%dir %{_sysconfdir}/gdm
+%config(noreplace) %{_sysconfdir}/gdm/custom.conf
+%config %{_sysconfdir}/gdm/Init/*
+%config %{_sysconfdir}/gdm/PostLogin/*
+%config %{_sysconfdir}/gdm/PreSession/*
+%config %{_sysconfdir}/gdm/PostSession/*
+%config %{_sysconfdir}/pam.d/gdm-autologin
+%config %{_sysconfdir}/pam.d/gdm-password
+# not config files
+%{_sysconfdir}/gdm/Xsession
+%{_datadir}/gdm/gdm.schemas
+%{_sysconfdir}/dbus-1/system.d/gdm.conf
+%dir %{_sysconfdir}/gdm/Init
+%dir %{_sysconfdir}/gdm/PreSession
+%dir %{_sysconfdir}/gdm/PostSession
+%dir %{_sysconfdir}/gdm/PostLogin
+%dir %{_sysconfdir}/dconf/db/gdm.d
+%dir %{_sysconfdir}/dconf/db/gdm.d/locks
+%{_datadir}/glib-2.0/schemas/org.gnome.login-screen.gschema.xml
+%{_datadir}/glib-2.0/schemas/org.gnome.login-screen.gschema.override
+%{_libexecdir}/gdm-host-chooser
+%{_libexecdir}/gdm-runtime-config
+%{_libexecdir}/gdm-session-worker
+%{_libexecdir}/gdm-simple-chooser
+%{_libexecdir}/gdm-wayland-session
+%{_libexecdir}/gdm-x-session
+%{_sbindir}/gdm
+%{_bindir}/gdmflexiserver
+%{_bindir}/gdm-screenshot
+%dir %{_datadir}/dconf
+%dir %{_datadir}/dconf/profile
+%{_datadir}/dconf/profile/gdm
+%dir %{_datadir}/gdm/greeter
+%dir %{_datadir}/gdm/greeter/applications
+%{_datadir}/gdm/greeter/applications/*
+%dir %{_datadir}/gdm/greeter/autostart
+%{_datadir}/gdm/greeter/autostart/*
+%{_datadir}/gdm/greeter-dconf-defaults
+%{_datadir}/gdm/locale.alias
+%{_datadir}/gdm/gdb-cmd
+%{_datadir}/gnome-session/sessions/gnome-login.session
+%{_datadir}/polkit-1/rules.d/org.gnome.gdm.rules
+%{_libdir}/girepository-1.0/Gdm-1.0.typelib
+%{_libdir}/security/pam_gdm.so
+%{_libdir}/libgdm*.so*
+%attr(0711, root, gdm) %dir %{_localstatedir}/log/gdm
+%attr(1770, gdm, gdm) %dir %{_localstatedir}/lib/gdm
+%attr(0700, gdm, gdm) %dir %{_localstatedir}/lib/gdm/.config
+%attr(0700, gdm, gdm) %dir %{_localstatedir}/lib/gdm/.config/pulse
+%attr(0600, gdm, gdm) %{_localstatedir}/lib/gdm/.config/pulse/default.pa
+%attr(0711, root, gdm) %dir /run/gdm
+%config %{_sysconfdir}/pam.d/gdm-pin
+%config %{_sysconfdir}/pam.d/gdm-smartcard
+%config %{_sysconfdir}/pam.d/gdm-fingerprint
+%{_sysconfdir}/pam.d/gdm-launch-environment
+%{_udevrulesdir}/61-gdm.rules
+%{_unitdir}/gdm.service
+%dir %{_userunitdir}/gnome-session@gnome-login.target.d/
+%{_userunitdir}/gnome-session@gnome-login.target.d/session.conf
+%{_tmpfilesdir}/%{name}.conf
+
+%files devel
+%dir %{_includedir}/gdm
+%{_includedir}/gdm/*.h
+%exclude %{_includedir}/gdm/gdm-pam-extensions.h
+%dir %{_datadir}/gir-1.0
+%{_datadir}/gir-1.0/Gdm-1.0.gir
+%{_libdir}/pkgconfig/gdm.pc
+
+%files pam-extensions-devel
+%{_includedir}/gdm/gdm-pam-extensions.h
+%{_libdir}/pkgconfig/gdm-pam-extensions.pc
+
+%changelog
+* Wed May 01 2024 Ray Strode <rstrode@redhat.com> - 40.1-25
+- Fix user switching with PreferredDisplayServer=legacy-xorg
+ Related: RHEL-29845
+
+* Tue Jan 16 2024 Andrew Lukoshko <alukoshko@almalinux.org> - 40.1-24
+- Explicitly cache remote users
+ Resolves: RHEL-21791
+
+* Fri Dec 15 2023 Ray Strode <rstrode@redhat.com> - 40.1-23
+- Make /var/log/gdm tmpfiles.d snippet match files manifest
+ to fix installability test
+ Related: RHEL-19410
+
+* Mon Nov 27 2023 Ray Strode <rstrode@redhat.com> - 40.1-22
+- Fix PreferredDisplayServer=legacy-xorg in /etc/gdm/custom.conf
+ Resolves: RHEL-19410
+
+* Fri Jan 27 2023 Ray Strode <rstrode@redhat.com> - 40.1-21
+- Enable IPV6 support
+ Resolves: #2165049
+
+* Wed Jan 18 2023 Ray Strode <rstrode@redhat.com> - 40.1-20
+- Ensure /run/gdm and other gdm directories are created at boot up
+ Resolves: #2047942
+
+* Wed Jan 11 2023 Ray Strode <rstrode@redhat.com> - 40.1-19
+- Re-enable Wayland on aspeed
+ Resolves: #2131203
+
+* Wed Nov 02 2022 Ray Strode <rstrode@redhat.com> - 40.1-18
+- Fix btmp accounting
+ Resolves: #2073275
+
+* Thu Sep 29 2022 Ray Strode <rstrode@redhat.com> - 40.1-17
+- Disable Wayland on aspeed
+ Related: #2097308
+
+* Tue Apr 12 2022 Ray Strode <rstrode@redhat.com> - 40.1-16
+- Reenable Wayland for matrox and aspeed
+ Resolves: #2097308
+
+* Tue Apr 12 2022 Ray Strode <rstrode@redhat.com> - 40.1-15
+- Fix accountsservice user templates
+ Resolves: #2062827
+- Properly force Xorg on matrox cards
+ Related: #2074013
+- Fix typo that prevents the correct session type from being
+ used when user switching.
+ Resolves: #2074014
+
+* Tue Mar 22 2022 Ray Strode <rstrode@redhat.com> - 40.1-14
+- Fix erroneous jump back to login screen on udev events after login
+ Resolves: #2065901
+
+* Mon Mar 07 2022 Ray Strode <rstrode@redhat.com> - 40.1-13
+- Pull in latest udev rules and race fixes for handling
+ udev rules.
+ Related: #2060793
+
+* Tue Feb 22 2022 Ray Strode <rstrode@redhat.com> - 40.1-12
+- More fixes from RHEL 8:
+ - Fix DisallowTCP=false
+ - Fix crash when both wayland and xorg are unavailable
+ Related: #2056931
+
+* Wed Oct 27 2021 Ray Strode <rstrode@redhat.com> - 40.1-11
+- Pull in RHEL 8 patches and drop unused patches
+ Related: #2017859
+
+* Mon Oct 25 2021 Ray Strode <rstrode@redhat.com> - 40.1-10
+- Remove module-rescue-stream from default.pa
+ Resolves: #2017439
+
+* Mon Oct 25 2021 Ray Strode <rstrode@redhat.com> - 40.1-9
+- Synchronize permission and group ownership for log dir between
+ rpm file manifest and daemon expectations.
+ Resolves: #1999586
+
+* Wed Oct 13 2021 Ray Strode <rstrode@redhat.com> - 40.1-8
+- Add latest session type propagation fixes from upstream
+ Related: #2009044
+
+* Mon Aug 23 2021 Ray Strode <rstrode@redhat.com> - 40.1-7
+- Don't use gdm-disable-wayland binary in udev rules.
+ It doesn't exist anymore.
+ Related: #1985099
+
+* Thu Aug 19 2021 Ray Strode <rstrode@redhat.com> - 40.1-6
+- Disable wayland on server chips
+ Resolves: #1963919
+
+* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 1:40.1-5
+- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
+ Related: rhbz#1991688
+
+* Wed Jul 28 2021 Ray Strode <rstrode@redhat.com> - 40.1-4
+- Update to 40.1
+- Allow vendor nvidia users to choose wayland sessions
+ Related: #1985099
+
+* Wed Jun 16 2021 Ray Strode <rstrode@redhat.com> - 40.0-5
+- Ensure gdm dconf db is generated at install time
+ Related: #1972234
+
+* Tue Jun 15 2021 Ray Strode - 1:40.0-4
+- Provide gdm specific dconf sources
+ Related: #1972234
+
+* Thu Apr 15 2021 Mohan Boddu <mboddu@redhat.com> - 1:40.0-2
+- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
+
+* Tue Mar 30 2021 Kalev Lember <klember@redhat.com> - 1:40.0-1
+- Update to 40.0
+- Remove old obsoletes and provides
+
+* Tue Mar 16 2021 Kalev Lember <klember@redhat.com> - 1:40~rc-1
+- Update to 40.rc
+
+* Wed Mar 10 2021 Benjamin Berg <bberg@redhat.com> - 1:40~beta-2
+- Add patch to fix issues with the first login after boot
+ Resolves: #1937308
+
+* Fri Feb 26 2021 Kalev Lember <klember@redhat.com> - 1:40~beta-1
+- Update to 40.beta
+
+* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.38.2.1-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
+
+* Sat Dec 19 2020 Kalev Lember <klember@redhat.com> - 1:3.38.2.1-1
+- Update to 3.38.2.1
+
+* Wed Nov 4 2020 Kalev Lember <klember@redhat.com> - 1:3.38.2-1
+- Update to 3.38.2
+
+* Tue Oct 13 2020 Ray Strode <rstrode@redhat.com> - 3.38.1-1
+- Update to 3.38.1
+
+* Sat Sep 12 2020 Kalev Lember <klember@redhat.com> - 1:3.38.0-1
+- Update to 3.38.0
+
+* Tue Sep 08 2020 Dan Horák <dan[at]danny.cz> - 3.37.90-2
+- Remove stale and unnecessary architecture-specific exceptions
+
+* Mon Aug 17 2020 Kalev Lember <klember@redhat.com> - 1:3.37.90-1
+- Update to 3.37.90
+
+* Sat Aug 01 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.37.3-4
+- Second attempt - Rebuilt for
+ https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
+
+* Tue Jul 28 2020 Adam Jackson <ajax@redhat.com> - 3.37.3-3
+- Requires xhost xmodmap xrdb, not xorg-x11-server-utils
+
+* Mon Jul 27 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.37.3-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
+
+* Mon Jul 20 2020 Ray Strode <rstrode@redhat.com> - 3.37.3-1
+- Update to 3.37.3
+- Kills login screen after login on Xorg systems
+- Fixes user switching bug
+ Resolves: #1829079
+
+* Tue May 05 2020 Ray Strode <rstrode@redhat.com> - 3.37.1-2
+- Make sure users have dbus-run-session installed since
+ the greeter depends on it.
+
+* Mon May 04 2020 Ray Strode <rstrode@redhat.com> - 3.37.1-1
+- Update to 3.37.1
+
+* Tue Apr 07 2020 Ray Strode <rstrode@redhat.com> - 3.34.1-3
+- Fix autologin when gdm is started from VT other than VT 1
+
+* Tue Jan 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.34.1-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
+
+* Mon Oct 07 2019 Kalev Lember <klember@redhat.com> - 1:3.34.1-1
+- Update to 3.34.1
+
+* Wed Sep 25 2019 Benjamin Berg <bberg@redhat.com> - 1:3.34.0-2
+- Add patch to fix fast user switching
+ https://gitlab.gnome.org/GNOME/gdm/merge_requests/86
+- Resolves: #1751673
+
+* Wed Sep 11 2019 Kalev Lember <klember@redhat.com> - 1:3.34.0-1
+- Update to 3.34.0
+
+* Wed Sep 04 2019 Kalev Lember <klember@redhat.com> - 1:3.33.92-1
+- Update to 3.33.92
+
+* Wed Sep 04 2019 Benjamin Berg <bberg@redhat.com> - 1:3.33.90-4
+- Add patch to fix environment setup
+ https://gitlab.gnome.org/GNOME/gdm/merge_requests/82
+ See also #1746563
+
+* Mon Aug 26 2019 Adam Williamson <awilliam@redhat.com> - 1:3.33.90-3
+- Drop patch from -2, better fix was applied to systemd
+
+* Thu Aug 22 2019 Adam Williamson <awilliam@redhat.com> - 1:3.33.90-2
+- Revert upstream commit that gives sbin priority in non-root $PATH
+- Resolves: #1744059
+
+* Tue Aug 20 2019 Kalev Lember <klember@redhat.com> - 1:3.33.90-1
+- Update to 3.33.90
+
+* Mon Aug 12 2019 Kalev Lember <klember@redhat.com> - 1:3.33.4-1
+- Update to 3.33.4
+
+* Thu Jul 25 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.32.0-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
+
+* Mon Apr 15 2019 Ray Strode <rstrode@redhat.com> - 1:3.32.0-3
+- avoid wayland if nomodeset is on kernel command line
+ Related: #1691909
+
+* Mon Apr 15 2019 Ray Strode <rstrode@redhat.com> - 1:3.32.0-2
+- Drop CanGraphical patch for now. It's causing problems.
+ Resolves: #1683197
+
+* Wed Mar 13 2019 Kalev Lember <klember@redhat.com> - 1:3.32.0-1
+- Update to 3.32.0
+
+* Wed Feb 27 2019 Ray Strode <rstrode@redhat.com> - 3.31.91-1
+- Update to 3.31.91
+
+* Tue Feb 26 2019 Kalev Lember <klember@redhat.com> - 1:3.30.3-1
+- Update to 3.30.3
+
+* Thu Jan 31 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.30.2-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
+
+* Wed Dec 19 2018 Kalev Lember <klember@redhat.com> - 1:3.30.2-1
+- Update to 3.30.2
+
+* Sat Oct 06 2018 Ray Strode <rstrode@redhat.com> - 1:3.30.1-2
+- Fix login screen for machines that boot to fast
+- Fix autologin crash
+
+* Sat Sep 29 2018 Kalev Lember <klember@redhat.com> - 1:3.30.1-1
+- Update to 3.30.1
+
+* Fri Sep 07 2018 Kalev Lember <klember@redhat.com> - 1:3.30.0-3
+- Rebuilt against fixed atk (#1626575)
+
+* Fri Sep 07 2018 Ray Strode <rstrode@redhat.com> - 3.30.0-2
+- More initial setup fixes
+ Resolves: #1625572
+
+* Tue Sep 04 2018 Ray Strode <rstrode@redhat.com> - 3.30.0-1
+- Update to 3.30.0
+- Fixes initial setup
+ Resolves: #1624534
+
+* Fri Aug 24 2018 Ray Strode <rstrode@redhat.com> - 1:3.29.91-1
+- Update to 3.29.91
+- Fix race at startup
+
+* Mon Aug 13 2018 Kalev Lember <klember@redhat.com> - 1:3.29.90-1
+- Update to 3.29.90
+
+* Fri Jul 13 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.28.2-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
+
+* Thu May 17 2018 Kalev Lember <klember@redhat.com> - 1:3.28.2-1
+- Update to 3.28.2
+
+* Tue Apr 10 2018 Kalev Lember <klember@redhat.com> - 1:3.28.1-1
+- Update to 3.28.1
+
+* Thu Mar 22 2018 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 3.28.0-6
+- Fixup ldconfig in postun
+
+* Wed Mar 21 2018 Kevin Fenzi <kevin@scrye.com> - 3.28.0-5
+- Fix my ldconfig fix to be actually correct.
+
+* Wed Mar 21 2018 Kevin Fenzi <kevin@scrye.com> - 3.28.0-4
+- Fix post/postun calls to ldconfig scriptlet.
+
+* Tue Mar 20 2018 Ray Strode <rstrode@redhat.com> - 1:3.28.0-3
+- Drop /etc/dconf/db/gdm.d from list of dconf sources, that's
+ not longer used.
+ Related: #1546644
+
+* Tue Mar 20 2018 Rex Dieter <rdieter@fedoraproject.org> - 1:3.28.0-2
+- move pulseaudio-gdm-hooks content here
+- use %%ldconfig %%make_build %%make_install %%systemd_requires
+
+* Tue Mar 13 2018 Kalev Lember <klember@redhat.com> - 1:3.28.0-1
+- Update to 3.28.0
+
+* Sun Mar 11 2018 Kalev Lember <klember@redhat.com> - 1:3.27.92-1
+- Update to 3.27.92
+
+* Fri Mar 02 2018 Kalev Lember <klember@redhat.com> - 1:3.27.91-1
+- Update to 3.27.91
+
+* Mon Feb 19 2018 Ray Strode <rstrode@redhat.com>> - 1:3.27.4-4
+- Make sure GDM checks systemd dconf databases
+ Related: #1546644
+
+* Fri Feb 09 2018 Bastien Nocera <bnocera@redhat.com> - 3.27.4-3
++ gdm-3.27.4-4
+- Update for gnome-settings-daemon changes
+
+* Wed Feb 07 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.27.4-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
+
+* Tue Jan 09 2018 Ray Strode <rstrode@redhat.com> - 3.27.4-1
+- Update to 3.27.4
+
+* Sat Jan 06 2018 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 1:3.26.2.1-4
+- Remove obsolete scriptlets
+
+* Thu Nov 30 2017 Ray Strode <rstrode@redhat.com> - 1:3.26.2.1-3
+- Add buildrequires for X server so it knows which -listen
+ variant to use.
+ https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/K2ZPZ43355YKAU66A5TDI3OSFU3U4T3M/
+
+* Wed Nov 15 2017 Ray Strode <rstrode@redhat.com> - 1:3.26.2.1-2
+- Split PAM macros off into a new subpackage
+ Resolves: #1512212
+
+* Wed Nov 01 2017 Kalev Lember <klember@redhat.com> - 1:3.26.2.1-1
+- Update to 3.26.2.1
+
+* Tue Oct 24 2017 Ray Strode <rstrode@redhat.com> - 3.26.1-2
+- make sure initial-setup starts when wayland fails
+ Resolves: #1502827
+
+* Sun Oct 08 2017 Kalev Lember <klember@redhat.com> - 1:3.26.1-1
+- Update to 3.26.1
+
+* Thu Sep 14 2017 Kalev Lember <klember@redhat.com> - 1:3.26.0-1
+- Update to 3.26.0
+
+* Fri Sep 08 2017 Kalev Lember <klember@redhat.com> - 1:3.25.92-1
+- Update to 3.25.92
+
+* Tue Aug 15 2017 Kalev Lember <klember@redhat.com> - 1:3.25.90.1-1
+- Update to 3.25.90.1
+
+* Mon Aug 14 2017 Ville Skyttä <ville.skytta@iki.fi> - 1:3.25.4.1-2
+- Own %%{_datadir}/{dconf,gdm/greeter,gir-1.0} dirs
+
+* Mon Jul 31 2017 Kalev Lember <klember@redhat.com> - 1:3.25.4.1-1
+- Update to 3.25.4.1
+
+* Wed Jul 26 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.25.3-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
+* Sun Jun 25 2017 Kalev Lember <klember@redhat.com> - 1:3.25.3-1
+- Update to 3.25.3
+
+* Wed May 10 2017 Kalev Lember <klember@redhat.com> - 1:3.24.2-1
+- Update to 3.24.2
+
+* Wed Apr 12 2017 Kalev Lember <klember@redhat.com> - 1:3.24.1-1
+- Update to 3.24.1
+
+* Sat Mar 25 2017 Ray Strode <rstrode@redhat.com> - 1:3.24.0-2
+- Fix fallback to X logic
+ Resolves: #1435010
+
+* Tue Mar 21 2017 Kalev Lember <klember@redhat.com> - 1:3.24.0-1
+- Update to 3.24.0
+
+* Fri Mar 17 2017 Kalev Lember <klember@redhat.com> - 1:3.23.92-1
+- Update to 3.23.92
+
+* Mon Mar 06 2017 Kalev Lember <klember@redhat.com> - 1:3.23.91.1-1
+- Update to 3.23.91.1
+
+* Mon Feb 13 2017 Richard Hughes <rhughes@redhat.com> - 1:3.23.4-1
+- Update to 3.23.4
+
+* Fri Feb 10 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.22.1-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
+* Tue Jan 31 2017 Rui Matos <rmatos@redhat.com> - 1:3.22.1-2
+- Honor anaconda's firstboot being disabled
+
+* Wed Oct 12 2016 Kalev Lember <klember@redhat.com> - 1:3.22.1-1
+- Update to 3.22.1
+- Don't set group tags
+
+* Wed Sep 21 2016 Ray Strode <rstrode@redhat.com> - 3.22.0-2
+- Fix log in after log out
+ Resolves: #1373169
+
+* Tue Sep 20 2016 Kalev Lember <klember@redhat.com> - 1:3.22.0-1
+- Update to 3.22.0
+
+* Thu Sep 01 2016 Ray Strode <rstrode@redhat.com> - 1:3.21.91-2
+- Add buildrequire on kernel keyring development headers
+
+* Tue Aug 30 2016 Ray Strode <rstrode@redhat.com> - 1:3.21.91-1
+- Update to 3.21.91
+
+* Tue Aug 30 2016 Ray Strode <rstrode@redhat.com> - 1:3.21.90-2
+- Fix autologin
+
+* Tue Aug 23 2016 Kalev Lember <klember@redhat.com> - 1:3.21.90-1
+- Update to 3.21.90
+
+* Tue Jul 26 2016 Kalev Lember <klember@redhat.com> - 1:3.21.4-1
+- Update to 3.21.4
+
+* Wed Jun 22 2016 Richard Hughes <rhughes@redhat.com> - 1:3.21.3-1
+- Update to 3.21.3
+
+* Thu Apr 21 2016 Kalev Lember <klember@redhat.com> - 1:3.20.1-1
+- Update to 3.20.1
+
+* Tue Mar 22 2016 Kalev Lember <klember@redhat.com> - 1:3.20.0-1
+- Update to 3.20.0
+
+* Tue Mar 15 2016 Kalev Lember <klember@redhat.com> - 1:3.19.92-1
+- Update to 3.19.92
+
+* Fri Mar 04 2016 Kalev Lember <klember@redhat.com> - 1:3.19.91-1
+- Update to 3.19.91
+
+* Thu Feb 18 2016 Richard Hughes <rhughes@redhat.com> - 1:3.19.90-1
+- Update to 3.19.90
+
+* Tue Feb 09 2016 Ray Strode <rstrode@redhat.com> - 3.19.4.1-4
+- More fixes need to get get gnome-terminal, gedit, etc working
+ Resolves: #1281675
+
+* Thu Feb 04 2016 Ray Strode <rstrode@redhat.com> - 3.19.4.1-3
+- Fix gnome-terminal launched in an X session (and gedit etc)
+ Resolves: #1281675
+
+* Wed Feb 03 2016 Fedora Release Engineering <releng@fedoraproject.org> - 1:3.19.4.1-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
+
+* Mon Jan 25 2016 Ray Strode <rstrode@redhat.com> - 3.19.4.1-1
+- Update to 3.19.4.1
+
+* Thu Jan 21 2016 Kalev Lember <klember@redhat.com> 3.19.4-1
+- Update to 3.19.4
+
+* Thu Dec 17 2015 Kalev Lember <klember@redhat.com> 3.19.2-1
+- Update to 3.19.2
+
+* Tue Nov 10 2015 Ray Strode <rstrode@redhat.com> 3.19.2-0.1.20151110gitaf5957ad9
+- Update to git snapshot
+
+* Mon Sep 21 2015 Kalev Lember <klember@redhat.com> - 1:3.18.0-1
+- Update to 3.18.0
+
+* Wed Sep 16 2015 Kalev Lember <klember@redhat.com> 3.17.92-1
+- Update to 3.17.92
+
+* Mon Aug 24 2015 Ray Strode <rstrode@redhat.com> 3.17.90-1
+- Update to 3.17.90
+- Fixes sporadic failure to login and corruption of GDM_LANG
+ environment variable
+
+* Thu Aug 06 2015 Ray Strode <rstrode@redhat.com> 3.17.4-2
+- drop /bin and /sbin from default path
+ They don't make since given /usr merge
+ Resolves: #1251192
+
+* Tue Jul 28 2015 Kalev Lember <klember@redhat.com> - 1:3.17.4-1
+- Update to 3.17.4
+
+* Tue Jun 23 2015 Ray Strode <rstrode@redhat.com> 3.17.3.1-1
+- Update to 3.17.3.1
+
+* Wed Jun 17 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1:3.17.2-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+
+* Wed Jun 03 2015 Ray Strode <rstrode@redhat.com> 3.17.2-1
+- Update to 3.17.2
+
+* Thu Apr 16 2015 Ray Strode <rstrode@redhat.com> 3.16.1.1-1
+- Update to 3.16.1.1
+
+* Thu Apr 16 2015 Kalev Lember <kalevlember@gmail.com> 3.16.1-1
+- Update to 3.16.1
+
+* Tue Apr 07 2015 Ray Strode <rstrode@redhat.com> 3.16.0.1-3
+- Fix permissions on /var/lib/gdm/.local/share
+- Fixes starting Xorg without root on machines that started out
+ as Fedora 15 machines.
+
+* Fri Mar 27 2015 Ray Strode <rstrode@redhat.com> 3.16.0.1-2
+- set XORG_RUN_AS_USER_OK in environment
+
+* Tue Mar 24 2015 Kalev Lember <kalevlember@gmail.com> - 1:3.16.0.1-1
+- Update to 3.16.0.1
+
+* Tue Mar 24 2015 Ray Strode <rstrode@redhat.com> 3.16.0-2
+- actually quit plymouth at startup
+
+* Mon Mar 23 2015 Kalev Lember <kalevlember@gmail.com> - 1:3.16.0-1
+- Update to 3.16.0
+
+* Fri Mar 20 2015 Kalev Lember <kalevlember@gmail.com> - 1:3.15.92-1
+- Update to 3.15.92
+
+* Tue Mar 03 2015 Ray Strode <rstrode@redhat.com> 3.15.91.2-1
+- Update to 3.15.92.2
+- fixes "black screen on logout" of wayland sessions
+
+* Mon Mar 02 2015 Ray Strode <rstrode@redhat.com> 3.15.91.1-1
+- Update to 3.15.91.1
+- fixes deadlock on VT switch in some cases
+
+* Fri Feb 27 2015 Ray Strode <rstrode@redhat.com> 3.15.91-1
+- Update for 3.15.91
+- Reduces flicker
+- Fixes hang for autologin
+ Resolves: #1197224
+- Fixes users that disable root running X in /etc/X11/Xwrapper.conf
+- Fixes intermittent crash at login
+
+* Tue Feb 24 2015 Ray Strode <rstrode@redhat.com> - 1:3.15.90.5-1
+- Update to 3.15.90.5
+- gnome-initial-setup should work again
+ Resolves: #1194948
+- X will work better when configured to not need root
+ (still not perfect though)
+
+* Sun Feb 22 2015 Ray Strode <rstrode@redhat.com> - 1:3.15.90.4-1
+- Update to 3.15.90.4
+- Fixes bus activated X clients
+
+* Sat Feb 21 2015 Ray Strode <rstrode@redhat.com> - 1:3.15.90.3-1
+- Update to 3.15.90.3
+- Disables gnome-initial-setup support for now, which isn't functional
+
+* Fri Feb 20 2015 Ray Strode <rstrode@redhat.com> - 1:3.15.90.2-1
+- Update to 3.15.90.2
+- Fixes "no user list in the middle of my login screen" bug
+- Require gnome-session-wayland-session since we default to wayland now
+
+* Fri Feb 20 2015 David King <amigadave@amigadave.com> - 1:3.15.90.1-1
+- Update to 3.15.90.1
+- Use license macro for COPYING
+- Use pkgconfig for BuildRequires
+- Update URL
+
+* Thu Feb 19 2015 Richard Hughes <rhughes@redhat.com> - 1:3.15.90-1
+- Update to 3.15.90
+
+* Fri Jan 23 2015 Ray Strode <rstrode@redhat.com> 3.15.3.1-4
+- Another user switching fix
+ Related: #1184933
+
+* Thu Jan 22 2015 Ray Strode <rstrode@redhat.com> 3.15.3.1-3
+- Fix user switching
+ Resolves: #1184933
+
+* Fri Jan 16 2015 Ray Strode <rstrode@redhat.com> 3.13.91-2
+- Fix pam_ecryptfs. unfortunately adds back gross last login messages.
+ Resolves: #1174366
+
+* Fri Dec 19 2014 Richard Hughes <rhughes@redhat.com> - 1:3.15.3.1-1
+- Update to 3.15.3.1
+
+* Fri Dec 19 2014 Richard Hughes <rhughes@redhat.com> - 1:3.15.3-1
+- Update to 3.15.3
+
+* Tue Nov 25 2014 Kalev Lember <kalevlember@gmail.com> - 1:3.15.2-1
+- Update to 3.15.2
+
+* Tue Oct 14 2014 Kalev Lember <kalevlember@gmail.com> - 1:3.14.1-1
+- Update to 3.14.1
+
+* Mon Sep 22 2014 Kalev Lember <kalevlember@gmail.com> - 1:3.14.0-1
+- Update to 3.14.0
+
+* Wed Sep 17 2014 Kalev Lember <kalevlember@gmail.com> - 1:3.13.92-1
+- Update to 3.13.92
+
+* Wed Sep 03 2014 Kalev Lember <kalevlember@gmail.com> - 1:3.13.91-2
+- Drop last GConf remnants
+
+* Wed Sep 03 2014 Kalev Lember <kalevlember@gmail.com> - 1:3.13.91-1
+- Update to 3.13.91
+
+* Sat Aug 16 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1:3.12.2-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
+
+* Tue Jul 22 2014 Kalev Lember <kalevlember@gmail.com> - 1:3.12.2-3
+- Rebuilt for gobject-introspection 1.41.4
+
+* Sat Jun 07 2014 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1:3.12.2-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
+
+* Fri May 16 2014 Kalev Lember <kalevlember@gmail.com> - 1:3.12.2-1
+- Update to 3.12.2
+
+* Thu May 08 2014 Ray Strode <rstrode@redhat.com> - 1:3.12.1-3
+- Fix PATH
+ Resolves: #1095344
+
+* Wed May 07 2014 Kalev Lember <kalevlember@gmail.com> - 1:3.12.1-2
+- Drop gnome-icon-theme-symbolic dependency
+
+* Wed Apr 16 2014 Kalev Lember <kalevlember@gmail.com> - 1:3.12.1-1
+- Update to 3.12.1
+
+* Sat Apr 05 2014 Kalev Lember <kalevlember@gmail.com> - 1:3.12.0-3
+- Fold -libs into the main gdm package
+
+* Sat Apr 05 2014 Kalev Lember <kalevlember@gmail.com> - 1:3.12.0-2
+- Tighten subpackage deps
+
+* Tue Mar 25 2014 Richard Hughes <rhughes@redhat.com> - 1:3.12.0-1
+- Update to 3.12.0
+
+* Thu Mar 20 2014 Richard Hughes <rhughes@redhat.com> - 1:3.11.92.1-1
+- Update to 3.11.92.1
+
+* Fri Feb 21 2014 Richard Hughes <rhughes@redhat.com> - 1:3.11.90-1
+- Update to 3.11.90
+
+* Wed Jan 15 2014 Richard Hughes <rhughes@redhat.com> - 1:3.11.4-1
+- Update to 3.11.4
+
+* Sun Dec 22 2013 Ville Skyttä <ville.skytta@iki.fi> - 1:3.11.3-2
+- Drop empty TODO from docs, trivial rpmlint fixes.
+
+* Tue Dec 17 2013 Richard Hughes <rhughes@redhat.com> - 1:3.11.3-1
+- Update to 3.11.3
+
+* Tue Nov 19 2013 Richard Hughes <rhughes@redhat.com> - 1:3.11.2-1
+- Update to 3.11.2
+
+* Mon Oct 28 2013 Richard Hughes <rhughes@redhat.com> - 1:3.10.0.1-1
+- Update to 3.10.0.1
+
+* Wed Sep 25 2013 Kalev Lember <kalevlember@gmail.com> - 1:3.10.0-1
+- Update to 3.10.0
+
+* Thu Aug 22 2013 Kalev Lember <kalevlember@gmail.com> - 1:3.9.90-1
+- Update to 3.9.90
+
+* Sat Aug 10 2013 Kalev Lember <kalevlember@gmail.com> - 1:3.9.5-1
+- Update to 3.9.5
+
+* Tue Jul 16 2013 Richard Hughes <rhughes@redhat.com> - 1:3.8.3.1-1
+- Update to 3.8.3.1
+
+* Sat Jun 22 2013 Matthias Clasen <mclasen@redhat.com> - 3.8.3-2
+- Trim %%changelog
+
+* Fri Jun 14 2013 Ray Strode <rstrode@redhat.com> 3.8.3-1
+- Update to 3.8.3
+
+* Tue May 21 2013 Matthias Clasen <mclasen@redhat.com> 1:3.8.1.1-6
+- Don't include the fallback greeter
+
+* Mon May 20 2013 Ray Strode <rstrode@redhat.com> 1:3.8.1.1-5
+- Fix permissions on /run/gdm
+ Resolves: #fudge
+ (http://lists.fedoraproject.org/pipermail/devel/2013-May/182906.html)
+
+* Mon May 20 2013 Ray Strode <rstrode@redhat.com> 1:3.8.1.1-4
+- Require gnome-shell. We no longer use the fallback greeter.
+ (Since gdm 3.7.92).
+
+* Fri May 17 2013 Ray Strode <rstrode@redhat.com> - 1:3.8.1.1-3
+- Build with -fpie
+ Resolves: #955154
+
+* Thu May 16 2013 Florian Müllner <fmuellner@redhat.com> - 1:3.8.1.1-2
+- Update branding
+
+* Wed Apr 17 2013 Richard Hughes <rhughes@redhat.com> - 1:3.8.1.1-1
+- Update to 3.8.1.1
+
+* Mon Apr 15 2013 Kalev Lember <kalevlember@gmail.com> - 1:3.8.1-1
+- Update to 3.8.1
+
+* Mon Apr 01 2013 Kalev Lember <kalevlember@gmail.com> - 1:3.8.0-2
+- Drop the metacity dep now that the fallback greeter is gone
+
+* Tue Mar 26 2013 Kalev Lember <kalevlember@gmail.com> - 1:3.8.0-1
+- Update to 3.8.0
+
+* Thu Mar 21 2013 Kalev Lember <kalevlember@gmail.com> - 1:3.7.92-2
+- Drop the polkit-gnome dep now that the fallback greeter is gone
+
+* Wed Mar 20 2013 Richard Hughes <rhughes@redhat.com> - 1:3.7.92-1
+- Update to 3.7.92
+
+* Wed Mar 6 2013 Matthias Clasen <mclasen@redhat.com> 3.7.91-1
+- Update to 3.7.91
+
+* Wed Feb 27 2013 Ray Strode <rstrode@redhat.com> 3.7.90-3
+- Fix up runtime dir for real
+
+* Tue Feb 26 2013 Ray Strode <rstrode@redhat.com> 3.7.90-2
+- Fix up runtime dir path (spotted by dwalsh)
+
+* Fri Feb 22 2013 Kalev Lember <kalevlember@gmail.com> - 1:3.7.90-1
+- Update to 3.7.90
+
+* Wed Feb 06 2013 Kalev Lember <kalevlember@gmail.com> - 1:3.7.5-1
+- Update to 3.7.5
+
+* Wed Jan 09 2013 Richard Hughes <hughsient@gmail.com> - 1:3.7.3.1-1
+- Update to 3.7.3.1
+
+* Tue Nov 20 2012 Richard Hughes <hughsient@gmail.com> - 1:3.7.2-1
+- Update to 3.7.2
+
+* Tue Nov 20 2012 Matthias Clasen <mclasen@redhat.com> - 1:3.6.2-2
+- Remove patch fuzz of 999
+
+* Wed Nov 14 2012 Kalev Lember <kalevlember@gmail.com> - 1:3.6.2-1
+- Update to 3.6.2
+
+* Mon Nov 05 2012 Ray Strode <rstrode@redhat.com> - 1:3.6.1-4
+- Fix GDM auth cookie problem
+ Related: #870695
+
+* Mon Oct 29 2012 Matthias Clasen <mclasen@redhat.com> - 1:3.6.1-3
+- Add ppc to %%ExcludeArch
+
+* Thu Oct 18 2012 Matthias Clasen <mclasen@redhat.com> - 1:3.6.1-2
+- Require gnome-icon-theme-symbolic (#867718)
+
+* Tue Oct 16 2012 Kalev Lember <kalevlember@gmail.com> - 1:3.6.1-1
+- Update to 3.6.1
+
+* Tue Sep 25 2012 Richard Hughes <hughsient@gmail.com> - 1:3.6.0-1
+- Update to 3.6.0
+
+* Wed Sep 19 2012 Matthias Clasen <mclasen@redhat.com> 1:3.5.92.1-1
+- Update to 3.5.92.1
+
+* Fri Sep 07 2012 Ray Strode <rstrode@redhat.com> 1:3.5.91-2
+- Fix autologin
+- Fix selinux context after forking session
+
+* Thu Sep 06 2012 Richard Hughes <hughsient@gmail.com> - 1:3.5.91-1
+- Update to 3.5.91
+
+* Tue Aug 21 2012 Richard Hughes <hughsient@gmail.com> - 1:3.5.90-1
+- Update to 3.5.90
+
+* Tue Aug 7 2012 Lennart Poettering <lpoetter@redhat.com> - 1:3.5.5-2
+- https://fedoraproject.org/wiki/Features/DisplayManagerRework
+- https://bugzilla.redhat.com/show_bug.cgi?id=846135
+- Ship and use gdm.service
+- Force gdm onto VT1
+
+* Tue Aug 07 2012 Richard Hughes <hughsient@gmail.com> - 1:3.5.5-1
+- Update to 3.5.5
+
+* Fri Jul 27 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1:3.5.4.2-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Thu Jul 19 2012 Ray Strode <rstrode@redhat.com> 3.5.4.2-1
+- Update to 3.5.4.2
+- Fixes non-autologin
+
+* Thu Jul 19 2012 Ray Strode <rstrode@redhat.com> 3.5.4.1-1
+- Update to 3.5.4.1
+- Fixes autologin
+- Fixes logind integration
+- Fixes dconf incompatibility
+
+* Thu Jul 19 2012 Matthias Clasen <mclasen@redhat.com> - 1:3.5.4-3
+- Fix dconf profile syntax
+
+* Thu Jul 19 2012 Kalev Lember <kalevlember@gmail.com> - 1:3.5.4-2
+- Require systemd >= 186 for libsystemd-login
+
+* Tue Jul 17 2012 Richard Hughes <hughsient@gmail.com> - 1:3.5.4-1
+- Update to 3.5.4
+
+* Thu Jun 28 2012 Ray Strode <rstrode@redhat.com> 3.5.2-4
+- Build with plymouth support (woops).
+
+* Wed Jun 13 2012 Ray Strode <rstrode@redhat.com> 3.5.2-3
+- Drop unused spool dir
+ Related: #819254
+
+* Sat Jun 9 2012 Matthias Clasen <mclasen@redhat.com> - 1:3.5.2-2
+- Fix gnome-shell detection
+
+* Thu Jun 07 2012 Richard Hughes <hughsient@gmail.com> - 1:3.5.2-1
+- Update to 3.5.2
+
+* Sat Apr 14 2012 Matthias Clasen <mclasen@redhat.com> - 3.4.1-1
+- Update to 3.4.1
+
+* Mon Apr 09 2012 Ray Strode <rstrode@redhat.com> 3.4.0.1-5
+- One more try at fixing crash
+ Resolves: #810451
+
+* Mon Apr 09 2012 Ray Strode <rstrode@redhat.com> 3.4.0.1-4
+- Fix crash
+ Resolves: #810451
+
+* Thu Apr 5 2012 Matthias Clasen <mclasen@redhat.com> 3.4.0.1-3
+- Make session unlocking after user switching work
+
+* Mon Apr 02 2012 Ray Strode <rstrode@redhat.com> 3.4.0.1-2
+- Move pam_gnome_keyring after XDG_RUNTIME_DIR is setup
+ Resolves: #809152
+
+* Tue Mar 27 2012 Ray Strode <rstrode@redhat.com> 3.4.0.1-1
+- Update to 3.4.0.1
+- fixes autologin
+
+* Tue Mar 27 2012 Richard Hughes <hughsient@gmail.com> - 1:3.4.0-1
+- Update to 3.4.0
+
+* Tue Mar 20 2012 Ray Strode <rstrode@redhat.com> 3.3.92.1-1
+- Update to 3.3.92.1
+
+* Wed Feb 15 2012 Ray Strode <rstrode@redhat.com> 3.2.1.1-14
+- More consolekit registration fixes
+
+* Mon Feb 13 2012 Ray Strode <rstrode@redhat.com> 3.2.1.1-12
+- Restore ConsoleKit registration if ConsoleKit is installed
+
+* Tue Feb 7 2012 Lennart Poettering <lpoetter@redhat.com> - 1:3.2.1.1-11
+- Add multi-seat patch from gdm git master
+
+* Thu Jan 26 2012 Ray Strode <rstrode@redhat.com> 3.2.1.1-10
+- Drop system-icon-theme requirement since we don't depend
+ on it anymore
+
+* Fri Jan 13 2012 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1:3.2.1.1-9
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
+
+* Wed Nov 09 2011 Adam Williamson <awilliam@redhat.com> 1:3.2.1.1-8
+- sync with recent changes on f16 branch:
+ + update to 3.2.1.1
+ + properly set up PAM files
+ + auth fixes
+ + put fallback plugin development files in -devel
+ + require metacity to fix #746693
+ + fix logo in fallback mode - just set it to a Fedora file
+
+* Thu Nov 03 2011 Ray Strode <rstrode@redhat.com> 3.2.1-3
+- Drop fprintd-pam dependency and make Harald's laptop
+ more lean and streamlined.
+
+* Wed Oct 26 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1:3.2.1-2
+- Rebuilt for glibc bug#747377
+
+* Tue Oct 18 2011 Ray Strode <rstrode@redhat.com> 3.2.1-1
+- Update to 3.2.1
+- Move plugins into main package
+
+* Wed Oct 5 2011 Adam Williamson <awilliam@redhat.com> - 1:3.2.0-2
+- shell_check.patch (upstream): re-add check for gnome-shell presence
+ before using it to handle login (RH #743596)
+
+* Wed Sep 28 2011 Ray <rstrode@redhat.com> - 1:3.2.0-1
+- Update to 3.2.0
+
+* Tue Jun 28 2011 Ray Strode <rstrode@redhat.com> 3.1.2-3
+- Disable fatal critcals
+ Resolves: #717324
+
+* Tue Jun 21 2011 Michael Schwendt <mschwendt@fedoraproject.org> - 3.1.2-2
+- Fix /dev/ull typo in scriptlets (#693046).
+
+* Mon Jun 13 2011 Ray Strode <rstrode@redhat.com> 3.1.2-1
+- Update for release
+
+* Mon Jun 06 2011 Ray Strode <rstrode@redhat.com> 3.0.4-1
+- Update to latest version
+ Resolves CVE-2011-1709
+
+* Fri Apr 15 2011 Matthias Clasen <mclasen@redhat.com> - 3.0.0-2
+- Put the Fedora logo back in the greeter
+
+* Mon Apr 4 2011 Matthias Clasen <mclasen@redhat.com> - 3.0.0-1
+- Update to 3.0.0
+
+* Tue Mar 22 2011 Ray Strode <rstrode@redhat.com> 2.91.94-1
+- Update to 2.91.94
+
+* Wed Mar 09 2011 Ray Strode <rstrode@redhat.com> 2.91.93-2
+- Fix autologin crash
+
+* Tue Mar 08 2011 Ray Strode <rstrode@redhat.com> 2.91.93-1
+- Update to 2.91.93
+
+* Tue Feb 22 2011 Ray Strode <rstrode@redhat.com> 2.91.6-11
+- Dropping async code didn't work. The bug was still
+ around. This commit should fix it.
+
+* Fri Feb 18 2011 Ray Strode <rstrode@redhat.com> 2.91.6-10
+- Fix user list async bugs by dropping async code and
+ moving to accounts service library
+ Resolves: #678236
+- Add requires for accounts service to spec since it isn't
+ optional (and hasn't been for a while)
+
+* Thu Feb 17 2011 Ray Strode <rstrode@redhat.com> 2.91.6-9
+- Add back session chooser
+ Resolves: #539638
+
+* Mon Feb 14 2011 Ray Strode <rstrode@redhat.com> 2.91.6-8
+- Do build with pam stack changes need to get ecryptfs
+ working.
+ Resolves: #665061
+
+* Mon Feb 14 2011 Ray Strode <rstrode@redhat.com> 2.91.6-7
+- Fix crasher and rendering glitches
+ Resolves: #674978
+
+* Fri Feb 11 2011 Matthias Clasen <mclasen@redhat.com> - 2.91.6-6
+- Rebuild against newer gtk
+
+* Wed Feb 09 2011 Christopher Aillon <caillon@redhat.com> - 2.91.6-5
+- Drop the requires on plymouth-gdm-hooks since it no longer exists
+
+* Tue Feb 08 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1:2.91.6-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
+
+* Mon Feb 07 2011 Bastien Nocera <bnocera@redhat.com> 2.91.6-3
+- Really disable gnome-settings-daemon plugins in the greeter
+
+* Fri Feb 04 2011 Ray Strode <rstrode@redhat.com> 2.91.6-2
+- Drop some unimportant patches
+- Attempt to fix bug 674978 (theme related crash)
+
+* Wed Feb 02 2011 Ray Strode <rstrode@redhat.com> 2.91.6-1
+- Update to 2.91.6
+
+* Sat Jan 29 2011 Ville Skyttä <ville.skytta@iki.fi> - 1:2.91.4-6
+- Dir ownership fixes.
+
+* Wed Jan 19 2011 Ray Strode <rstrode@redhat.com> 2.91.4-5
+- Fix swapped LHS and RHS in more-aggressive-about-loading-icons
+ patch
+
+* Wed Jan 19 2011 Ray Strode <rstrode@redhat.com> 2.91.4-4
+- Update previous patch to handle NULL better
+
+* Wed Jan 19 2011 Ray Strode <rstrode@redhat.com> 2.91.4-3
+- Fix icon ref counting issue
+
+* Wed Jan 19 2011 Ray Strode <rstrode@redhat.com> 2.91.4-2
+- Be more aggresive about loading icons
+ (right now we fail, which combined with fatal criticals
+ gives us crashes)
+
+* Fri Dec 17 2010 Ray Strode <rstrode@redhat.com> 2.91.4-1
+- Update to 2.91.4
+
+* Wed Dec 15 2010 Christopher Aillon <caillon@redhat.com> 2.32.0-4
+- Add maybe-set-is-loaded.patch to ensure we end up with a loaded user
+
+* Wed Dec 01 2010 Peter Hutterer <peter.hutterer@redhat.com> 1:2.32.0-3
+- plymouth.patch: xserver 1.10 takes "-background none" root argument
+ instead of the fedora-specific "-nr".
+- Add missing BuildRequires for dbus-glib-devel
+
+* Mon Nov 15 2010 Dan Williams <dcbw@redhat.com> 2.32.0-2
+- Fix upower build requirement
+
+* Wed Sep 29 2010 Ray Strode <rstrode@redhat.com> 2.32.0-1
+- Update to 2.32.0
+
+* Tue Aug 17 2010 Ray Strode <rstrode@redhat.com> 2.31.90-1
+- Update to 2.31.90
+
+* Wed Jun 16 2010 Matthias Clasen <mclasen@redhat.com> 2.30.2-3
+- Kill explicit library deps
+
+* Tue Apr 27 2010 Ray Strode <rstrode@redhat.com> 2.30.2-2
+- Update multistack patch
+- Add accounts service patch
+- Update plymouth patch
+
+* Tue Apr 27 2010 Matthias Clasen <mclasen@redhat.com> 2.30.2-1
+- Update to 2.30.2
+- Spec file cleanups
+
+* Tue Apr 06 2010 Ray Strode <rstrode@redhat.com> 2.30.0-2
+- Update plymouth patch to work with 0.8.1
+
+* Mon Mar 29 2010 Matthias Clasen <mclasen@redhat.com> 2.30.0-1
+- Update to 2.30.0
+
+* Wed Mar 24 2010 Matthias Clasen <mclasen@redhat.com> 2.29.92-4
+- Drop hal dependency
+
+* Tue Mar 09 2010 Ray Strode <rstrode@redhat.com> 2.29.92-3
+- Drop Prereq in favor of Requires(pre)
+
+* Tue Mar 09 2010 Ray Strode <rstrode@redhat.com> 2.29.92-2
+- Rebase multistack patch
+
+* Tue Mar 09 2010 Bastien Nocera <bnocera@redhat.com> 2.29.92-1
+- Update to 2.29.92
+
+* Thu Feb 11 2010 Matthias Clasen <mclasen@redhat.com> 2.29.6-1
+- Update to 2.29.6
+
+* Thu Jan 28 2010 Ray Strode <rstrode@redhat.com> 2.29.5-2
+- name graphical-login vprovides (bug 559268)
+
+* Tue Jan 26 2010 Ray Strode <rstrode@redhat.com> 2.29.5-1
+- Update to 2.29.5
+
+* Sun Jan 17 2010 Matthias Clasen <mclasen@redhat.com> - 2.29.4-3
+- Rebuild
+
+* Thu Jan 14 2010 Ray Strode <rstrode@redhat.com> 2.29.4-2
+- Fix boot
+
+* Tue Dec 22 2009 Matthias Clasen <mclasen@redhat.com> - 2.29.4-1
+- Update to 2.29.4
+
+* Wed Dec 09 2009 Ray Strode <rstrode@redhat.com> 2.29.1-3
+- Update to work better with latest plymouth
+
+* Thu Dec 03 2009 Ray Strode <rstrode@redhat.com> 2.29.1-2
+- Drop upstreamed patches
+- rebase multi-stack patch
+
+* Tue Dec 01 2009 Bastien Nocera <bnocera@redhat.com> 2.29.1-1
+- Update to 2.29.1
+
+* Sat Oct 31 2009 Matthias Clasen <mclasen@redhat.com> 2.28.1-20
+- Don't show 'Lock Screen' in the user switcher if locked down
+
+* Sat Oct 31 2009 Matthias Clasen <mclasen@redhat.com> 2.28.1-18
+- Actually set up statusicon padding
+
+* Fri Oct 30 2009 Ray Strode <rstrode@redhat.com> 2.28.1-17
+- Make the user list slide animation smoother
+
+* Thu Oct 29 2009 Ray Strode <rstrode@redhat.com> 2.28.1-16
+- Shrink autologin timer
+- Make language dialog not double spaced
+
+* Thu Oct 29 2009 Ray Strode <rstrode@redhat.com> 2.28.1-15
+- Don't show fingerprint task button unless fingerprint is
+ enabled
+- Don't show smartcard task button and list item unless
+ pcscd is running.
+
+* Wed Oct 28 2009 Ray Strode <rstrode@redhat.com> 2.28.1-14
+- Don't show image on login button
+
+* Wed Oct 28 2009 Ray Strode <rstrode@redhat.com> 2.28.1-13
+- Fix double free during user switching (might address
+ bug 512944)
+
+* Tue Oct 27 2009 Ray Strode <rstrode@redhat.com> 2.28.1-12
+- One more go at bug 527920
+
+* Tue Oct 27 2009 Ray Strode <rstrode@redhat.com> 2.28.1-11
+- Tighten permissions on /var/run/gdm (bug 531063)
+
+* Mon Oct 26 2009 Ray Strode <rstrode@redhat.com> 2.28.1-10
+- Position shutdown menu properly on multihead machines
+
+* Fri Oct 23 2009 Ray Strode <rstrode@redhat.com> 2.28.1-9
+- Don't show hostname by default if it's localhost
+
+* Fri Oct 23 2009 Ray Strode <rstrode@redhat.com> 2.28.1-8
+- Attempt to fix crash some users see.
+- Clean up rebase
+
+* Fri Oct 23 2009 Ray Strode <rstrode@redhat.com> 2.28.1-7
+- Show Other user even when there are no other users
+ (bug 527920)
+
+* Fri Oct 23 2009 Ray Strode <rstrode@redhat.com> 2.28.1-6
+- Properly read default keyboard layout (bug 530452)
+
+* Fri Oct 23 2009 Ray Strode <rstrode@redhat.com> 2.28.1-5
+- Remove tool tip from login button
+
+* Thu Oct 22 2009 Ray Strode <rstrode@redhat.com> 2.28.1-4
+- Fix autologin window spasms
+- Fix autologin timer animation
+- Make autologin and multistack play better together
+- Add padding to notification tray
+
+* Wed Oct 21 2009 Ray Strode <rstrode@redhat.com> 2.28.1-3
+- Move date from panel to clock tooltip
+
+* Tue Oct 20 2009 Ray Strode <rstrode@redhat.com> 2.28.1-2
+- Move shutdown functions to panel from login window
+
+* Tue Oct 20 2009 Ray Strode <rstrode@redhat.com> 2.28.1-1
+- Update to 2.28.1
+
+* Fri Oct 09 2009 Ray Strode <rstrode@redhat.com> 2.28.0-9
+- Fix Other... user.
+
+* Fri Oct 9 2009 Matthias Clasen <mclasen@redhat.com> - 1:2.28.0-8
+- Move bubbles to the lower right on the login screen
+
+* Wed Oct 07 2009 Ray Strode <rstrode@redhat.com> - 1:2.28.0-7
+- Fix gdm-password / xguest interaction (bug 524421)
+
+* Mon Oct 5 2009 Matthias Clasen <mclasen@redhat.com> - 1:2.28.4-6
+- Fix the autostart file for at-spi-registryd
+
+* Thu Oct 1 2009 Matthias Clasen <mclasen@redhat.com> - 1:2.28.4-5
+- Handle keyboard layout variants
+
+* Mon Sep 28 2009 Ray Strode <rstrode@redhat.com> - 1:2.28.0-4
+- Add cache dir to package manifest
+
+* Mon Sep 28 2009 Richard Hughes <rhughes@redhat.com> - 1:2.28.0-3
+- Add a patch to use DeviceKit-power rather than the removed methods in
+ gnome-power-manager.
+
+* Fri Sep 25 2009 Ray Strode <rstrode@redhat.com> 1:2.28.0-2
+- Fix autologin
+
+* Wed Sep 23 2009 Matthias Clasen <mclasen@redhat.com> 1:2.28.0-1
+- Update to 2.28.0
+
+* Sat Aug 29 2009 Caolán McNamara <caolanm@redhat.com> 1:2.27.90-2
+- rebuild with new audit
+
+* Mon Aug 24 2009 Ray Strode <rstrode@redhat.com> 1:2.27.90-1
+- update to 2.27.90
+
+* Fri Aug 21 2009 Tomas Mraz <tmraz@redhat.com> - 1:2.27.4-7
+- rebuilt with new audit
+
+* Wed Aug 19 2009 Lennart Poettering <lpoetter@redhat.com> 1:2.27.4-6
+- Add pulseaudio-gdm-hooks to dependencies
+
+* Thu Aug 06 2009 Ray Strode <rstrode@redhat.com> 1:2.27.4-5
+- rebuild
+
+* Sat Aug 1 2009 Matthias Clasen <mclasen@redhat.com> 1:2.27.4-4
+- Drop unneeded direct deps
+
+* Fri Jul 24 2009 Ray Strode <rstrode@redhat.com> 1:2.27.4-3
+- Fix delay during login
+
+* Mon Jul 20 2009 Ray Strode <rstrode@redhat.com> 1:2.27.4-2
+- Use correct multi-stack patch
+
+* Mon Jul 20 2009 Ray Strode <rstrode@redhat.com> 1:2.27.4-1
+- Update to 2.27.4
+
+* Thu Jul 02 2009 Adam Jackson <ajax@redhat.com> 1:2.26.1-13
+- Requires: xorg-x11-xkb-utils -> Requires: setxkbmap
+
+* Wed Jul 01 2009 Ray Strode <rstrode@redhat.com> - 1:2.26.1-12
+- Drop defunct arch conditional buildrequires
+
+* Tue Jun 30 2009 Matthias Clasen <mclasen@redhat.com> - 1:2.26.1-11
+- Rebuild against new libxklavier
+
+* Fri Jun 12 2009 Matthias Clasen <mclasen@redhat.com> - 1:2.26.1-10
+- Bump rev to fix upgrade path
+
+* Tue Jun 9 2009 Matthias Clasen <mclasen@redhat.com> - 1:2.26.1-8
+- Port to PolicyKit 1
+
+* Wed Jun 03 2009 Ray Strode <rstrode@redhat.com> - 1:2.26.1-5
+- Fix language parsing code (bug 502778)
+
+* Mon Apr 27 2009 Matthias Clasen <mclasen@redhat.com> - 1:2.26.1-4
+- Don't drop schemas translations from po files
+
+* Fri Apr 24 2009 Ray Strode <rstrode@redhat.com> - 1:2.26.1-3
+- Add Requires for pam modules in plugins
+
+* Tue Apr 21 2009 Ray Strode <rstrode@redhat.com> - 1:2.26.1-2
+- Stop inactive pam conversations when one succeeds.
+ Should fix bug 496234
+
+* Tue Apr 14 2009 Ray Strode <rstrode@redhat.com> - 1:2.26.1-1
+- Update to 2.26.1
+
+* Mon Apr 13 2009 Ray Strode <rstrode@redhat.com> - 1:2.26.0-8
+- Add less boring multistack patch for testing
+
+* Mon Mar 23 2009 Ray Strode <rstrode@redhat.com> - 1:2.26.0-7
+- Load session and language settings when username is read on
+ Other user
+
+* Fri Mar 20 2009 Ray Strode <rstrode@redhat.com> - 1:2.26.0-6
+- Fix problem in keyboard layout selector (483195)
+
+* Thu Mar 19 2009 Ray Strode <rstrode@redhat.com> - 1:2.26.0-5
+- Use gethostname() _properly_ instead of g_get_host_name() when writing
+ out xauth files, because the hostname may change out from
+ under us and glib caches it.
+
+* Thu Mar 19 2009 Ray Strode <rstrode@redhat.com> - 1:2.26.0-4
+- Use gethostname() instead of g_get_host_name() when writing
+ out xauth files, because the hostname may change out from
+ under us and glib caches it.
+
+* Wed Mar 18 2009 Ray Strode <rstrode@redhat.com> - 1:2.26.0-3
+- emit "user-selected" signal for non-user items in the list
+ as well.
+
+* Mon Mar 16 2009 Ray Strode <rstrode@redhat.com> - 1:2.26.0-2
+- Clean up empty auth dirs so they don't hang around forever
+ (bug 485974)
+
+* Mon Mar 16 2009 Ray Strode <rstrode@redhat.com> - 1:2.26.0-1
+- Update to 2.26.0
+- Drop gcc workaround. it might not be needed now.
+
+* Sat Mar 14 2009 Ray Strode <rstrode@redhat.com> - 1:2.25.2-20
+- Drop the use localhost patch because it broke things.
+ Instead add authorization that doesn't depend on a hostname
+
+* Thu Mar 12 2009 Ray Strode <rstrode@redhat.com> - 1:2.25.2-19
+- Add a lame patch in the off chance it might work around a
+ gcc bug on ppc:
+ unable to find register to spill in class 'LINK_OR_CTR_REGS'
+ Probably won't work.
+
+* Thu Mar 12 2009 Ray Strode <rstrode@redhat.com> - 1:2.25.2-18
+- Add Requires: libXau >= 1.0.4-4 to use localhost in xauth cookies
+- Use localhost instead of g_get_host_name ()
+
+* Thu Mar 12 2009 Ray Strode <rstrode@redhat.com> - 1:2.25.2-17
+- Don't force X server on active vt more than once
+
+* Tue Mar 10 2009 Ray Strode <rstrode@redhat.com> - 1:2.25.2-16
+- Store greeter's auth cookie under "localhost" instead
+ of g_get_host_name() since NetworkManager tries to synchronize
+ the internal hostname with the externally resolvable one.
+
+* Mon Mar 9 2009 Ray Strode <rstrode@redhat.com> - 1:2.25.2-15
+- Don't race with PAM modules that ask questions during
+ pam_open_session (and don't subsequently go bonkers when
+ losing the race).
+
+* Fri Mar 6 2009 Ray Strode <rstrode@redhat.com> - 1:2.25.2-14
+- Reset "start session when ready" state to FALSE when starting
+ new greeter from existing slave. May fix problem Chris Ball
+ is seeing with language selection in autologin the second time
+ after boot up.
+
+* Thu Mar 5 2009 Ray Strode <rstrode@redhat.com> - 1:2.25.2-13
+- 2.25.2-10 fixes were actually only for timed login.
+ Add same fix for auto login
+
+* Thu Mar 5 2009 Ray Strode <rstrode@redhat.com> - 1:2.25.2-12
+- Create settings object early to prevent assertion failures
+ when one pam conversation completes before another starts.
+
+* Wed Mar 4 2009 Ray Strode <rstrode@redhat.com> - 1:2.25.2-11
+- Bring back language/session/layout selector for autologin
+
+* Wed Mar 4 2009 Ray Strode <rstrode@redhat.com> - 1:2.25.2-10
+- Add some fixes for autologin
+
+* Tue Mar 3 2009 Ray Strode <rstrode@redhat.com> - 1:2.25.2-9
+- Add limited 'one-stack-only' version of multistack patch
+ (See https://fedoraproject.org/wiki/Features/MultiplePAMStacksInGDM)
+- Drop 10 second delay in start up because of broken autostart
+ file
+
+* Fri Feb 27 2009 Matthias Clasen <mclasen@redhat.com>
+- Require PolicyKit-authentication-agent
+
+* Tue Feb 24 2009 Matthias Clasen <mclasen@redhat.com>
+- Refine the hal patch
+
+* Tue Feb 24 2009 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 1:2.25.2-6
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
+
+* Fri Feb 20 2009 Matthias Clasen <mclasen@redhat.com> - 1:2.25.2-5
+- Get the default keyboard layout out of hal device properties
+ instead of /etc/sysconfig/keyboard
+
+* Fri Feb 20 2009 Ray Strode <rstrode@redhat.com> - 1:2.25.2-4
+- add Provides: service(graphical-login) to help anaconda
+
+* Thu Jan 22 2009 Ray Strode <rstrode@redhat.com> - 1:2.25.2-3
+- Open log files for append to make selinux lock down easier
+
+* Wed Dec 17 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.25.2-2
+- Update to 2.25.2
+- Drop the xkb groups workaround to see if the issue disappeared
+
+* Thu Dec 4 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.25.1-2
+- Update to 2.25.1
+
+* Mon Oct 20 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.24.0-11
+- Respect system keyboard setting
+
+* Wed Oct 15 2008 Ray Strode <rstrode@redhat.com> - 1:2.24.0-10
+- Rework "force X on vt1" code to work after the user logs out
+
+* Wed Oct 15 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.24.0-9
+- Save some space
+
+* Fri Oct 3 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.24.0-8
+- Don't show a non-functional help menuitem
+
+* Tue Sep 30 2008 Ray Strode <rstrode@redhat.com> - 1:2.24.0-7
+- Make panel slide in initially like the gnome panel
+
+* Tue Sep 30 2008 Ray Strode <rstrode@redhat.com> - 1:2.24.0-6
+- drop background priority change. Choppyiness in -3 ended up
+ being a bug in gnome-settings-daemon.
+- pull patch from upstream to scale face icons with fontsize
+
+* Thu Sep 25 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.24.0-5
+- Require gnome-session
+
+* Tue Sep 23 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.24.0-4
+- Let /var/lib/gdm be owned by gdm, to make pulseaudio happy
+
+* Tue Sep 23 2008 Ray Strode <rstrode@redhat.com> - 1:2.24.0-3
+- Load background after everything else, so the crossfade
+ isn't choppy.
+
+* Mon Sep 22 2008 Ray Strode <rstrode@redhat.com> - 1:2.24.0-2
+- Fix permssions on spool dir
+
+* Mon Sep 22 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.24.0-1
+- Update to 2.24.0
+
+* Mon Sep 22 2008 Ray Strode <rstrode@redhat.com> - 1:2.23.92-10
+- Flush X event queue after setting _XROOTPMAP_ID so there's
+ no race with settings daemon reading the property
+
+* Fri Sep 19 2008 Ray Strode <rstrode@redhat.com> - 1:2.23.92-9
+- Fix crash from language dialog
+
+* Wed Sep 17 2008 Ray Strode <rstrode@redhat.com> - 1:2.23.92-8
+- canonicalize codeset to match output of locale -m
+- filter duplicates from language list
+
+* Tue Sep 16 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.23.92-7
+- Plug a few memory leaks
+
+* Tue Sep 16 2008 Ray Strode <rstrode@redhat.com> - 1:2.23.92-6
+- Use _XROOTPMAP_ID instead of _XSETROOT_ID
+
+* Tue Sep 16 2008 Ray Strode <rstrode@redhat.com> - 1:2.23.92-5
+- Save root window in XSETROOTID property for transition
+
+* Fri Sep 12 2008 Ray Strode <rstrode@redhat.com> - 1:2.23.92-4
+- Fix bug in last patch
+
+* Thu Sep 11 2008 Ray Strode <rstrode@redhat.com> - 1:2.23.92-3
+- Add hook to allow for plymouth transition
+
+* Tue Sep 9 2008 Jon McCann <jmccann@redhat.com> - 1:2.23.92-2
+- Disallow root login
+
+* Mon Sep 8 2008 Jon McCann <jmccann@redhat.com> - 1:2.23.92-1
+- Update to 2.23.92-1
+
+* Thu Aug 28 2008 Jon McCann <jmccann@redhat.com> - 1:2.23.91-0.20080828.2
+- Update to non-broken snapshot
+
+* Thu Aug 28 2008 Jon McCann <jmccann@redhat.com> - 1:2.23.91-0.20080828.1
+- Update to snapshot
+
+* Mon Aug 25 2008 Jon McCann <jmccann@redhat.com> - 1:2.23.90-2
+- Add desktop file for metacity
+
+* Mon Aug 25 2008 Jon McCann <jmccann@redhat.com> - 1:2.23.90-1
+- Update to 2.23.90
+
+* Thu Aug 14 2008 Behdad Esfahbod <besfahbo@redhat.com> - 1:2.23.2-3
+- Add upstreamed patch gdm-2.23.2-unknown-lang.patch
+
+* Wed Aug 13 2008 Ray Strode <rstrode@redhat.com> - 1:2.23.2-2
+- Require plymouth-gdm-hooks so plymouth-log-viewer gets pulled
+ in on upgrades
+
+* Wed Jul 30 2008 Jon McCann <jmccann@redhat.com> - 1:2.23.2-1
+- Update to 2.23.2
+
+* Mon Jul 28 2008 Jon McCann <jmccann@redhat.com> - 1:2.23.1.0.2008.07.28.1
+- Update to newer snapshot
+
+* Mon Jul 21 2008 Jon McCann <jmccann@redhat.com> - 1:2.23.1.0.2008.07.21.3
+- Update to newer snapshot
+
+* Mon Jul 21 2008 Jon McCann <jmccann@redhat.com> - 1:2.23.1.0.2008.07.21.2
+- Update to new snapshot
+
+* Mon Jul 21 2008 Jon McCann <jmccann@redhat.com> - 1:2.23.1.0.2008.07.21.1
+- Update to snapshot
+
+* Fri Jul 11 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.22.0-12
+- Actually apply the patch
+
+* Thu Jul 10 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.22.0-11
+- Fix some broken icons on the login screen
+
+* Thu Jul 10 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.22.0-10
+- Improve rendering of languages
+
+* Thu Jul 3 2008 Jon McCann <jmccann@redhat.com> - 1:2.22.0-9
+- Check for a null filesystem type
+
+* Wed Jun 25 2008 Ray Strode <rstrode@redhat.com> - 1:2.22.0-8
+- After discussion with X team, turn tcp connections off by default,
+ but add back option to toggle on (bug 446672)
+
+* Wed Jun 25 2008 Ray Strode <rstrode@redhat.com> - 1:2.22.0-7
+- enable tcp connections by default
+
+* Thu May 8 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.22.0-6
+- Add a GConf key to disable the user list
+
+* Mon May 5 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.22.0-5
+- Autoreconf
+- Bump rev
+
+* Mon May 5 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.22.0-4
+- Add a keyboard chooser to the greeter
+
+* Sun May 4 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.22.0-3
+- Fix source url
+
+* Fri May 1 2008 Jon McCann <jmccann@redhat.com> - 1:2.22.0-2
+- Retry tagging
+
+* Fri May 1 2008 Jon McCann <jmccann@redhat.com> - 1:2.22.0-1
+- Update to 2.22.0
+- Fix restarting when bus goes away
+
+* Thu May 1 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.05.01.1
+- ConsoleKit fixes
+- Don't show session selector if only one session installed
+- automatically pop up language/session selectors when using mnemonics
+
+* Tue Apr 29 2008 Jon McCann <jmccann@redhat.com> - 1:2.21.10-0.2008.04.29.2
+- Fix debugging
+- Fix resetting slave after session migration
+- Desensitize power buttons briefly after page switch
+- Remove Users: label from greeter
+
+* Tue Apr 29 2008 Jon McCann <jmccann@redhat.com> - 1:2.21.10-0.2008.04.29.1
+- make transient greeter less transient to workaround spurious vt switch
+
+* Mon Apr 28 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.04.28.1
+- a11y improvements
+- make "Suspend" desensitize properly when not-available
+- make resize animation faster
+- user switcher fixes
+
+* Fri Apr 18 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.04.18.2
+- Get Chinese back in language list
+
+* Fri Apr 18 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.04.18.1
+- start orca without main window
+- add missing priorities for plugins
+- add more failsafe lockdown
+
+* Wed Apr 16 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.04.16.1
+- Disable typeahead when asking for password so password can't get shown
+ in clear text (bug 442300)
+
+* Wed Apr 16 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.04.11.4
+- Use start-here instead of fedora-logo-icon to aid generic-logos
+
+* Fri Apr 11 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.21.10-0.2008.04.11.3
+- Fix up the XKB workaround
+
+* Fri Apr 11 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.04.11.2
+- Fix security issue in last commit
+
+* Fri Apr 11 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.04.11.1
+- Fix focus handling when tabbing from user-chooser to buttons
+- don't set real uid to user before setcred
+- fix permissions on /var/run/gdm ... again
+
+* Thu Apr 10 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.21.10-0.2008.04.08.4
+- Work around a XKB problem
+
+* Tue Apr 8 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.04.08.3
+- Language list was incomplete (bug 441613)
+
+* Tue Apr 8 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.04.08.2
+- Fix permissions on /var/run/gdm
+
+* Tue Apr 8 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.04.08.1
+- Install X auth cookies in /var/run/gdm instead of /tmp
+
+* Mon Apr 7 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.04.07.3
+- Disable image for automatic login and other user
+- Act more sanely if gnome isn't installed
+
+* Mon Apr 7 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.04.07.2
+- Allow double-click to select language from list
+
+* Mon Apr 7 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.04.07.1
+- Make automatic login timer fade in
+- No more checkboxes in user-switch applet
+
+* Sun Apr 6 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.04.06.1
+- Focus face browser after failed login attempt
+- disable debug messages until 2.22.0 is released
+
+* Sat Apr 5 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.21.10-0.2008.04.04.2
+- Improve handling of CK error messages
+
+* Sat Apr 5 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.04.04.1
+- Fix jump in animation for autologin
+- Fix crash if LANG="somethingbogus"
+
+* Sat Apr 5 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.04.03.3
+- Fix crash when canceling autologin
+
+* Fri Apr 4 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.21.10-0.2008.04.03.2
+- Uninstall gconf schemas before the files are gone
+
+* Thu Apr 3 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.04.03.1
+- Update to snapshot
+- Improves shrink/grow animation of login window
+
+* Wed Apr 2 2008 Jon McCann <jmccann@redhat.com> - 1:2.21.10-0.2008.04.02.1
+- Update to snapshot
+
+* Mon Mar 31 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.21.10-0.2008.03.26.4
+- Fix a directory ownership oversight
+
+* Wed Mar 26 2008 Jon McCann <jmccann@redhat.com> - 1:2.21.10-0.2008.03.26.3
+- Fix build due to #436349
+
+* Wed Mar 26 2008 Jon McCann <jmccann@redhat.com> - 1:2.21.10-0.2008.03.26.2
+- Update to newer snapshot that includes more lockdown
+
+* Wed Mar 26 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.03.26.1
+- Update to snapshot
+- Turn on profiling
+
+* Fri Mar 21 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.21.10-0.2008.03.18.3
+- Don't require a theme we don't use
+
+* Wed Mar 19 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.10-0.2008.03.18.2
+- Fix default path (bug 430187)
+
+* Tue Mar 18 2008 Jon McCann <jmccann@redhat.com> - 1:2.21.10-0.2008.03.18.1
+- Update to snapshot
+
+* Mon Mar 17 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.21.9-5
+- Implement tooltips in the language selection dialog
+
+* Mon Mar 17 2008 Matthias Clasen <mclasen@redhat.com> - 1:2.21.9-4
+- Stop gvfs from using fuse in the sandbox session
+
+* Tue Mar 11 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.9-3
+- remove duplication signal definition from bad patch merge
+ which led to crash for "Other" user
+
+* Mon Mar 10 2008 Jon McCann <jmccann@redhat.com> - 1:2.21.9-2
+- Fix case where we can't lookup a user.
+
+* Mon Mar 10 2008 Jon McCann <jmccann@redhat.com> - 1:2.21.9-1
+- Update to 2.21.9
+
+* Mon Mar 10 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.9-0.2008.03.10.2
+- Prevent some spurious wake ups caused by the
+ timed login timer animation
+
+* Mon Mar 10 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.9-0.2008.03.10.1
+- Update to latest snapshot
+
+* Fri Mar 7 2008 David Woodhouse <dwmw2@redhat.com> - 1:2.21.9-0.2008.02.29.3
+- Fix endianness breakage in signal pipes (#436333)
+
+* Mon Mar 3 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.9-0.2008.02.29.2
+- Be more explicit in file list; use less globs
+- Don't package user-switcher in both packages!
+
+* Fri Feb 29 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.9-0.2008.02.29.1
+- Update to snapshot
+- Split user-switcher out
+
+* Mon Feb 25 2008 Jon McCann <jmccann@redhat.com> - 1:2.21.8-1
+- Update to 2.21.8
+
+* Tue Feb 12 2008 Jon McCann <jmccann@redhat.com> - 1:2.21.7-1
+- Update to 2.21.7
+
+* Fri Feb 8 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.7-0.2008.02.08.1
+- Update to snapshot
+
+* Wed Jan 30 2008 Jon McCann <jmccann@redhat.com> - 1:2.21.6-1
+- Update to 2.21.6
+
+* Thu Jan 24 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.5-2
+- add BuildRequires for iso-codes-devel
+
+* Fri Jan 18 2008 Jon McCann <jmccann@redhat.com> - 1:2.21.5-1
+- Update to 2.21.5
+
+* Thu Jan 17 2008 Jon McCann <jmccann@redhat.com> - 1:2.21.2-0.2007.11.20.11
+- Rebuild
+
+* Mon Jan 15 2008 Dan Walsh <dwalsh@redhat.com> - 1:2.21.2-0.2007.11.20.10
+- Fix gdm.pam file so that session include system-auth happens after other session setup
+
+* Mon Jan 7 2008 Ray Strode <rstrode@redhat.com> - 1:2.21.2-0.2007.11.20.9
+- hide guest account since it doesn't work
+
+* Fri Dec 21 2007 Ray Strode <rstrode@redhat.com> - 1:2.21.2-0.2007.11.20.8
+- Fix background (and other settings)
+
+* Wed Dec 19 2007 Ray Strode <rstrode@redhat.com> - 1:2.21.2-0.2007.11.20.7
+- Improve animation to be less jumpy
+
+* Fri Dec 14 2007 Ray Strode <rstrode@redhat.com> - 1:2.21.2-0.2007.11.20.6
+- Fix an uninitialized variable that makes the session list stop
+ growing before its finished sometimes
+
+* Thu Dec 13 2007 Ray Strode <rstrode@redhat.com> - 1:2.21.2-0.2007.11.20.5
+- add session chooser to login screen
+- add hoaky animations
+
+* Fri Nov 30 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.21.2-0.2007.11.20.4
+- Use the new "substack" support in pam to make keyring unlocking work
+
+* Tue Nov 20 2007 Ray Strode <rstrode@redhat.com> - 1:2.21.2-0.2007.11.20.3
+- use metacity for now
+
+* Tue Nov 20 2007 Ray Strode <rstrode@redhat.com> - 1:2.21.2-0.2007.11.20.2
+- Drop dont run profile patch since dwalsh changed /usr/sbin/gdm label
+
+* Tue Nov 20 2007 Ray Strode <rstrode@redhat.com> - 1:2.21.2-0.2007.11.20.1
+- Update to today's snapshot
+
+* Mon Nov 19 2007 Ray Strode <rstrode@redhat.com> - 1:2.21.2-0.2007.11.19.3
+- fix permissions on homedir
+
+* Mon Nov 19 2007 Ray Strode <rstrode@redhat.com> - 1:2.21.2-0.2007.11.19.2
+- move homedir to /var/lib/gdm
+
+* Mon Nov 19 2007 Ray Strode <rstrode@redhat.com> - 1:2.21.2-0.2007.11.19.1
+- Update to today's snapshot
+
+* Thu Nov 15 2007 Ray Strode <rstrode@redhat.com> - 1:2.21.2-0.2007.11.14.2
+- don't source /etc/profile at startup
+
+* Wed Nov 14 2007 Ray Strode <rstrode@redhat.com> - 1:2.21.2-0.2007.11.14.1
+- Update to today's snapshot
+
+* Fri Nov 9 2007 Ray Strode <rstrode@redhat.com> - 1:2.21.2-0.2007.11.09.1
+- Update to today's snapshot
+
+* Tue Oct 30 2007 Ray Strode <rstrode@redhat.com> - 1:2.21.1-0.2007.10.30.1
+- Update to today's snapshot
+
+* Tue Oct 23 2007 Ray Strode <rstrode@redhat.com> - 1:2.21.1-0.2007.10.23.1
+- Update to today's snapshot
+
+* Mon Oct 22 2007 Ray Strode <rstrode@redhat.com> - 1:2.21.1-0.2007.10.22.1
+- Add a snapshot gdm trunk, totally different unfinished ui...
+
+* Fri Oct 5 2007 Dan Walsh <dwalsh@redhat.com> - 1:2.20.0-14
+- Added pam_selinux_permit and pam_namespace to gdm-pam
+ - This pam module allows user without a password to login when selinux is in enforcing mode
+- Added pam_namespace to gdm-autologin-pam
+- These changes were made to make it easier to setup the xguest user account
+
+* Tue Oct 3 2007 Alexander Larsson <alexl@redhat.com> - 1:2.20.0-14
+- Fix up pam keyring integration to be what the latest version
+ of the docs says
+
+* Tue Oct 2 2007 Ray Strode <rstrode@redhat.com> - 1:2.20.0-13
+- Actually add said escape == cancel behavior back
+
+* Tue Oct 2 2007 Ray Strode <rstrode@redhat.com> - 1:2.20.0-12
+- Add escape == cancel behavior back
+
+* Mon Oct 1 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.20.0-11
+- Fix a refcounting problem with user faces
+
+* Mon Oct 1 2007 Ray Strode <rstrode@redhat.com> - 1:2.20.0-10
+- apply upstream patch from Brady Anderson <brady.anderson@gmail.com>
+ to fix writing out .dmrc file when setting default language
+ (upstream bug 453916)
+
+* Fri Sep 28 2007 Ray Strode <rstrode@redhat.com> - 1:2.20.0-9
+- drop redhat-artwork dep, add fedorainfinity-gdm-theme dep
+
+* Fri Sep 28 2007 Ray Strode <rstrode@redhat.com> - 1:2.20.0-8
+- Another crack at 240853
+
+* Fri Sep 28 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.20.0-7
+- Fix the stupid bullets again
+
+* Thu Sep 27 2007 Ray Strode <rstrode@redhat.com> - 1:2.20.0-6
+- The previously mentioned typo didn't matter before because the
+ compiled in default matched what the config file was supposed to
+ say. This commit restores matched default behavior (bug 301031)
+
+* Thu Sep 27 2007 Ray Strode <rstrode@redhat.com> - 1:2.20.0-5
+- Fix an apparent typo in the securitytokens.conf config file
+ (bug 301031)
+
+* Thu Sep 20 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.20.0-4
+- Reenable root login due to popular demand
+
+* Wed Sep 19 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.20.0-3
+- Change default theme to FedoraInfinity
+
+* Wed Sep 19 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.20.0-2
+- Fix a hang on restart (#240853)
+
+* Tue Sep 18 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.20.0-1
+- Update to 2.20.0
+
+* Wed Sep 12 2007 Ray Strode <rstrode@redhat.com> - 1:2.19.8-4
+- Change default password character back to circle instead of
+ asterisk (bug 287951)
+
+* Fri Sep 7 2007 Ray Strode <rstrode@redhat.com> - 1:2.19.8-3
+- rebuild --with-selinux
+
+* Fri Sep 7 2007 Ray Strode <rstrode@redhat.com> - 1:2.19.8-2
+- make things work better for xguest users (bug 254164)
+
+* Fri Sep 7 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.19.8-1
+- Update to 2.19.8
+
+* Tue Sep 4 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.19.7-1
+- Update to 2.19.7
+
+* Fri Aug 24 2007 Ray Strode <rstrode@redhat.com> - 1:2.19.6-5
+- use pam_selinux instead of home grown selinux code (bug 254164)
+
+* Wed Aug 22 2007 Kristian Høgsberg <krh@redhat.com> - 1:2.19.6-4
+- Pass -br to the default X server too.
+
+* Sat Aug 18 2007 Ray Strode <rstrode@redhat.com> - 1:2.19.6-3
+- disable root login (see "low-hanging fruit" discussion on
+ fedora-desktop-list)
+
+* Thu Aug 16 2007 Ray Strode <rstrode@redhat.com> - 1:2.19.6-2
+- disable type ahead in user list (bug 252991)
+
+* Wed Aug 15 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.19.6-1
+- Update to 2.19.6
+- Use %%find_lang for help files
+
+* Sun Aug 12 2007 Adam Jackson <ajax@redhat.com> 1:2.19.5-9
+- Remove the filereq on /etc/pam.d/system-auth, pam alone is sufficient.
+- Bump the pam requirement to 0.99, 0.75 is ancient.
+
+* Sun Aug 12 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.19.5-8
+- Make the previous fix actually work
+
+* Sun Aug 12 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.19.5-7
+- Make gdmsetup work with consolehelper and pam again
+
+* Mon Aug 6 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.19.5-6
+- Require gnome-keyring-pam
+
+* Mon Aug 6 2007 Ray Strode <rstrode@redhat.com> - 1:2.19.5-5
+- change previous patch to drop even more code
+
+* Mon Aug 6 2007 Ray Strode <rstrode@redhat.com> - 1:2.19.5-4
+- turn off dwellmouselistener if devices don't send core events.
+ don't warp pointer to stylus ever (upstream bug 457998)
+
+* Fri Aug 3 2007 Ray Strode <rstrode@redhat.com> - 1:2.19.5-3
+- remove dwellmouselistener module from default configuration.
+ It's pretty broken (bug 248752)
+
+* Fri Aug 3 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.19.5-2
+- Update license field
+
+* Tue Jul 31 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.19.5-1
+- Update to 2.19.5
+
+* Mon Jul 30 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.19.4-2
+- Add optional gnome-keyring support to the gdm pam stack
+
+* Tue Jul 10 2007 Ray Strode <rstrode@redhat.com> - 1:2.19.4-1
+- Update to 2.19.4
+
+* Wed Jun 27 2007 Ray Strode <rstrode@redhat.com> - 1:2.19.3-3
+- set Browser=true by default
+
+* Wed Jun 27 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.19.3-2
+- Drop an unnecessary file dependency
+
+* Mon Jun 18 2007 Ray Strode <rstrode@redhat.com> - 1:2.19.3-1
+- Update to 2.19.3
+
+* Tue Jun 5 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.19.2-1
+- Update to 2.19.2
+
+* Mon May 21 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.19.1-1
+- Update to 2.19.1
+
+* Tue May 15 2007 Ray Strode <rstrode@redhat.com> - 1:2.18.0-14
+- hide users from userlist that have disabled shells
+ (bug 240148)
+
+* Thu May 10 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.18.0-13
+- Follow packaging guidelines for scrollkeeper dependencies
+
+* Mon May 7 2007 Ray Strode <rstrode@redhat.com> - 1:2.18.0-12
+- reenable utmp logging (bug 209537)
+
+* Tue Apr 17 2007 Ray Strode <rstrode@redhat.com> - 1:2.18.0-11
+- Be more verbose to help isolate the problem in bug 234567
+
+* Thu Apr 12 2007 Ray Strode <rstrode@redhat.com> - 1:2.18.0-10
+- add "Default" session back to the sessions menu (bug 234218)
+
+* Thu Apr 5 2007 Ray Strode <rstrode@redhat.com> - 1:2.18.0-9
+- don't expect utf-8 usernames for plain greeter face browser
+ either.
+
+* Thu Apr 5 2007 Ray Strode <rstrode@redhat.com> - 1:2.18.0-8
+- don't expect utf-8 usernames for face browser (bug 235351).
+
+* Thu Mar 29 2007 Ray Strode <rstrode@redhat.com> - 1:2.18.0-7
+- don't strcpy overlapping strings (bug 208181).
+
+* Tue Mar 27 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.18.0-6
+- Hide gdmphotosetup by default, since About Me does the same
+
+* Tue Mar 20 2007 Ray Strode <rstrode@redhat.com> - 1:2.18.0-5
+- add fix to allow themes to cope with low resolution modes
+ better (bug 232672)
+
+* Mon Mar 19 2007 Ray Strode <rstrode@redhat.com> - 1:2.18.0-4
+- update and reenable security token patch
+
+* Mon Mar 19 2007 David Zeuthen <davidz@redhat.com> - 1:2.18.0-3
+- Also pass AT's to the session from the plain greeter (#232518)
+- New faces including new subpackage gdm-extra-faces
+
+* Tue Mar 13 2007 David Zeuthen <davidz@redhat.com> - 1:2.18.0-2
+- Update to upstream release 2.18.0
+- Switch default theme to FedoraFlyingHigh and show /etc/passwd users
+- Fix accessibility in the themed greeter (GNOME #412576)
+- Enable accessible login, make sure gdm can access devices and
+ pass activated AT's to the login session (#229912)
+- Disable smart card login for now as patch doesn't apply anymore
+
+* Fri Mar 9 2007 Ray Strode <rstrode@redhat.com> - 1:2.17.8-3
+- hide langauges that aren't displayable from the list (bug 206048)
+
+* Tue Mar 6 2007 Ray Strode <rstrode@redhat.com> - 1:2.17.8-2
+- turn off pam sanity check because it conflicts with audit
+
+* Wed Feb 28 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.17.8-1
+- Update to 2.17.8
+
+* Sat Feb 24 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.17.7-5
+- Fix keynav in the face browser
+
+* Fri Feb 23 2007 David Zeuthen <davidz@redhat.com> - 1:2.17.7-4
+- Add some enhancements to the greeter (bgo #411427)
+
+* Fri Feb 23 2007 Ray Strode <rstrode@redhat.com> - 1:2.17.7-3
+- Update to 2.17.7
+
+* Fri Feb 23 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.17.7-2
+- Don't own /usr/share/icons/hicolor
+- Install all desktop files
+
+* Mon Feb 12 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.17.7-1
+- try to update to 2.17.7
+- Drop upstreamed patches
+
+* Mon Feb 12 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.17.6-4
+- Reuse existing sessions without asking
+- Don't show failsafe sessions
+
+* Sat Feb 10 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.17.6-3
+- Fix a problem with the ConsoleKit support
+
+* Tue Feb 6 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.17.6-2
+- Apply a patch to improve fast user switching experience
+
+* Tue Jan 23 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.17.6-1
+- Update to 2.17.6
+
+* Sat Jan 13 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.17.5-2
+- Enable ConsoleKit support
+
+* Thu Jan 11 2007 Matthias Clasen <mclasen@redhat.com> - 1:2.17.5-1
+- Update to 2.17.5
+
+* Fri Dec 15 2006 Matthias Clasen <mclasen@redhat.com> - 1:2.17.4-1
+- Update to 2.17.4, which fixes CVE-2006-6105
+
+* Tue Dec 5 2006 Matthias Clasen <mclasen@redhat.com> - 1:2.17.3-1
+- Update to 2.17.3
+- Update some patches
+
+* Tue Nov 7 2006 Matthias Clasen <mclasen@redhat.com> - 1:2.17.2-1
+- Update to 2.17.2
+
+* Sun Nov 5 2006 Matthias Clasen <mclasen@redhat.com> - 1:2.17.1-1
+- Update to 2.17.1
+
+* Thu Oct 26 2006 Matthias Clasen <mclasen@redhat.com> - 1:2.17.0-2
+- Fix a crash with launching a11y support
+
+* Sun Oct 22 2006 Matthias Clasen <mclasen@redhat.com> - 1:2.17.0-1
+- Update to 2.17.0
+
+* Tue Oct 17 2006 Matthias Clasen <mclasen@redhat.com> - 1:2.16.0-17
+- Make photosetup help button work (#198138)
+
+* Sun Oct 15 2006 Ray Strode <rstrode@redhat.com> - 1:2.16.0-16.fc7
+- don't log canceled pam conversations as failed login attempts
+
+* Sun Oct 15 2006 Ray Strode <rstrode@redhat.com> - 1:2.16.0-15.fc7
+- Prefer modules in secmod db over hardcoded coolkey path
+
+* Sat Oct 14 2006 Ray Strode <rstrode@redhat.com> - 1:2.16.0-14.fc7
+- have security token monitor helper process kill itself when
+ the communication pipe to the main process goes away (bug 210677).
+
+* Wed Oct 10 2006 Ray Strode <rstrode@redhat.com> - 1:2.16.0-13.fc6
+- desensitize entry fields until pam asks for input, so if pam
+ doesn't initially ask for input (like in smart card required mode)
+ the user can't type something and confuse gdm (bug 201344)
+
+* Fri Oct 6 2006 Ray Strode <rstrode@redhat.com> - 1:2.16.0-12.fc6
+- invoke standard X server with -br option to ensure we get a
+ black root on startup
+
+* Thu Oct 5 2006 Ray Strode <rstrode@redhat.com> - 1:2.16.0-11.fc6
+- make monitoring code more reliable (bug 208018)
+
+* Wed Sep 27 2006 Matthias Clasen <mclasen@redhat.com> - 1:2.16.0-10.fc6
+- Fix small issues in gdmsetup (#208225)
+
+* Wed Sep 27 2006 Matthias Clasen <mclasen@redhat.com> - 1:2.16.0-9.fc6
+- Fix a problem with the display of the FedoraDNA theme
+ in gdmsetup
+
+* Tue Sep 19 2006 Ray Strode <rstrode@redhat.com> - 1:2.16.0-8.fc6
+- Add as_IN, si_LK to language list (bug 203917)
+
+* Mon Sep 18 2006 Ray Strode <rstrode@redhat.com> - 1:2.16.0-7.fc6
+- fix a problem recently introduced in the smart card forking
+ code
+
+* Mon Sep 18 2006 Ray Strode <rstrode@redhat.com> - 1:2.16.0-6.fc6
+- fix a problem recently introduced in the smart card driver
+ loading code (bug 206882)
+
+* Thu Sep 14 2006 Ray Strode <rstrode@redhat.com> - 1:2.16.0-5.fc6
+- don't leak pipe fds (bug 206709)
+
+* Thu Sep 14 2006 Ray Strode <rstrode@redhat.com> - 1:2.16.0-4.fc6
+- update security token patch to not poll
+
+* Fri Sep 8 2006 Jesse Keating <jkeating@redhat.com> - 1:2.16.0-3.fc6
+- Apply correct defaults patch
+
+* Thu Sep 7 2006 Matthias Clasen <mclasen@redhat.com> - 1:2.16.0-2.fc6
+- Change the default theme to FedoraDNA
+- Bump redhat-artwork requirement
+
+* Tue Sep 5 2006 Matthias Clasen <mclasen@redhat.com> - 1:2.16.0-1.fc6
+- Update to 2.16.0
+
+* Sat Aug 26 2006 Karsten Hopp <karsten@redhat.com> - 1:2.15.10-2.fc6
+- buildrequire inttools as this isn't a requirement of scrollkeeper anymore
+ and thus missing from the buildroot
+
+* Mon Aug 21 2006 Matthias Clasen <mclasen@redhat.com> - 1:2.15.10-1.fc6
+- Update to 2.15.10
+- Drop upstreamed patch
+
+* Fri Aug 4 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.9-1
+- update to 2.15.9
+
+* Fri Aug 4 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.7-2
+- update gdmsetup pam file to use config-util stacks
+
+* Thu Aug 3 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.7-1
+- update to 2.15.7
+- drop selinux patch that I don't think was ever finished
+
+* Thu Aug 3 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.6-14
+- fix face browser
+ (http://bugzilla.gnome.org/show_bug.cgi?id=349640)
+- fix error message reporting
+ (http://bugzilla.gnome.org/show_bug.cgi?id=349758)
+
+* Fri Jul 21 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.6-13
+- simply all the security token code by only using one pam stack
+- drop lame kill on token removal feature
+
+* Fri Jul 21 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.6-12
+- move authcookies out of home directories to prevent problems
+ on nfs/afs mounted home directories (bug 178233).
+
+* Fri Jul 21 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.6-11
+- really fix annoying dialog problem mentioned in 2.15.6-6
+
+* Wed Jul 19 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.6-10
+- center cursor on xinerama head (bug 180085)
+
+* Tue Jul 18 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.6-9
+- add "kill all sessions on token removal" feature
+
+* Tue Jul 18 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.6-8
+- reenable session keyring support in pam module (bug 198629)
+
+* Mon Jul 17 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.6-7
+- make security token support use its own config file in
+ preparation for modularizing it.
+
+* Mon Jul 17 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.6-6
+- fix off-by-one in the process-all-ops patch that was causing
+ an anoying dialog to pop up on each login
+
+* Sun Jul 16 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.6-5
+- add initial wtmp and btmp logging support
+
+* Fri Jul 14 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.6-4
+- fix bug in security token support
+
+* Fri Jul 14 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.6-3
+- fix hang in gdmsetup
+
+* Fri Jul 14 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.6-2
+- put new pam module at top of stack (bug 198629)
+
+* Wed Jul 12 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.6-1
+- Update to 2.15.6
+
+* Wed Jul 12 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.5-4
+- add new pam module to pam files to support kernel session keyring
+
+* Wed Jul 12 2006 Jesse Keating <jkeating@redhat.com> - 1:2.15.5-3.1
+- rebuild
+
+* Tue Jul 11 2006 Ray Strode <rstrode@redhat.com> 1:2.15.5-3
+- add initial support for smart card security tokens
+
+* Fri Jul 7 2006 Ray Strode <rstrode@redhat.com> 1:2.15.5-2
+- add patch to process all operations when more than one comes
+ in really quickly
+- move default "Please enter your username" message to the
+ greeter instead of the slave so that it doesn't get stacked if
+ a pam module has a non default message
+- add new message for reseting the current login operation
+ (like the cancel button does, but accessible via the gdm fifo)
+
+* Tue Jun 13 2006 Matthias Clasen <mclasen@redhat.com> 1:2.15.5-1
+- Update to 2.15.5
+
+* Mon Jun 12 2006 Bill Nottingham <notting@redhat.com> 1:2.15.3-8
+- replace automake14 buildreq with automake
+
+* Thu Jun 8 2006 Ray Strode <rstrode@redhat.com> 1:2.15.3-7
+- fix CVE-2006-2452
+
+* Wed Jun 7 2006 Jeremy Katz <katzj@redhat.com> - 1:2.15.3-6
+- buildrequire the server so that we get the path right in the config file
+
+* Tue Jun 06 2006 Karsten Hopp <karsten@redhat.de> 1:2.15.3-5
+- buildrequire libdmx-devel
+
+* Mon Jun 5 2006 Matthias Clasen <mclasen@redhat.com> - 1:2.15.3-4
+- Require system-logos, not fedora-logos
+
+* Tue May 23 2006 Ray Strode <rstrode@redhat.com> - 1:2.15.3-3
+- Support xdm -nodaemon option (bug 192461)
+
+* Mon May 22 2006 Matthias Clasen <mclasen@redhat.com> - 1:2.15.3-2
+- Add missing BuildRequires (#192494)
+
+* Wed May 17 2006 Matthias Clasen <mclasen@redhat.com> - 1:2.15.3-1
+- Update to 2.15.3
+
+* Wed May 10 2006 Matthias Clasen <mclasen@redhat.com> - 1:2.15.0-1
+- Update to 2.15.0
+
+* Wed Apr 26 2006 Matthias Clasen <mclasen@redhat.com> - 1:2.14.4-2
+- Update to 2.14.4
+
+* Wed Apr 12 2006 Ray Strode <rstrode@redhat.com> - 1:2.14.1-4
+- fix libexecdir substitution problem in configuration file
+
+* Tue Apr 11 2006 Ray Strode <rstrode@redhat.com> - 1:2.14.1-3
+- Add gdmthemetester.in to the mix (upstream bug 338079)
+
+* Tue Apr 11 2006 Matthias Clasen <mclasen@redhat.com> - 1:2.14.1-2
+- Update to 2.14.1
+
+* Mon Mar 13 2006 Ray Strode <rstrode@redhat.com> - 1:2.14.0-1
+- Update to 2.14.0
+
+* Tue Mar 7 2006 Ray Strode <rstrode@redhat.com> - 1:2.13.0.9-4
+- Follow Solaris's lead and default to AlwaysRestartServer=True
+ (may work around bug 182957)
+
+* Mon Mar 6 2006 Ray Strode <rstrode@redhat.com> - 1:2.13.0.9-3
+- migrate users with baseXsession=/etc/X11/gdm/Xsession to
+ /etc/X11/xinit/Xsession
+
+* Mon Mar 6 2006 Ray Strode <rstrode@redhat.com> - 1:2.13.0.9-2
+- disable sounds completely when disabled in configuration file
+ (upstream bug 333435)
+
+* Tue Feb 28 2006 Ray Strode <rstrode@redhat.com> - 1:2.13.0.9-1
+- Update to 2.13.0.9
+- Use new %%post section, written by
+ Michal Jaegermann <michal@harddata.com> (bug 183082)
+
+* Sat Feb 25 2006 Ray Strode <rstrode@redhat.com> - 1:2.13.0.8-6
+- fix a broken link
+
+* Fri Feb 24 2006 Ray Strode <rstrode@redhat.com> - 1:2.13.0.8-5
+- change some /etc/X11 bits in the spec file to /etc
+
+* Sun Feb 19 2006 Ray Strode <rstrode@redhat.com> - 1:2.13.0.8-3
+- add server entry for accel-indirect branch of xorg
+
+* Wed Feb 15 2006 Ray <rstrode@redhat.com> and Matthias <mclasen@redhat.com> - 1:2.13.0.8-2
+- malloc memory that is later freed
+
+* Mon Feb 13 2006 Ray Strode <rstrode@redhat.com> - 1:2.13.0.8-1
+- update to 2.13.0.8
+
+* Mon Feb 13 2006 Ray Strode <rstrode@redhat.com> - 1:2.13.0.7.0.2006.02.12-2
+- migrate custom.conf settings with /etc/X11/gdm to /etc/gdm
+
+* Sun Feb 12 2006 Ray Strode <rstrode@redhat.com> - 1:2.13.0.7.0.2006.02.12-1
+- update to cvs snapshot
+- move gdm to /etc instead of /etc/X11
+- move custom gdm.conf to sysconfdir instead of symlinking from
+ datadir (bug 180364)
+
+* Fri Feb 10 2006 Jesse Keating <jkeating@redhat.com> - 1:2.13.0.7-2.1
+- bump again for double-long bug on ppc(64)
+
+* Thu Feb 9 2006 Matthias Clasen <mclasen@redhat.com> - 2.13.0.7-2
+- Make gdmsetup use consolehelper
+- Don't use deprecated pam_stack
+
+* Tue Feb 07 2006 Jesse Keating <jkeating@redhat.com> - 1:2.13.0.7-1.1
+- rebuilt for new gcc4.1 snapshot and glibc changes
+
+* Tue Jan 31 2006 Ray Strode <rstrode@redhat.com> - 1:2.13.0.7-1
+- update to 2.13.0.7
+
+* Mon Jan 30 2006 Bill Nottingham <notting@redhat.com>
+- silence gdm-safe-restart
+
+* Thu Jan 19 2006 Ray Strode <rstrode@redhat.com> - 1:2.13.0.5-7
+- sed -ie isn't the same as sed -i -e (we want the latter)
+
+* Wed Jan 18 2006 Christopher Aillon <caillon@redhat.com> - 1:2.13.0.5-6
+- Add patch to fix clock to default to 24h in locales that expect it (175453)
+
+* Tue Jan 17 2006 Ray Strode <rstrode@redhat.com> - 1:2.13.0.5-1
+- update to 2.13.0.5 (bug 178099)
+
+* Tue Jan 17 2006 Ray Strode <rstrode@redhat.com> - 1:2.13.0.4-5
+- add new theme by Diana Fong, Máirín Duffy, and me
+
+* Mon Jan 16 2006 Ray Strode <rstrode@redhat.com> - 1:2.13.0.4-4
+- improve migration snippet (bug 177443).
+
+* Fri Jan 13 2006 Ray Strode <rstrode@redhat.com> - 1:2.13.0.4-3
+- migrate X server configuration for pre-modular X configurations.
+ Problems reported by Dennis Gregorovic <dgregor@redhat.com>
+
+* Mon Jan 9 2006 Ray Strode <rstrode@redhat.com> - 1:2.13.0.4-2
+- use xinit Xsession again.
+
+* Mon Jan 9 2006 Ray Strode <rstrode@redhat.com> - 1:2.13.0.4-1
+- update to 2.13.0.4
+
+* Fri Dec 09 2005 Jesse Keating <jkeating@redhat.com>
+- rebuilt
+
+* Mon Nov 16 2005 Ray Strode <rstrode@redhat.com> - 1:2.8.0.4-13
+- Don't fallback to xsm, try gnome-session instead
+- Require xorg-x11-xinit
+
+* Mon Nov 14 2005 Ray Strode <rstrode@redhat.com> - 1:2.8.0.4-12
+- Make sure that dbus-launch gets called if available
+
+* Mon Nov 14 2005 Ray Strode <rstrode@redhat.com> - 1:2.8.0.4-11
+- Don't use X session / setup files anymore.
+- Don't install early login init scripts
+- remove xsri dependency
+- don't prune language lists anymore
+
+* Sun Nov 13 2005 Jeremy Katz <katzj@redhat.com> - 1:2.8.0.4-10
+- also fix default xsession for where its moved in modular X
+
+* Sun Nov 13 2005 Jeremy Katz <katzj@redhat.com> - 1:2.8.0.4-9
+- change requirements for modular X
+- patch to find x server with modular X
+
+* Thu Oct 20 2005 Ray Strode <rstrode@redhat.com> 1:2.8.0.4-8
+- redhat-artwork was busted, require new version
+
+* Tue Oct 18 2005 Ray Strode <rstrode@redhat.com> 1:2.8.0.4-7
+- zero-initialize message buffer,
+ bug fixed by Josh Parson (jbparsons@usdavis.edu) (bug 160603)
+- fix typo in redhat-artwork requires line
+
+* Mon Oct 17 2005 Steve Grubb <sgrubb@redhat.com> 1:2.8.0.4-6
+- add login audit patch (bug 170569)
+
+* Mon Oct 17 2005 Ray Strode <rstrode@redhat.com> 1:2.8.0.4-5
+- bump redhat-artwork requirement to get rid of the boot
+ throbber for now, since it seems to have reappeared
+ mysteriously (bug 171025)
+p
+* Thu Oct 13 2005 Dan Walsh <dwalsh@redhat.com> 1:2.8.0.4-4
+- Change to use getseuserbyname
+
+* Thu Sep 28 2005 Dan Walsh <dwalsh@redhat.com> 1:2.8.0.4-3
+- Fix selinux not to fail when in permissive mode
+
+* Thu Sep 27 2005 Ray Strode <rstrode@redhat.com> 1:2.8.0.4-2
+- remove flexiserver from menus
+
+* Thu Sep 8 2005 Ray Strode <rstrode@redhat.com> 1:2.8.0.4-1
+- update to 2.8.0.4
+
+* Tue Sep 6 2005 Ray Strode <rstrode@redhat.com> 1:2.8.0.2-4
+- Apply clean up patch from Steve Grubb (gnome bug 315388).
+
+* Tue Aug 30 2005 Ray Strode <rstrode@redhat.com> 1:2.8.0.2-3
+- Prune language list of installed languages
+- Make config file noreplace again (bug 167087).
+
+* Sat Aug 20 2005 Ray Strode <rstrode@redhat.com> 1:2.8.0.2-2
+- hide throbber
+
+* Fri Aug 19 2005 Ray Strode <rstrode@redhat.com> 1:2.8.0.2-1
+- update to 2.8.0.2
+- disable early login stuff temporarily
+
+* Thu Aug 18 2005 Ray Strode <rstrode@redhat.com> 1:2.6.0.8-18
+- rebuild
+
+* Wed Aug 10 2005 Ray Strode <rstrode@redhat.com> 1:2.6.0.8-17
+- Prune uninstalled languages from language list.
+
+* Mon May 23 2005 Ray Strode <rstrode@redhat.com> 1:2.6.0.8-16
+- Make sure username/password incorrect message gets displayed
+ (bug 158127).
+- reread system locale before starting gdm in early login mode
+ (bug 158376).
+
+* Thu May 19 2005 Ray Strode <rstrode@redhat.com> 1:2.6.0.8-15
+- Take out some syslog spew (bug 157711).
+
+* Thu May 12 2005 Ray Strode <rstrode@redhat.com> 1:2.6.0.8-14
+- Fix processing of new-line characters that got broken
+ in 2.6.0.8-11 (bug 157442).
+
+* Tue May 3 2005 Ray Strode <rstrode@redhat.com> 1:2.6.0.8-12
+- Fix processing of non-ascii characters that got broken
+ in 2.6.0.8-11, found by Miloslav Trmac <mitr@redhat.com>,
+ (bug 156590).
+
+* Thu Apr 28 2005 Ray Strode <rstrode@redhat.com> 1:2.6.0.8-11
+- Fix halt command (bug 156299)
+- Process all messages sent to the greeter in a read, not just
+ the first
+
+* Wed Apr 27 2005 Jeremy Katz <katzj@redhat.com> - 1:2.6.0.8-10
+- silence %%postun
+
+* Tue Apr 26 2005 Ray Strode <rstrode@redhat.com> 1:2.6.0.8-9
+- Change default standard greeter theme to clearlooks and
+ default graphical greeter theme to Bluecurve specifically.
+
+- Change default path values (bug 154280)
+
+* Mon Apr 25 2005 Matthias Clasen <mclasen@redhat.com> 1:2.6.0.8-8
+- for early-login, delay XDMCP initialization until allow-login
+
+* Sun Apr 24 2005 Ray Strode <rstrode@redhat.com> 1:2.6.0.8-7
+- calling gdm_debug and g_strdup_printf from signal handlers are
+ bad news (Spotted by Mark McLoughlin <markmc@redhat.com>).
+
+* Tue Apr 19 2005 Matthias Clasen <mclasen@redhat.com> 1:2.6.0.8-6
+- Add a throbber for early login
+
+* Mon Apr 18 2005 Ray Strode <rstrode@redhat.com> 1:2.6.0.8-5
+- Don't install gnome.desktop to /usr/share/xsessions (bug 145791)
+
+* Thu Apr 14 2005 Matthias Clasen <mclasen@redhat.com> 1:2.6.0.8-4
+- Don't do early-login if firstboot is going to run
+- Make early-login work with timed and automatic logins
+
+* Wed Apr 13 2005 Ray Strode <rstrode@redhat.com> 1:2.6.0.8-3
+- Don't hard code dpi setting to 96.0, but instead look at
+ Xft.dpi
+
+* Wed Apr 13 2005 Ray Strode <rstrode@redhat.com> 1:2.6.0.8-2
+- touch /var/lock/subsys/gdm-early-login so gdm gets killed on
+ runlevel changes (bug 154414)
+- don't try to use system dpi settings for canvas text (bug 127532)
+- merge resource database from displays other than :0
+
+* Sat Apr 2 2005 Ray Strode <rstrode@redhat.com> 1:2.6.0.8-1
+- update to 2.6.0.8
+- add new init scripts to support early-login mode
+
+* Tue Mar 29 2005 Ray Strode <rstrode@redhat.com> 1:2.6.0.7-8
+- Add a --wait-for-bootup cmdline option.
+
+* Mon Mar 28 2005 Christopher Aillon <caillon@redhat.com>
+- rebuilt
+
+* Fri Mar 25 2005 Christopher Aillon <caillon@redhat.com> 1:2.6.0.7-6
+- Update the GTK+ theme icon cache on (un)install
+
+* Fri Mar 11 2005 Alexandre Oliva <aoliva@redhat.com> 1:2.6.0.7-5
+- fix patch for bug 149899 (fixes bug 150745)
+
+* Wed Mar 09 2005 Than Ngo <than@redhat.com> 1:2.6.0.7-4
+- add OnlyShowIn=GNOME;
+
+* Mon Feb 28 2005 Ray Strode <rstrode@redhat.com> 1:2.6.0.7-3
+- seteuid/egid as user before testing for presence of
+ user's home directory (fixes bug 149899)
+
+* Thu Feb 10 2005 Ray Strode <rstrode@redhat.com> 1:2.6.0.7-2
+- Turn off "switchdesk" mode by default which accidentally got
+ turned on by default in 2.6.0.5-4
+
+* Wed Feb 2 2005 Matthias Clasen <mclasen@redhat.com> 1:2.6.0.7-1
+- Update to 2.6.0.7
+
+* Tue Jan 25 2005 Ray Strode <rstrode@redhat.com> 1:2.6.0.5-11
+- Fix bug in greeter sort-session-list patch where selecting
+ a session did nothing (bug 145626)
+
+* Thu Dec 9 2004 Dan Walsh <dwalsh@redhat.com> 1:2.6.0.5-10
+- Remove pam_selinux from gdmsetup pam file
+
+* Wed Dec 1 2004 Ray Strode <rstrode@redhat.com> 1:2.6.0.5-9
+- Look up and use username instead of assuming that user entered
+ login is cannonical. Patch from
+ Mike Patnode <mike.patnode@centrify.com> (fixes bug 141380).
+
+* Thu Nov 11 2004 Ray Strode <rstrode@redhat.com> 1:2.6.0.5-8
+- Sort session list so that default session comes out on top
+ (fixes bug 107324)
+
+* Wed Nov 10 2004 Ray Strode <rstrode@redhat.com> 1:2.6.0.5-7
+- Make desktop file symlink instead of absolute (bug 104390)
+- Add flexiserver back to menus
+
+* Wed Oct 20 2004 Ray Strode <rstrode@redhat.com> 1:2.6.0.5-6
+- Clean up xses if the session was successfullly completed.
+ (fixes bug #136382)
+
+* Tue Oct 19 2004 Ray Strode <rstrode@redhat.com> 1:2.6.0.5-5
+- Prefer nb_NO over no_NO for Norwegian (fixes bug #136033)
+
+* Thu Oct 7 2004 Alexander Larsson <alexl@redhat.com> - 1:2.6.0.5-4
+- Change default greeter theme to "Default", require
+ redhat-artwork with Default symlink.
+
+* Wed Sep 29 2004 Ray Strode <rstrode@redhat.com> 1:2.6.0.5-3
+- Check if there is a selected node before using iterator.
+ (fixes bug #133329).
+
+* Fri Sep 24 2004 Ray Strode <rstrode@redhat.com> 1:2.6.0.5-2
+- Don't mess with gdmphotosetup categories. Upstream categories
+ are fine.
+
+* Mon Sep 20 2004 Ray Strode <rstrode@redhat.com> 1:2.6.0.5-1
+- update to 2.6.0.5
+
+* Tue Aug 3 2004 Matthias Clasen <mclasen@redhat.com> 1:2.6.0.3-5
+- fix messed up changelog
+
+* Tue Aug 3 2004 Matthias Clasen <mclasen@redhat.com> 1:2.6.0.3-4
+- rebuilt
+
+* Thu Aug 2 2004 Ray Strode <rstrode@redhat.com> 1:2.6.0.3-3
+- rebuilt
+
+* Mon Jul 26 2004 Bill Nottingham <notting@redhat.com> 1:2.6.0.3-2
+- fix theme (#128599)
+
+* Thu Jun 17 2004 Ray Strode <rstrode@redhat.com> 1:2.6.0.3-1
+- update to 2.6.0.3 (fixes bug #117677)
+
+* Tue Jun 15 2004 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Fri May 21 2004 Matthias Clasen <mclasen@redhat.com> 1:2.6.0.0-5
+- rebuild
+
+* Mon May 17 2004 Than Ngo <than@redhat.com> 1:2.6.0.0-4
+- add patch to build gdm-binary with PIE
+
+* Thu Apr 22 2004 Mark McLoughlin <markmc@redhat.com> - 1:2.6.0.0-3
+- Update the "use switchdesk" message to only be display when
+ switchdesk-gui is installed and to not reference a non existant
+ menu item (bug #121460)
+
+* Fri Apr 2 2004 Colin Walters <walters@redhat.com> 1:2.6.0.0-2
+- Always put session errors in /tmp, in preparation for
+ completely preventing gdm from writing to /home/
+
+* Thu Apr 1 2004 Alex Larsson <alexl@redhat.com> 1:2.6.0.0-1
+- update to 2.6.0.0
+
+* Tue Mar 16 2004 Dan Walsh <dwalsh@redhat.com> 1:2.5.90.3-1
+- Use selinux patch again
+
+* Tue Mar 16 2004 Dan Walsh <dwalsh@redhat.com> 1:2.5.90.3-1
+- Stop using selinux patch and use pam_selinux instead.
+
+* Wed Mar 10 2004 Alex Larsson <alexl@redhat.com> 1:2.5.90.2-1
+- update to 2.5.90.2
+
+* Tue Mar 02 2004 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Thu Feb 26 2004 Alexander Larsson <alexl@redhat.com> 1:2.5.90.1-1
+- update to 2.5.90.1
+
+* Fri Feb 13 2004 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Tue Feb 03 2004 Warren Togami <wtogami@redhat.com> 1:2.4.4.5-9
+- add two lines to match upstream CVS to xdmcp_sessions.patch
+ Fully resolves #110315 and #113154
+
+* Sun Feb 01 2004 Warren Togami <wtogami@redhat.com> 1:2.4.4.5-8
+- patch30 xdmcp_session counter fix from gdm-2.5.90.0 #110315
+- automake14 really needed, not automake
+- BR libcroco-devel, libcroco-devel, libattr-devel, gettext
+- conditionally BR libselinux-devel
+- explicit epoch in all deps
+- make the ja.po time format change with a sed expression rather than
+ overwriting the whole file (Petersen #113995)
+
+* Thu Jan 29 2004 Jeremy Katz <katzj@redhat.com> - 1:2.4.4.5-7
+- fix build with current auto*
+
+* Tue Jan 27 2004 Jeremy Katz <katzj@redhat.com> 1:2.4.4.5-5
+- try a simple rebuild for libcroco abi change
+
+* Mon Jan 26 2004 Dan Walsh <dwalsh@redhat.com> 1:2.4.4.5-4
+- Fix call to is_selinux_enabled
+
+* Fri Jan 16 2004 Dan Walsh <dwalsh@redhat.com> 1:2.4.4.5-3
+- Use /sbin/reboot and /sbin/poweroff instead of consolehelper version
+
+* Thu Oct 30 2003 Dan Walsh <dwalsh@redhat.com> 1:2.4.4.5-2.sel
+- turn on SELinux
+
+* Mon Oct 20 2003 Jonathan Blandford <jrb@redhat.com> 2:2.4.4.5-1
+- get rid of the teal
+
+* Fri Oct 17 2003 Jonathan Blandford <jrb@redhat.com> 1:2.4.4.5-1
+- new version
+
+* Thu Oct 9 2003 Jonathan Blandford <jrb@redhat.com> 1:2.4.4.3-6.sel
+- new patch from George to fix #106189
+- change bg color in rhdefaults patch
+- turn off SELinux
+
+* Thu Oct 8 2003 Dan Walsh <dwalsh@redhat.com> 1:2.4.4.3-6.sel
+- turn on SELinux
+
+* Tue Oct 7 2003 Alexander Larsson <alexl@redhat.com> 1:2.4.4.3-5
+- Fix greeter line-breaking crash (rest of #106189)
+
+* Tue Oct 7 2003 Alexander Larsson <alexl@redhat.com> 1:2.4.4.3-4
+- Set the BaseXSession properly in the config.
+- This fixes parts of bug #106189
+
+* Mon Oct 6 2003 Havoc Pennington <hp@redhat.com> 1:2.4.4.3-3
+- change DefaultSession=Default.desktop to DefaultSession=default.desktop
+- SELinux off again
+
+* Fri Oct 3 2003 Dan Walsh <dwalsh@redhat.com> 1:2.4.4.3-2.sel
+- turn on SELinux
+
+* Thu Oct 2 2003 Havoc Pennington <hp@redhat.com> 1:2.4.4.3-1
+- 2.4.4.3
+- --without-selinux for now, since libselinux not in the buildroot
+
+* Mon Sep 8 2003 Dan Walsh <dwalsh@redhat.com> 1:2.4.4.0-4
+- turn off SELinux
+
+* Fri Sep 5 2003 Dan Walsh <dwalsh@redhat.com> 1:2.4.4.0-3.sel
+- turn on SELinux
+
+* Thu Sep 4 2003 Alexander Larsson <alexl@redhat.com> 1:2.4.4.0-2
+- Use the right default session (#103546)
+
+* Wed Sep 3 2003 Alexander Larsson <alexl@redhat.com> 1:2.4.4.0-1
+- update to 2.4.4.0
+- update to georges new selinux patch
+
+* Fri Aug 29 2003 Elliot Lee <sopwith@redhat.com> 1:2.4.2.102-2
+- Remove scrollkeeper files
+
+* Tue Aug 26 2003 George Lebl <jirka@5z.com> 1:2.4.2.102-1
+- updated to 2.4.2.102
+- removed outdated patches
+- Use Xsetup_0 only for :0 since that's the way it works
+ for xdm
+- remove the gnome.desktop file, its going into gnome-session
+
+* Thu Aug 14 2003 Havoc Pennington <hp@redhat.com> 1:2.4.1.6-1
+- update to latest bugfix version on george's advice
+- remove setlocale patch that's upstream
+- remove console setup patches that are upstream
+
+* Thu Jun 12 2003 Dan Walsh <dwalsh@redhat.com> 2.4.1.3-9
+- Port to SELinux
+
+* Wed Jun 04 2003 Elliot Lee <sopwith@redhat.com>
+- rebuilt
+
+* Tue Jun 3 2003 Jeff Johnson <jbj@redhat.com>
+- add explicit epoch's where needed.
+
+* Sun May 04 2003 Florian La Roche <Florian.LaRoche@redhat.de>
+- fix post: localstatedir -> _localstatedir
+
+* Thu May 1 2003 Havoc Pennington <hp@redhat.com> 1:2.4.1.3-6
+- enable UTF-8 for CJK
+
+* Mon Feb 24 2003 Elliot Lee <sopwith@redhat.com>
+- debuginfo rebuild
+
+* Thu Feb 20 2003 Owen Taylor <otaylor@redhat.com>
+- Run the error dialogs under /bin/sh --login, so we
+ get lang.sh, and thus unicode_start running. Fixes
+ the X-doesn't-start dialog showing up as random
+ blinking characters.
+
+* Fri Feb 14 2003 Havoc Pennington <hp@redhat.com> 1:2.4.1.3-2
+- nuke buildreq Xft
+
+* Wed Feb 5 2003 Havoc Pennington <hp@redhat.com> 1:2.4.1.3-1
+- upgrade to 2.4.1.3
+
+* Mon Feb 3 2003 Matt Wilson <msw@redhat.com> 1:2.4.1.1-6
+- added gdm-2.4.1.1-64bit.patch to fix 64 bit crash in cookie
+ generation (#83334)
+
+* Mon Feb 3 2003 Owen Taylor <otaylor@redhat.com>
+- Add patch to fix problem where setting LC_COLLATE=C would give LC_MESSAGES=wa_BE (#82019)
+
+* Thu Jan 30 2003 Matt Wilson <msw@redhat.com> 1:2.4.1.1-3
+- fix pam.d entry, pam_env wasn't properly patched
+- disable optimizations on x86_64 to work around gcc bug
+
+* Wed Jan 22 2003 Tim Powers <timp@redhat.com>
+- rebuilt
+
+* Mon Jan 20 2003 Owen Taylor <otaylor@redhat.com>
+- Upgrade to 2.4.1.1 (Fixes #81907)
+- Redirect stdout of kill to /dev/null (#80814)
+
+* Thu Jan 9 2003 Havoc Pennington <hp@redhat.com>
+- 2.4.1.0
+- add patch from george to ask "are you sure?" for shutdown/reboot since it's now just one click away
+
+* Thu Dec 19 2002 Havoc Pennington <hp@redhat.com>
+- 2.4.0.12
+- update new patch for no-utf8-in-cjk
+- drop patch to photo setup, now upstream
+- drop confdocs patch now upstream
+- move all the gdm.conf changes into single "rhconfig" patch
+- remove "sid-fix" patch now upstream
+
+* Mon Nov 11 2002 Nalin Dahyabhai <nalin@redhat.com> 2.4.0.7-14
+- remove the directory part of module specifications from the PAM config files,
+ allowing the same PAM config to work for either arch on multilib boxes
+
+* Thu Sep 5 2002 Owen Taylor <otaylor@redhat.com>
+- Change zh_CN entry in language menu to zh_CN.GB18030
+
+* Thu Sep 5 2002 Akira TAGOH <tagoh@redhat.com> 2.4.0.7-12
+- copied gdm-ja.po to ja.po.
+
+* Mon Sep 2 2002 Owen Taylor <otaylor@redhat.com>
+- Fix problem where gdm was opening ~/.xsession-errors itself to bad effect
+
+* Sat Aug 31 2002 Havoc Pennington <hp@redhat.com>
+- include ja.po with new date format
+
+* Wed Aug 28 2002 Havoc Pennington <hp@redhat.com>
+- remove noreplace on gdm.conf #71309
+- make gnome-gdmsetup absolute, #72910
+
+* Wed Aug 28 2002 Havoc Pennington <hp@redhat.com>
+- put /usr/X11R6/bin in path for now fixes #72781
+- use proper i18n algorithm for word wrap, #71937
+- remove greek text from language picker due to lack
+ of greek font
+- reorder PAM config file #72657
+
+* Wed Aug 28 2002 Havoc Pennington <hp@redhat.com>
+- improve gdmsetup icon
+- remove GNOME session, we will instead put it in gnome-session
+- apply patch from george to make gdmphotosetup file selector
+ work
+
+* Mon Aug 26 2002 Elliot Lee <sopwith@redhat.com> 2.4.0.7-6
+- Patches for #64902, #66486, #68483, #71308
+- post-install script changes from the gdm.spec mentioned in #70965
+- noreplace on gdm.conf for #71309
+
+* Sun Aug 25 2002 Havoc Pennington <hp@redhat.com>
+- put in a patch from george to fix some setsid()/kill() confusion
+ possibly fixing #72295
+- turn off UseCirclesInEntry for now, fixes #72433
+
+* Tue Aug 20 2002 Alexander Larsson <alexl@redhat.com>
+- Set UseCirclesInEntry to true in config
+
+* Thu Aug 15 2002 Havoc Pennington <hp@redhat.com>
+- rename Gnome session to GNOME, this was just bugging me
+
+* Thu Aug 8 2002 Havoc Pennington <hp@redhat.com>
+- 2.4.0.7 with bugfixes George kindly did for me,
+ including mnemonics for the graphical greeter
+- use Wonderland gtk theme for the nongraphical greeter
+- remove patches that are now upstream
+
+* Tue Jul 30 2002 Havoc Pennington <hp@redhat.com>
+- update rhconfig patch
+- use pam_timestamp for the config tool
+- link to a desktop file in redhat-menus
+- update .gnome2 patch, filed upstream bug
+- 2.4.0.4
+- rebuild with new gail, librsvg2
+
+* Tue Jun 25 2002 Owen Taylor <otaylor@redhat.com>
+- Require redhat-artwork, make the default greeter theme Wonderland
+- Look for all configuration in .gnome2 not .gnome. This avoids problems
+ with changes in the set of session/lang.
+- Remove English from locale.alias, make most locales UTF-8
+- Call find_lang with the right name
+
+* Sun Jun 16 2002 Havoc Pennington <hp@redhat.com>
+- rebuild for new libs
+- put gdm-autologin pam config file in file list, hope
+ its absence wasn't deliberate
+- use desktop-file-install
+
+* Mon Jun 10 2002 Havoc Pennington <hp@redhat.com>
+- rebuild in different environment
+
+* Mon Jun 10 2002 Havoc Pennington <hp@redhat.com>
+- 2.4.0.0
+
+* Tue May 21 2002 Havoc Pennington <hp@redhat.com>
+- rebuild in different environment
+
+* Tue May 21 2002 Havoc Pennington <hp@redhat.com>
+- 2.3.90.3
+
+* Tue May 14 2002 Matt Wilson <msw@redhat.com> 2.3.90.2.90-1
+- pulled from current CVS, named it 2.3.90.2.90-1
+
+* Thu Feb 14 2002 Havoc Pennington <hp@redhat.com>
+- rebuild for new libs
+- add URL tag
+
+* Mon Feb 11 2002 Alex Larsson <alexl@redhat.com> 2.3.90.1.90-1
+- Updated to a cvs snapshot that has the new greeter.
+
+* Thu Jan 24 2002 Havoc Pennington <hp@redhat.com>
+- rebuild in rawhide
+
+* Tue Sep 4 2001 Havoc Pennington <hp@redhat.com>
+- fix #52997 (ukrainian in language list)
+
+* Fri Aug 31 2001 Havoc Pennington <hp@redhat.com>
+- Add po files from sources.redhat.com
+
+* Mon Aug 27 2001 Havoc Pennington <hp@redhat.com>
+- Add po files from sources.redhat.com
+
+* Wed Aug 15 2001 Nalin Dahyabhai <nalin@redhat.com>
+- set SESSION to true in console.apps control file
+
+* Tue Aug 14 2001 Havoc Pennington <hp@redhat.com>
+- change default title font to work in CJK, #51698
+
+* Wed Aug 8 2001 Bill Nottingham <notting@redhat.com>
+- fix %%pre for using /var/gdm as home dir
+
+* Sun Aug 5 2001 Nalin Dahyabhai <nalin@redhat.com>
+- Tweak PAM setup for gdmconfig to match other consolehelper users
+
+* Fri Aug 3 2001 Owen Taylor <otaylor@redhat.com>
+- Set RUNNING_UNDER_GDM when running display init script
+- Run xsri as the background program
+
+* Thu Aug 02 2001 Havoc Pennington <hp@redhat.com>
+- Change how session switching works, #49480
+- don't offer to make Failsafe the default, #49479
+
+* Thu Aug 02 2001 Havoc Pennington <hp@redhat.com>
+- clean up some format string mess, and don't
+ log username to syslog, #5681
+- own some directories #50692
+
+* Wed Aug 01 2001 Havoc Pennington <hp@redhat.com>
+- require/buildrequire latest gnome-libs, to compensate
+ for upstream crackrock. #50554
+
+* Tue Jul 31 2001 Havoc Pennington <hp@redhat.com>
+- get rid of GiveConsole/TakeConsole, bug #33710
+
+* Sun Jul 22 2001 Havoc Pennington <hp@redhat.com>
+- use Raleigh theme for gdm
+
+* Thu Jul 19 2001 Havoc Pennington <hp@redhat.com>
+- depend on usermode, xinitrc
+
+* Thu Jul 19 2001 Havoc Pennington <hp@redhat.com>
+- build requires pam-devel, should fix #49448
+
+* Mon Jul 16 2001 Havoc Pennington <hp@redhat.com>
+- log to /var/log/gdm/*
+
+* Mon Jul 16 2001 Havoc Pennington <hp@redhat.com>
+- make Halt... power off
+
+* Tue Jul 10 2001 Havoc Pennington <hp@redhat.com>
+- gdm user's homedir to /var/gdm not /home/gdm
+
+* Mon Jul 09 2001 Havoc Pennington <hp@redhat.com>
+- put pam.d/gdm back in file list
+
+* Sun Jul 08 2001 Havoc Pennington <hp@redhat.com>
+- upgrade to 2.2.3.1, pray this fixes more than it breaks
+
+* Thu Jul 05 2001 Havoc Pennington <hp@redhat.com>
+- add "rpm" user to those not to show in greeter
+
+* Tue Jul 03 2001 Havoc Pennington <hp@redhat.com>
+- Upgrade to 2.2.3
+- require usermode since configure script now checks for it
+
+* Fri Jun 01 2001 Havoc Pennington <hp@redhat.com>
+- Prereq for scrollkeeper-update
+
+* Thu May 30 2001 Havoc Pennington <hp@redhat.com>
+- New CVS snap with the "no weird sessions" options;
+ more default settings changes
+
+* Wed May 30 2001 Havoc Pennington <hp@redhat.com>
+- Change a bunch of default settings; remaining fixes will involve C hacking
+
+* Wed May 30 2001 Havoc Pennington <hp@redhat.com>
+- After, oh, 2 years or so, finally upgrade version and set
+ release to 1. Remove all hacks and patches, pretty much;
+ this will break a few things, will be putting them back
+ via GNOME CVS. All changes should go in 'gdm2' module in
+ CVS for now.
+
+ This RPM enables all kinds of features that I'm going to turn
+ off shortly, so don't get excited about them. ;-)
+
+* Thu Mar 22 2001 Nalin Dahyabhai <nalin@redhat.com>
+- reinitialize pam credentials after calling initgroups() -- the
+ credentials may be group memberships
+
+* Mon Mar 19 2001 Owen Taylor <otaylor@redhat.com>
+- Fix colors patch
+
+* Thu Mar 15 2001 Havoc Pennington <hp@redhat.com>
+- translations
+
+* Mon Mar 5 2001 Preston Brown <pbrown@redhat.com>
+- don't screw up color map on 8 bit displays
+
+* Fri Feb 23 2001 Trond Eivind Glomsrød <teg@redhat.com>
+- langify
+- Don't define and use "ver" and "nam" at the top of the spec file
+- use %%{_tmppath}
+
+* Tue Feb 13 2001 Tim Powers <timp@redhat.com>
+- don't allow gdm to show some system accounts in the browser bugzilla
+ #26898
+
+* Fri Jan 19 2001 Akira TAGOH <tagoh@redhat.com>
+- Updated Japanese translation.
+
+* Tue Jan 02 2001 Havoc Pennington <hp@redhat.com>
+- add another close() to the fdleak patch, bugzilla #22794
+
+* Sun Aug 13 2000 Owen Taylor <otaylor@redhat.com>
+- Return to toplevel main loop and start Xdcmp if enabled
+ (Bug #16106)
+
+* Fri Aug 11 2000 Jonathan Blandford <jrb@redhat.com>
+- Up Epoch and release
+
+* Wed Aug 02 2000 Havoc Pennington <hp@redhat.com>
+- Requires Xsession script
+
+* Wed Jul 19 2000 Owen Taylor <otaylor@redhat.com>
+- Italian is better as it_IT than it_CH (bugzilla 12425)
+
+* Mon Jul 17 2000 Jonathan Blandford <jrb@redhat.com>
+- Don't instally gdmconfig as it doesn't work.
+
+* Fri Jul 14 2000 Havoc Pennington <hp@redhat.com>
+- Rearrange code to avoid calling innumerable system calls
+ in a signal handler
+
+* Fri Jul 14 2000 Havoc Pennington <hp@redhat.com>
+- Verbose debug spew for infinite loop stuff
+
+* Fri Jul 14 2000 Havoc Pennington <hp@redhat.com>
+- Try to fix infinite loops on X server failure
+
+* Thu Jul 13 2000 Prospector <bugzilla@redhat.com>
+- automatic rebuild
+
+* Thu Jun 29 2000 Havoc Pennington <hp@redhat.com>
+- Remove Docdir
+
+* Mon Jun 19 2000 Havoc Pennington <hp@redhat.com>
+- Fix file descriptor leak (Bugzilla 12301)
+
+* Mon Jun 19 2000 Havoc Pennington <hp@redhat.com>
+- Apply security errata patch we released for 6.2
+- Add Gnome.session back, don't know when it disappeared or why
+
+* Thu Jun 1 2000 Nalin Dahyabhai <nalin@redhat.com>
+- modify PAM setup to use system-auth
+
+* Fri May 19 2000 Havoc Pennington <hp@redhat.com>
+- rebuild for the Winston tree
+
+* Fri Feb 04 2000 Havoc Pennington <hp@redhat.com>
+- Modify Default.session and Failsafe.session not to add -login option to bash
+- exec the session scripts with the user's shell with a hyphen prepended
+- doesn't seem to actually work yet with tcsh, but it doesn't seem to
+ break anything. needs a look to see why it doesn't work
+
+* Fri Feb 04 2000 Havoc Pennington <hp@redhat.com>
+- Link PreSession/Default to xdm/GiveConsole
+- Link PostSession/Default to xdm/TakeConsole
+
+* Fri Feb 04 2000 Havoc Pennington <hp@redhat.com>
+- Fix the fix to the fix (8877)
+- remove docs/gdm-manual.txt which doesn't seem to exist from %%doc
+
+* Fri Feb 04 2000 Havoc Pennington <hp@redhat.com>
+- Enhance 8877 fix by not deleting the "Please login"
+ message
+
+* Fri Feb 04 2000 Havoc Pennington <hp@redhat.com>
+- Try to fix bug 8877 by clearing the message below
+ the entry box when the prompt changes. may turn
+ out to be a bad idea.
+
+* Mon Jan 17 2000 Elliot Lee <sopwith@redhat.com>
+- Fix bug #7666: exec Xsession instead of just running it
+
+* Mon Oct 25 1999 Jakub Jelinek <jakub@redhat.com>
+- Work around so that russian works (uses koi8-r instead
+ of the default iso8859-5)
+
+* Tue Oct 12 1999 Owen Taylor <otaylor@redhat.com>
+- Try again
+
+* Tue Oct 12 1999 Owen Taylor <otaylor@redhat.com>
+- More fixes for i18n
+
+* Tue Oct 12 1999 Owen Taylor <otaylor@redhat.com>
+- Fixes for i18n
+
+* Fri Sep 26 1999 Elliot Lee <sopwith@redhat.com>
+- Fixed pipewrite bug (found by mkj & ewt).
+
+* Fri Sep 17 1999 Michael Fulbright <drmike@redhat.com>
+- added requires for pam >= 0.68
+
+* Fri Sep 10 1999 Elliot Lee <sopwith@redhat.com>
+- I just update this package every five minutes, so any recent changes are my fault.
+
+* Thu Sep 02 1999 Michael K. Johnson <johnsonm@redhat.com>
+- built gdm-2.0beta2
+
+* Mon Aug 30 1999 Michael K. Johnson <johnsonm@redhat.com>
+- built gdm-2.0beta1
+
+* Tue Aug 17 1999 Michael Fulbright <drmike@redhat.com>
+- included rmeier@liberate.com patch for tcp socket X connections
+
+* Mon Apr 19 1999 Michael Fulbright <drmike@redhat.com>
+- fix to handling ancient gdm config files with non-standard language specs
+- dont close display connection for xdmcp connections, else we die if remote
+ end dies.
+
+* Fri Apr 16 1999 Michael Fulbright <drmike@redhat.com>
+- fix language handling to set GDM_LANG variable so gnome-session
+ can pick it up
+
+* Wed Apr 14 1999 Michael Fulbright <drmike@redhat.com>
+- fix so certain dialog boxes dont overwrite background images
+
+* Wed Apr 14 1999 Michael K. Johnson <johnsonm@redhat.com>
+- do not specify -r 42 to useradd -- it doesn't know how to fall back
+ if id 42 is already taken
+
+* Fri Apr 9 1999 Michael Fulbright <drmike@redhat.com>
+- removed suspend feature
+
+* Mon Apr 5 1999 Jonathan Blandford <jrb@redhat.com>
+- added patch from otaylor to not call gtk funcs from a signal.
+- added patch to tab when username not added.
+- added patch to center About box (and bring up only one) and ignore "~"
+ and ".rpm" files.
+
+* Fri Mar 26 1999 Michael Fulbright <drmike@redhat.com>
+- fixed handling of default session, merged all gdmgreeter patches into one
+
+* Tue Mar 23 1999 Michael Fulbright <drmike@redhat.com>
+- remove GNOME/KDE/AnotherLevel session scripts, these have been moved to
+ the appropriate packages instead.
+- added patch to make option menus always active (security problem otherwise)
+- added jrb's patch to disable stars in passwd entry field
+
+* Fri Mar 19 1999 Michael Fulbright <drmike@redhat.com>
+- made sure /usr/bin isnt in default path twice
+- strip binaries
+
+* Wed Mar 17 1999 Michael Fulbright <drmike@redhat.com>
+- fixed to use proper system path when root logs in
+
+* Tue Mar 16 1999 Michael Fulbright <drmike@redhat.com>
+- linked Init/Default to Red Hat default init script for xdm
+- removed logo from login dialog box
+
+* Mon Mar 15 1999 Michael Johnson <johnsonm@redhat.com>
+- pam_console integration
+
+* Tue Mar 09 1999 Michael Fulbright <drmike@redhat.com>
+- added session files for GNOME/KDE/AnotherLevel/Default/Failsafe
+- patched gdmgreeter to not complete usernames
+- patched gdmgreeter to not safe selected session permanently
+- patched gdmgreeter to center dialog boxes
+
+* Mon Mar 08 1999 Michael Fulbright <drmike@redhat.com>
+- removed comments from gdm.conf file, these are not parsed correctly
+
+* Sun Mar 07 1999 Michael Fulbright <drmike@redhat.com>
+- updated source line for accuracy
+
+* Fri Feb 26 1999 Owen Taylor <otaylor@redhat.com>
+- Updated patches for 1.0.0
+- Fixed some problems in 1.0.0 with installation directories
+- moved /usr/var/gdm /var/gdm
+
+* Thu Feb 25 1999 Michael Fulbright <drmike@redhat.com>
+- moved files from /usr/etc to /etc
+
+* Tue Feb 16 1999 Michael Johnson <johnsonm@redhat.com>
+- removed commented-out #1 definition -- put back after testing gnome-libs
+ comment patch
+
+* Sat Feb 06 1999 Michael Johnson <johnsonm@redhat.com>
+- initial packaging
diff --git a/org.gnome.login-screen.gschema.override b/org.gnome.login-screen.gschema.override
new file mode 100644
index 0000000..d018c5e
--- /dev/null
+++ b/org.gnome.login-screen.gschema.override
@@ -0,0 +1,3 @@
+[org.gnome.login-screen]
+logo='/usr/share/pixmaps/fedora-gdm-logo.png'
+enable-smartcard-authentication=false
diff --git a/sources b/sources
new file mode 100644
index 0000000..14f789d
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+fa32fee88d242ebf5d1c2fb69e74457e gdm-40.1.tar.xz