From 9791ab077c5ada6ded2f9d9e5553475ba3428530 Mon Sep 17 00:00:00 2001 From: lyn1001 Date: Mon, 8 Apr 2024 13:22:31 +0800 Subject: [PATCH] daemon Don't error on shutdown diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c index 46d5a77..c785a6a 100644 --- a/daemon/gdm-display.c +++ b/daemon/gdm-display.c @@ -93,6 +93,7 @@ typedef struct _GdmDisplayPrivate guint have_existing_user_accounts : 1; guint doing_initial_setup : 1; guint session_registered : 1; + guint shutting_down : 1; GStrv supported_session_types; } GdmDisplayPrivate; @@ -119,6 +120,7 @@ enum { PROP_DOING_INITIAL_SETUP, PROP_SESSION_REGISTERED, PROP_SUPPORTED_SESSION_TYPES, + PROP_SHUTTING_DOWN, }; static void gdm_display_class_init (GdmDisplayClass *klass); @@ -691,8 +693,7 @@ gdm_display_unmanage (GdmDisplay *self) g_object_unref (priv->access_file); priv->access_file = NULL; } - - if (!priv->session_registered) { + if (!priv->session_registered && !priv->shutting_down) { g_warning ("GdmDisplay: Session never registered, failing"); _gdm_display_set_status (self, GDM_DISPLAY_FAILED); } else { @@ -878,6 +879,16 @@ _gdm_display_set_session_registered (GdmDisplay *self, priv->session_registered = registered; } +static void +_gdm_display_set_shutting_down (GdmDisplay *self, + gboolean shutting_down) +{ + GdmDisplayPrivate *priv; + + priv = gdm_display_get_instance_private (self); + priv->shutting_down = shutting_down; +} + static void _gdm_display_set_launch_environment (GdmDisplay *self, GdmLaunchEnvironment *launch_environment) @@ -989,6 +1000,9 @@ gdm_display_set_property (GObject *object, case PROP_SUPPORTED_SESSION_TYPES: _gdm_display_set_supported_session_types (self, g_value_get_boxed (value)); break; + case PROP_SHUTTING_DOWN: + _gdm_display_set_shutting_down (self, g_value_get_boolean (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1070,6 +1084,9 @@ gdm_display_get_property (GObject *object, case PROP_SUPPORTED_SESSION_TYPES: g_value_set_boxed (value, priv->supported_session_types); break; + case PROP_SHUTTING_DOWN: + g_value_set_boolean (value, priv->shutting_down); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1424,6 +1441,13 @@ gdm_display_class_init (GdmDisplayClass *klass) "supported session types", G_TYPE_STRV, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (object_class, + PROP_SHUTTING_DOWN, + g_param_spec_boolean ("shutting-down", + NULL, NULL, + FALSE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c index cc61efc..072ae97 100644 --- a/daemon/gdm-manager.c +++ b/daemon/gdm-manager.c @@ -2746,11 +2746,14 @@ unexport_display (const char *id, } static void -finish_display (const char *id, - GdmDisplay *display, - GdmManager *manager) +shut_down_display (const char *id, + GdmDisplay *display, + GdmManager *manager) { gdm_display_stop_greeter_session (display); + + g_object_set (G_OBJECT (display), "shutting-down", TRUE, NULL); + if (gdm_display_get_status (display) == GDM_DISPLAY_MANAGED) gdm_display_unmanage (display); gdm_display_finish (display); @@ -2802,7 +2805,7 @@ gdm_manager_dispose (GObject *object) } gdm_display_store_foreach (manager->priv->display_store, - (GdmDisplayStoreFunc) finish_display, + (GdmDisplayStoreFunc) shut_down_display, manager); gdm_display_store_clear (manager->priv->display_store); -- 2.43.0