Backport upstream patch to fix a compositor crash (#2120470)
This commit is contained in:
76
2592.patch
Normal file
76
2592.patch
Normal file
@@ -0,0 +1,76 @@
|
||||
From ed516dde899f87b19f3dd0ed4613b692f778d437 Mon Sep 17 00:00:00 2001
|
||||
From: Carlos Garnacho <carlosg@gnome.org>
|
||||
Date: Tue, 23 Aug 2022 21:56:02 +0200
|
||||
Subject: [PATCH] wayland: Add destruction listener to activation token surface
|
||||
|
||||
In the timespan between an activation token being created and the
|
||||
token being used by the activated application, the surface that started
|
||||
the activation request may end up destroyed/disposed.
|
||||
|
||||
In that case, the token would be left with a stale surface pointer,
|
||||
maybe causing crashes later on. Set up a destroy notification listener
|
||||
so that we do know to unset the token surface if that situation arises,
|
||||
this will result in Mutter not considering the token activatable, thus
|
||||
maybe issuing the "Application needs attention" notification if the
|
||||
activated surface did not immediately get focus. In any case this is
|
||||
better than a compositor crash.
|
||||
|
||||
A typical situation where this may happen is "Open With..." dialogs,
|
||||
since those don't live long after launching the application.
|
||||
|
||||
Fixes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2390
|
||||
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2592>
|
||||
---
|
||||
src/wayland/meta-wayland-activation.c | 15 +++++++++++++++
|
||||
1 file changed, 15 insertions(+)
|
||||
|
||||
diff --git a/src/wayland/meta-wayland-activation.c b/src/wayland/meta-wayland-activation.c
|
||||
index 73faa19142..b7035ab5ce 100644
|
||||
--- a/src/wayland/meta-wayland-activation.c
|
||||
+++ b/src/wayland/meta-wayland-activation.c
|
||||
@@ -47,6 +47,7 @@ struct _MetaXdgActivationToken
|
||||
MetaWaylandSeat *seat;
|
||||
MetaWaylandActivation *activation;
|
||||
MetaStartupSequence *sequence;
|
||||
+ struct wl_listener surface_listener;
|
||||
char *app_id;
|
||||
char *token;
|
||||
uint32_t serial;
|
||||
@@ -94,6 +95,8 @@ token_set_surface (struct wl_client *client,
|
||||
MetaWaylandSurface *surface = wl_resource_get_user_data (surface_resource);
|
||||
|
||||
token->surface = surface;
|
||||
+ wl_resource_add_destroy_listener (surface_resource,
|
||||
+ &token->surface_listener);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -216,6 +219,17 @@ meta_xdg_activation_token_free (MetaXdgActivationToken *token)
|
||||
g_free (token);
|
||||
}
|
||||
|
||||
+static void
|
||||
+token_handle_surface_destroy (struct wl_listener *listener,
|
||||
+ void *data)
|
||||
+{
|
||||
+ MetaXdgActivationToken *token = wl_container_of (listener, token,
|
||||
+ surface_listener);
|
||||
+
|
||||
+ token->surface = NULL;
|
||||
+ wl_list_remove (&token->surface_listener.link);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
meta_wayland_activation_token_create_new_resource (MetaWaylandActivation *activation,
|
||||
struct wl_client *client,
|
||||
@@ -237,6 +251,7 @@ meta_wayland_activation_token_create_new_resource (MetaWaylandActivation *activa
|
||||
wl_resource_set_user_data (token_resource, token);
|
||||
wl_list_insert (&activation->token_list,
|
||||
wl_resource_get_link (token_resource));
|
||||
+ token->surface_listener.notify = token_handle_surface_destroy;
|
||||
}
|
||||
|
||||
static void
|
||||
--
|
||||
GitLab
|
||||
|
||||
Reference in New Issue
Block a user