- Fix login screen for machines that boot to fast

- Fix autologin crash
This commit is contained in:
Ray Strode 2018-10-06 09:46:25 -04:00
parent 832f46bb0d
commit f517b81933
4 changed files with 670 additions and 9 deletions

View File

@ -0,0 +1,566 @@
From 757e620a8dd26902215a332af71cfcdf08574803 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Thu, 4 Oct 2018 10:40:41 -0400
Subject: [PATCH] local-display-factory: defer initialization for
CanGraphical=no seats
During startup a seat may not be ready for a display server yet.
This commit changes GDM to wait until the seat reports that it is
CanGraphical capable, before trying to put a login screen on it.
Closes https://gitlab.gnome.org/bugzilla-migration/gdm/issues/103
---
daemon/gdm-local-display-factory.c | 132 +++++++++++++++++++++++++++--
1 file changed, 126 insertions(+), 6 deletions(-)
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
index 891c25375..5430085ea 100644
--- a/daemon/gdm-local-display-factory.c
+++ b/daemon/gdm-local-display-factory.c
@@ -29,92 +29,98 @@
#include <gio/gio.h>
#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_LOCAL_DISPLAY_FACTORY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_LOCAL_DISPLAY_FACTORY, GdmLocalDisplayFactoryPrivate))
#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 */
struct GdmLocalDisplayFactoryPrivate
{
GdmDBusLocalDisplayFactory *skeleton;
GDBusConnection *connection;
GHashTable *used_display_numbers;
+ GHashTable *seat_proxies;
/* FIXME: this needs to be per seat? */
guint num_failures;
guint seat_new_id;
guint seat_removed_id;
#if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER)
char *tty_of_active_vt;
guint active_vt_watch_id;
guint wait_to_finish_timeout_id;
#endif
};
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 GdmDisplay *create_display (GdmLocalDisplayFactory *factory,
const char *seat_id,
const char *session_type,
gboolean initial_display);
static void on_display_status_changed (GdmDisplay *display,
GParamSpec *arg1,
GdmLocalDisplayFactory *factory);
static gboolean gdm_local_display_factory_sync_seats (GdmLocalDisplayFactory *factory);
+
+static gboolean create_seat_proxy (GdmLocalDisplayFactory *self,
+ const char *seat_id,
+ const char *seat_path);
+
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) {
ret = g_quark_from_static_string ("gdm_local_display_factory_error");
}
return ret;
}
static void
listify_hash (gpointer key,
GdmDisplay *display,
GList **list)
{
*list = g_list_prepend (*list, key);
}
static int
sort_nums (gpointer a,
gpointer b)
{
@@ -409,60 +415,61 @@ lookup_by_seat_id (const char *id,
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);
}
static GdmDisplay *
create_display (GdmLocalDisplayFactory *factory,
const char *seat_id,
const char *session_type,
gboolean initial)
{
GdmDisplayStore *store;
GdmDisplay *display = NULL;
g_autofree char *login_session_id = NULL;
g_debug ("GdmLocalDisplayFactory: %s login display for seat %s requested",
session_type? : "X11", seat_id);
+
store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
if (sd_seat_can_multi_session (seat_id))
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 NULL;
}
/* 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->priv->connection, seat_id, login_session_id);
return NULL;
}
}
@@ -493,131 +500,236 @@ create_display (GdmLocalDisplayFactory *factory,
/* let store own the ref */
g_object_unref (display);
if (! gdm_display_manage (display)) {
gdm_display_unmanage (display);
}
return display;
}
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)
{
GError *error = NULL;
GVariant *result;
GVariant *array;
GVariantIter iter;
- const char *seat;
+ const char *seat, *path;
g_debug ("GdmLocalDisplayFactory: enumerating seats from logind");
result = g_dbus_connection_call_sync (factory->priv->connection,
"org.freedesktop.login1",
"/org/freedesktop/login1",
"org.freedesktop.login1.Manager",
"ListSeats",
NULL,
G_VARIANT_TYPE ("(a(so))"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL, &error);
if (!result) {
g_warning ("GdmLocalDisplayFactory: Failed to issue method call: %s", error->message);
g_clear_error (&error);
return FALSE;
}
array = g_variant_get_child_value (result, 0);
g_variant_iter_init (&iter, array);
- while (g_variant_iter_loop (&iter, "(&so)", &seat, NULL)) {
+ while (g_variant_iter_loop (&iter, "(&s&o)", &seat, &path)) {
gboolean is_initial;
const char *session_type = NULL;
if (g_strcmp0 (seat, "seat0") == 0) {
is_initial = TRUE;
if (gdm_local_display_factory_use_wayland ())
session_type = "wayland";
} else {
is_initial = FALSE;
}
+ if (!create_seat_proxy (factory, seat, path))
+ continue;
+
+ if (!sd_seat_can_graphical (seat)) {
+ g_debug ("GdmLocalDisplayFactory: seat %s not ready for graphical displays", seat);
+ continue;
+ }
+
create_display (factory, seat, session_type, is_initial);
}
g_variant_unref (result);
g_variant_unref (array);
return TRUE;
}
+static void
+on_seat_proxy_properties_changed (GDBusProxy *proxy,
+ GVariant *changed_properties,
+ char **invalidated_properties,
+ gpointer user_data)
+{
+ GdmLocalDisplayFactory *factory = GDM_LOCAL_DISPLAY_FACTORY (user_data);
+ g_autoptr (GVariant) value = NULL;
+ const char *seat;
+
+ value = g_variant_lookup_value (changed_properties, "CanGraphical", G_VARIANT_TYPE_BOOLEAN);
+
+ if (!value)
+ return;
+
+ g_debug ("GdmLocalDisplayFactory: CanGraphical changed");
+
+ seat = g_object_get_data (G_OBJECT (proxy), "seat-id");
+
+ if (!seat)
+ return;
+
+ if (g_variant_get_boolean (value)) {
+ gboolean is_initial;
+ const char *session_type = NULL;
+
+ g_debug ("GdmLocalDisplayFactory: seat '%s' now graphical", seat);
+
+ if (g_strcmp0 (seat, "seat0") == 0) {
+ is_initial = TRUE;
+ if (gdm_local_display_factory_use_wayland ())
+ session_type = "wayland";
+ } else {
+ is_initial = FALSE;
+ }
+
+ create_display (factory, seat, session_type, is_initial);
+ } else {
+ g_debug ("GdmLocalDisplayFactory: seat '%s' no longer graphical", seat);
+ delete_display (factory, seat);
+ }
+}
+
+static gboolean
+create_seat_proxy (GdmLocalDisplayFactory *self,
+ const char *seat,
+ const char *path)
+{
+ g_autoptr (GDBusProxy) proxy = NULL;
+ g_autoptr (GError) error = NULL;
+
+ g_debug ("GdmLocalDisplayFactory: creating seat proxy for seat '%s' with path '%s'",
+ seat, path);
+
+ proxy = g_dbus_proxy_new_sync (self->priv->connection,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ "org.freedesktop.login1",
+ path,
+ "org.freedesktop.login1.Seat",
+ NULL,
+ &error);
+
+ if (proxy == NULL) {
+ g_debug ("GdmLocalDisplayFactory: failed to get proxy to seat '%s' from logind: %s",
+ seat, error->message);
+ return FALSE;
+ }
+
+ g_hash_table_insert (self->priv->seat_proxies, g_strdup (seat), g_object_ref (proxy));
+ g_object_set_data_full (G_OBJECT (proxy), "seat-id", g_strdup (seat), (GDestroyNotify) g_free);
+ g_signal_connect_object (G_OBJECT (proxy),
+ "g-properties-changed",
+ G_CALLBACK (on_seat_proxy_properties_changed),
+ self,
+ 0);
+
+ return TRUE;
+}
+
static void
on_seat_new (GDBusConnection *connection,
const gchar *sender_name,
const gchar *object_path,
const gchar *interface_name,
const gchar *signal_name,
GVariant *parameters,
gpointer user_data)
{
- const char *seat;
+ GdmLocalDisplayFactory *factory = GDM_LOCAL_DISPLAY_FACTORY (user_data);
+ const char *seat, *path;
- g_variant_get (parameters, "(&s&o)", &seat, NULL);
- create_display (GDM_LOCAL_DISPLAY_FACTORY (user_data), seat, NULL, FALSE);
+ g_variant_get (parameters, "(&s&o)", &seat, &path);
+
+ g_debug ("GdmLocalDisplayFactory: new seat '%s' available", seat);
+
+ if (!create_seat_proxy (factory, seat, path))
+ return;
+
+ if (!sd_seat_can_graphical (seat)) {
+ g_debug ("GdmLocalDisplayFactory: but not yet ready for graphical displays");
+ return;
+ }
+
+ create_display (factory, seat, NULL, FALSE);
}
static void
on_seat_removed (GDBusConnection *connection,
const gchar *sender_name,
const gchar *object_path,
const gchar *interface_name,
const gchar *signal_name,
GVariant *parameters,
gpointer user_data)
{
+ GdmLocalDisplayFactory *factory = GDM_LOCAL_DISPLAY_FACTORY (user_data);
const char *seat;
g_variant_get (parameters, "(&s&o)", &seat, NULL);
- delete_display (GDM_LOCAL_DISPLAY_FACTORY (user_data), seat);
+
+ g_debug ("GdmLocalDisplayFactory: seat '%s' no longer available", seat);
+
+ g_hash_table_remove (factory->priv->seat_proxies, (gpointer) seat);
+ delete_display (factory, 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;
}
#if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER)
static gboolean
wait_to_finish_timeout (GdmLocalDisplayFactory *factory)
{
finish_waiting_displays_on_seat (factory, "seat0");
factory->priv->wait_to_finish_timeout_id = 0;
return G_SOURCE_REMOVE;
}
static void
maybe_stop_greeter_in_background (GdmLocalDisplayFactory *factory,
GdmDisplay *display)
{
g_autofree char *display_session_type = NULL;
gboolean doing_initial_setup = FALSE;
@@ -737,60 +849,65 @@ on_vt_changed (GIOChannel *source,
g_debug ("GdmLocalDisplayFactory: tty of login window is %s", tty_of_login_window_vt);
if (g_strcmp0 (tty_of_login_window_vt, tty_of_previous_vt) == 0) {
GdmDisplayStore *store;
GdmDisplay *display;
g_debug ("GdmLocalDisplayFactory: VT switched from login window");
store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
display = gdm_display_store_find (store,
lookup_by_session_id,
(gpointer) login_session_id);
if (display != NULL)
maybe_stop_greeter_in_background (factory, display);
} else {
g_debug ("GdmLocalDisplayFactory: VT not switched from login window");
}
}
}
/* 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 (strcmp (factory->priv->tty_of_active_vt, tty_of_initial_vt) != 0) {
g_debug ("GdmLocalDisplayFactory: active VT is not initial VT, so ignoring");
return G_SOURCE_CONTINUE;
}
+ if (!sd_seat_can_graphical ("seat0")) {
+ g_debug ("GdmLocalDisplayFactory: seat0 not yet ready for graphical displays");
+ return G_SOURCE_CONTINUE;
+ }
+
if (gdm_local_display_factory_use_wayland ())
session_type = "wayland";
g_debug ("GdmLocalDisplayFactory: creating new display on seat0 because of VT change");
create_display (factory, "seat0", session_type, TRUE);
return G_SOURCE_CONTINUE;
}
#endif
static void
gdm_local_display_factory_start_monitor (GdmLocalDisplayFactory *factory)
{
g_autoptr (GIOChannel) io_channel = NULL;
factory->priv->seat_new_id = g_dbus_connection_signal_subscribe (factory->priv->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->priv->seat_removed_id = g_dbus_connection_signal_subscribe (factory->priv->connection,
"org.freedesktop.login1",
"org.freedesktop.login1.Manager",
"SeatRemoved",
@@ -1014,69 +1131,72 @@ gdm_local_display_factory_constructor (GType type,
if (! res) {
g_warning ("Unable to register local display factory with system bus");
}
return G_OBJECT (factory);
}
static void
gdm_local_display_factory_class_init (GdmLocalDisplayFactoryClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GdmDisplayFactoryClass *factory_class = GDM_DISPLAY_FACTORY_CLASS (klass);
object_class->get_property = gdm_local_display_factory_get_property;
object_class->set_property = gdm_local_display_factory_set_property;
object_class->finalize = gdm_local_display_factory_finalize;
object_class->constructor = gdm_local_display_factory_constructor;
factory_class->start = gdm_local_display_factory_start;
factory_class->stop = gdm_local_display_factory_stop;
g_type_class_add_private (klass, sizeof (GdmLocalDisplayFactoryPrivate));
}
static void
gdm_local_display_factory_init (GdmLocalDisplayFactory *factory)
{
factory->priv = GDM_LOCAL_DISPLAY_FACTORY_GET_PRIVATE (factory);
factory->priv->used_display_numbers = g_hash_table_new (NULL, NULL);
+ factory->priv->seat_proxies = g_hash_table_new_full (NULL, NULL, g_free, g_object_unref);
}
static void
gdm_local_display_factory_finalize (GObject *object)
{
GdmLocalDisplayFactory *factory;
g_return_if_fail (object != NULL);
g_return_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (object));
factory = GDM_LOCAL_DISPLAY_FACTORY (object);
g_return_if_fail (factory->priv != NULL);
+ g_hash_table_destroy (factory->priv->seat_proxies);
+
g_clear_object (&factory->priv->connection);
g_clear_object (&factory->priv->skeleton);
g_hash_table_destroy (factory->priv->used_display_numbers);
gdm_local_display_factory_stop_monitor (factory);
G_OBJECT_CLASS (gdm_local_display_factory_parent_class)->finalize (object);
}
GdmLocalDisplayFactory *
gdm_local_display_factory_new (GdmDisplayStore *store)
{
if (local_display_factory_object != NULL) {
g_object_ref (local_display_factory_object);
} else {
local_display_factory_object = g_object_new (GDM_TYPE_LOCAL_DISPLAY_FACTORY,
"display-store", store,
NULL);
g_object_add_weak_pointer (local_display_factory_object,
(gpointer *) &local_display_factory_object);
}
return GDM_LOCAL_DISPLAY_FACTORY (local_display_factory_object);
}
--
2.17.1

View File

@ -0,0 +1,87 @@
From a3904bf5f9e6fe6bc3bb2ad9c856cf1361b8194d Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 1 Oct 2018 11:05:57 -0400
Subject: [PATCH] manager: correct display confusion
commit c5c5bf1f reworked autologin and broke it.
This commit addresses the breakage by accessing
the proper display variable.
Closes https://gitlab.gnome.org/GNOME/gdm/issues/426
---
daemon/gdm-manager.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index b1e9b68be..62a967389 100644
--- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c
@@ -1662,62 +1662,62 @@ on_start_user_session (StartUserSessionOperation *operation)
if (gdm_display_get_status (display) == GDM_DISPLAY_MANAGED) {
g_debug ("GdmManager: closing down initial setup display");
gdm_display_stop_greeter_session (display);
gdm_display_unmanage (display);
gdm_display_finish (display);
}
} else {
g_debug ("GdmManager: session has its display server, reusing our server for another login screen");
}
/* The user session is going to follow the session worker
* into the new display. Untie it from this display and
* create a new session for a future user login. */
allowed_uid = gdm_session_get_allowed_user (operation->session);
g_object_set_data (G_OBJECT (display), "gdm-user-session", NULL);
g_object_set_data (G_OBJECT (operation->session), "gdm-display", NULL);
create_user_session_for_display (operation->manager, display, allowed_uid);
/* Give the user session a new display object for bookkeeping purposes */
create_display_for_user_session (operation->manager,
operation->session,
session_id);
if (g_strcmp0 (operation->service_name, "gdm-autologin") == 0) {
/* remove the unused prepared greeter display since we're not going
* to have a greeter */
gdm_display_store_remove (self->priv->display_store, display);
g_object_unref (display);
- self->priv->automatic_login_display = g_object_get_data (G_OBJECT (operation->session), "gdm-display");
- g_object_add_weak_pointer (G_OBJECT (display), (gpointer *) &self->priv->automatic_login_display);
+ self->priv->automatic_login_display = g_object_get_data (G_OBJECT (operation->session), "gdm-display");
+ g_object_add_weak_pointer (G_OBJECT (self->priv->automatic_login_display), (gpointer *) &self->priv->automatic_login_display);
}
}
start_user_session (operation->manager, operation);
out:
return G_SOURCE_REMOVE;
}
static void
queue_start_user_session (GdmManager *manager,
GdmSession *session,
const char *service_name)
{
StartUserSessionOperation *operation;
operation = g_slice_new0 (StartUserSessionOperation);
operation->manager = manager;
operation->session = g_object_ref (session);
operation->service_name = g_strdup (service_name);
operation->idle_id = g_idle_add ((GSourceFunc) on_start_user_session, operation);
g_object_set_data (G_OBJECT (session), "start-user-session-operation", operation);
}
static void
start_user_session_if_ready (GdmManager *manager,
GdmSession *session,
const char *service_name)
{
--
2.17.1

View File

@ -1,4 +1,4 @@
From 03cd095d78fed6632e32ed933d71b8819d86afab Mon Sep 17 00:00:00 2001
From 1984b36ba08506ea65dcb95e565f7d24ecbd1703 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Thu, 6 Sep 2018 19:31:50 -0400
Subject: [PATCH] manager: do initial-setup post work in manager code
@ -18,7 +18,7 @@ This commit moves the code to a more logical place.
2 files changed, 132 insertions(+), 132 deletions(-)
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
index 878be88da..c036a0a5c 100644
index 5e193f2f5..511a5ca3f 100644
--- a/daemon/gdm-display.c
+++ b/daemon/gdm-display.c
@@ -22,61 +22,60 @@
@ -215,7 +215,7 @@ index 878be88da..c036a0a5c 100644
const char *
gdm_display_get_session_id (GdmDisplay *self)
{
@@ -1660,145 +1588,85 @@ gdm_display_start_greeter_session (GdmDisplay *self)
@@ -1631,145 +1559,85 @@ gdm_display_start_greeter_session (GdmDisplay *self)
G_CALLBACK (on_launch_environment_session_stopped),
self, 0);
g_signal_connect_object (self->priv->launch_environment,
@ -362,7 +362,7 @@ index 878be88da..c036a0a5c 100644
xcb_intern_atom_cookie_t atom_cookie;
xcb_intern_atom_reply_t *atom_reply = NULL;
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index b1e9b68be..7a0832977 100644
index 62a967389..4d2ad9dec 100644
--- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c
@@ -35,60 +35,61 @@
@ -683,12 +683,12 @@ index b1e9b68be..7a0832977 100644
gdm_display_store_remove (self->priv->display_store, display);
g_object_unref (display);
self->priv->automatic_login_display = g_object_get_data (G_OBJECT (operation->session), "gdm-display");
g_object_add_weak_pointer (G_OBJECT (display), (gpointer *) &self->priv->automatic_login_display);
self->priv->automatic_login_display = g_object_get_data (G_OBJECT (operation->session), "gdm-display");
g_object_add_weak_pointer (G_OBJECT (self->priv->automatic_login_display), (gpointer *) &self->priv->automatic_login_display);
}
}
start_user_session (operation->manager, operation);
--
2.19.0
2.17.1

View File

@ -10,7 +10,7 @@
Name: gdm
Epoch: 1
Version: 3.30.1
Release: 1%{?dist}
Release: 2%{?dist}
Summary: The GNOME Display Manager
License: GPLv2+
@ -19,7 +19,11 @@ Source0: http://download.gnome.org/sources/gdm/3.29/gdm-%{version}.tar.xz
Source1: org.gnome.login-screen.gschema.override
Patch0: 0001-Honor-initial-setup-being-disabled-by-distro-install.patch
Patch11: 0001-manager-do-initial-setup-post-work-in-manager-code.patch
Patch11: 0001-manager-correct-display-confusion.patch
Patch21: 0001-local-display-factory-defer-initialization-for-CanGr.patch
Patch31: 0001-manager-do-initial-setup-post-work-in-manager-code.patch
Patch99: system-dconf.patch
@ -314,6 +318,10 @@ fi
%{_libdir}/pkgconfig/gdm-pam-extensions.pc
%changelog
* 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