From cd5cdad31d5e26e29862b4270aaa6c9493030b89 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Tue, 11 Jul 2023 13:25:22 +0200 Subject: [PATCH] GtkApplicationImplDBus: Cancel DBus method calls on shutdown We do that for method calls where we pass a valid GAsyncReadyCallback Fixes #5775 --- gtk/gtkapplication-dbus.c | 21 +++++++++++++++------ gtk/gtkapplicationprivate.h | 1 + 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/gtk/gtkapplication-dbus.c b/gtk/gtkapplication-dbus.c index 110d6c0aef..1ed3a6664a 100644 --- a/gtk/gtkapplication-dbus.c +++ b/gtk/gtkapplication-dbus.c @@ -275,8 +275,10 @@ ss_get_active_cb (GObject *source, ret = g_dbus_proxy_call_finish (proxy, result, &error); if (ret == NULL) { - g_warning ("Getting screensaver status failed: %s", error->message); - g_error_free (error); + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("Getting screensaver status failed: %s", + error ? error->message : ""); + g_clear_error (&error); return; } @@ -297,8 +299,10 @@ create_monitor_cb (GObject *source, ret = g_dbus_proxy_call_finish (proxy, result, &error); if (ret == NULL) { - g_warning ("Creating a portal monitor failed: %s", error->message); - g_error_free (error); + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("Creating a portal monitor failed: %s", + error ? error->message : ""); + g_clear_error (&error); return; } @@ -332,6 +336,8 @@ gtk_application_impl_dbus_startup (GtkApplicationImpl *impl, if (gdk_should_use_portal ()) goto out; + dbus->cancellable = g_cancellable_new (); + g_debug ("Connecting to session manager"); /* Try the GNOME session manager first */ @@ -398,7 +404,7 @@ gtk_application_impl_dbus_startup (GtkApplicationImpl *impl, NULL, G_DBUS_CALL_FLAGS_NONE, G_MAXINT, - NULL, + dbus->cancellable, ss_get_active_cb, dbus); } @@ -545,7 +551,7 @@ gtk_application_impl_dbus_startup (GtkApplicationImpl *impl, g_variant_new ("(sa{sv})", "", &opt_builder), G_DBUS_CALL_FLAGS_NONE, G_MAXINT, - NULL, + dbus->cancellable, create_monitor_cb, dbus); g_free (token); } @@ -555,6 +561,8 @@ gtk_application_impl_dbus_startup (GtkApplicationImpl *impl, static void gtk_application_impl_dbus_shutdown (GtkApplicationImpl *impl) { + GtkApplicationImplDBus *dbus = (GtkApplicationImplDBus *) impl; + g_cancellable_cancel (dbus->cancellable); } GQuark gtk_application_impl_dbus_export_id_quark (void); @@ -898,6 +906,7 @@ gtk_application_impl_dbus_finalize (GObject *object) if (dbus->ss_proxy) g_signal_handlers_disconnect_by_func (dbus->ss_proxy, screensaver_signal_session, dbus->impl.application); g_clear_object (&dbus->ss_proxy); + g_clear_object (&dbus->cancellable); G_OBJECT_CLASS (gtk_application_impl_dbus_parent_class)->finalize (object); } diff --git a/gtk/gtkapplicationprivate.h b/gtk/gtkapplicationprivate.h index 93a0a28c31..a6c56c89df 100644 --- a/gtk/gtkapplicationprivate.h +++ b/gtk/gtkapplicationprivate.h @@ -116,6 +116,7 @@ typedef struct GtkApplicationImpl impl; GDBusConnection *session; + GCancellable *cancellable; const char *application_id; const char *unique_name; -- 2.30.2