You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
6.0 KiB
155 lines
6.0 KiB
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 |
|
|
|
|