[mutter/gnome-41] x11/input-selection-stream: Handle Xwayland going away
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/gnome-41] x11/input-selection-stream: Handle Xwayland going away
- Date: Thu, 2 Jun 2022 08:46:27 +0000 (UTC)
commit 16b7dce9cb1313d08a594c20697cea9d0b8812f0
Author: Jonas Ådahl <jadahl gmail com>
Date: Wed Apr 6 10:05:35 2022 +0200
x11/input-selection-stream: Handle Xwayland going away
Xwayland can disappear at any time, for example during a new_async() or
read_async() call. When we eventually finalize the stream, the X11
display it was created for is gone, thus can't clean up the X11
resources. Handle this by making the MetaX11Display pointer a weak
pointer, and ignore cleaning up if it disappeared. This is fine since
the X11 server it created those resources one is gone already.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2364>
src/x11/meta-x11-selection-input-stream.c | 24 ++++++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
---
diff --git a/src/x11/meta-x11-selection-input-stream.c b/src/x11/meta-x11-selection-input-stream.c
index e8d7820478..7ed64ac0b5 100644
--- a/src/x11/meta-x11-selection-input-stream.c
+++ b/src/x11/meta-x11-selection-input-stream.c
@@ -268,9 +268,14 @@ meta_x11_selection_input_stream_dispose (GObject *object)
META_X11_SELECTION_INPUT_STREAM (object);
MetaX11SelectionInputStreamPrivate *priv =
meta_x11_selection_input_stream_get_instance_private (stream);
+ MetaX11Display *x11_display;
- priv->x11_display->selection.input_streams =
- g_list_remove (priv->x11_display->selection.input_streams, stream);
+ x11_display = priv->x11_display;
+ if (x11_display)
+ {
+ x11_display->selection.input_streams =
+ g_list_remove (x11_display->selection.input_streams, stream);
+ }
G_OBJECT_CLASS (meta_x11_selection_input_stream_parent_class)->dispose (object);
}
@@ -282,6 +287,7 @@ meta_x11_selection_input_stream_finalize (GObject *object)
META_X11_SELECTION_INPUT_STREAM (object);
MetaX11SelectionInputStreamPrivate *priv =
meta_x11_selection_input_stream_get_instance_private (stream);
+ MetaX11Display *x11_display;
g_async_queue_unref (priv->chunks);
@@ -289,6 +295,17 @@ meta_x11_selection_input_stream_finalize (GObject *object)
g_free (priv->target);
g_free (priv->property);
+ x11_display = priv->x11_display;
+ if (x11_display)
+ {
+ Display *xdisplay = meta_x11_display_get_xdisplay (x11_display);
+
+ XDestroyWindow (xdisplay, priv->window);
+
+ g_object_remove_weak_pointer (G_OBJECT (x11_display),
+ (gpointer *) &priv->x11_display);
+ }
+
G_OBJECT_CLASS (meta_x11_selection_input_stream_parent_class)->finalize (object);
}
@@ -520,6 +537,9 @@ meta_x11_selection_input_stream_new_async (MetaX11Display *x11_display,
priv = meta_x11_selection_input_stream_get_instance_private (stream);
priv->x11_display = x11_display;
+ g_object_add_weak_pointer (G_OBJECT (x11_display),
+ (gpointer *) &priv->x11_display);
+
x11_display->selection.input_streams =
g_list_prepend (x11_display->selection.input_streams, stream);
priv->selection = g_strdup (selection);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]