summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Müllner <fmuellner@gnome.org>2020-12-13 18:57:44 +0100
committerFlorian Müllner <fmuellner@gnome.org>2021-06-14 20:37:26 +0200
commit3f2db31d7e74f11ed57e9e106971a591521640a1 (patch)
treea3f98e4665a3972f2e3bdb5a7c70387ccd0e3a1b
parent177b36f82b9a884dd9ac8828c79fd9e44125a928 (diff)
downloadgnome-shell-3f2db31d7e74f11ed57e9e106971a591521640a1.tar.gz
shell/app: Keep cancellable after cancelled proxy request
When a GTK app is started, we create a corresponding GtkApplication proxy to monitor the app's busy state. If the app is stopped before the proxy request finishes, we cancel the cancellable before clearing the running state. Usually we clear the cancellable once it is no longer needed, namely when we got the proxy. However when the request was cancelled, the cancellable has already been cleared, and if there's a cancellable, it belongs to another request (because the window was added again, for example when moving between monitors). Leave that cancellable alone in that case, so we can cancel the second request as well if necessary to avoid a crash when trying to set the proxy on a cleared running state. https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/1962 Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1885>
-rw-r--r--src/shell-app.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/shell-app.c b/src/shell-app.c
index 62ba2ec73..1dfd82d8e 100644
--- a/src/shell-app.c
+++ b/src/shell-app.c
@@ -1046,10 +1046,11 @@ get_application_proxy (GObject *source,
{
ShellApp *app = user_data;
ShellOrgGtkApplication *proxy;
+ g_autoptr (GError) error = NULL;
g_assert (SHELL_IS_APP (app));
- proxy = shell_org_gtk_application_proxy_new_finish (result, NULL);
+ proxy = shell_org_gtk_application_proxy_new_finish (result, &error);
if (proxy != NULL)
{
app->running_state->application_proxy = proxy;
@@ -1061,7 +1062,8 @@ get_application_proxy (GObject *source,
g_object_notify (G_OBJECT (app), "busy");
}
- if (app->running_state != NULL)
+ if (app->running_state != NULL &&
+ !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
g_clear_object (&app->running_state->cancellable);
g_object_unref (app);