1
From: =?utf-8?q?Jonas_=C3=85dahl?= <jadahl@gmail.com>
2
Date: Fri, 3 Nov 2017 04:27:57 -0600
3
Subject: backends: Add logical monitor -> monitor -> output -> crtc ref chain
5
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/mutter/+bug/1703668
6
Bug-GNOME: https://bugzilla.gnome.org/show_bug.cgi?id=786929
7
Forwarded: yes, https://gitlab.gnome.org/GNOME/mutter/merge_requests/81
9
Make it so that each logical monitor has a reference to all the
10
monitors that are assigned to it.
12
All monitors has a reference to each output that belongs to it.
14
Each output has a reference to any CRTC it has been assigned.
16
https://bugzilla.gnome.org/show_bug.cgi?id=786929
18
src/backends/meta-logical-monitor.c | 14 +++++++++-----
19
src/backends/meta-monitor.c | 22 +++++++++++++++++++---
20
src/backends/meta-output.c | 16 ++++++++++++++--
21
3 files changed, 42 insertions(+), 10 deletions(-)
23
diff --git a/src/backends/meta-logical-monitor.c b/src/backends/meta-logical-monitor.c
24
index 9e14d66..bc91d1d 100644
25
--- a/src/backends/meta-logical-monitor.c
26
+++ b/src/backends/meta-logical-monitor.c
27
@@ -144,7 +144,7 @@ meta_logical_monitor_add_monitor (MetaLogicalMonitor *logical_monitor,
29
is_presentation = logical_monitor->is_presentation;
30
logical_monitor->monitors = g_list_append (logical_monitor->monitors,
32
+ g_object_ref (monitor));
34
for (l = logical_monitor->monitors; l; l = l->next)
36
@@ -255,13 +255,17 @@ meta_logical_monitor_init (MetaLogicalMonitor *logical_monitor)
40
-meta_logical_monitor_finalize (GObject *object)
41
+meta_logical_monitor_dispose (GObject *object)
43
MetaLogicalMonitor *logical_monitor = META_LOGICAL_MONITOR (object);
45
- g_list_free (logical_monitor->monitors);
46
+ if (logical_monitor->monitors)
48
+ g_list_free_full (logical_monitor->monitors, g_object_unref);
49
+ logical_monitor->monitors = NULL;
52
- G_OBJECT_CLASS (meta_logical_monitor_parent_class)->finalize (object);
53
+ G_OBJECT_CLASS (meta_logical_monitor_parent_class)->dispose (object);
57
@@ -269,7 +273,7 @@ meta_logical_monitor_class_init (MetaLogicalMonitorClass *klass)
59
GObjectClass *object_class = G_OBJECT_CLASS (klass);
61
- object_class->finalize = meta_logical_monitor_finalize;
62
+ object_class->dispose = meta_logical_monitor_dispose;
66
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
67
index 1e1af39..9833066 100644
68
--- a/src/backends/meta-monitor.c
69
+++ b/src/backends/meta-monitor.c
70
@@ -388,6 +388,21 @@ meta_monitor_crtc_to_logical_transform (MetaMonitor *monitor,
74
+meta_monitor_dispose (GObject *object)
76
+ MetaMonitor *monitor = META_MONITOR (object);
77
+ MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor);
81
+ g_list_free_full (priv->outputs, g_object_unref);
82
+ priv->outputs = NULL;
85
+ G_OBJECT_CLASS (meta_monitor_parent_class)->dispose (object);
89
meta_monitor_finalize (GObject *object)
91
MetaMonitor *monitor = META_MONITOR (object);
92
@@ -395,7 +410,6 @@ meta_monitor_finalize (GObject *object)
94
g_hash_table_destroy (priv->mode_ids);
95
g_list_free_full (priv->modes, (GDestroyNotify) meta_monitor_mode_free);
96
- g_clear_pointer (&priv->outputs, g_list_free);
97
meta_monitor_spec_free (priv->spec);
99
G_OBJECT_CLASS (meta_monitor_parent_class)->finalize (object);
100
@@ -414,6 +428,7 @@ meta_monitor_class_init (MetaMonitorClass *klass)
102
GObjectClass *object_class = G_OBJECT_CLASS (klass);
104
+ object_class->dispose = meta_monitor_dispose;
105
object_class->finalize = meta_monitor_finalize;
108
@@ -550,7 +565,7 @@ meta_monitor_normal_new (MetaGpu *gpu,
110
monitor_priv->gpu = gpu;
112
- monitor_priv->outputs = g_list_append (NULL, output);
113
+ monitor_priv->outputs = g_list_append (NULL, g_object_ref (output));
114
monitor_priv->winsys_id = output->winsys_id;
115
meta_monitor_generate_spec (monitor);
117
@@ -665,7 +680,8 @@ add_tiled_monitor_outputs (MetaGpu *gpu,
118
g_warn_if_fail (output->subpixel_order ==
119
monitor_tiled->origin_output->subpixel_order);
121
- monitor_priv->outputs = g_list_append (monitor_priv->outputs, output);
122
+ monitor_priv->outputs = g_list_append (monitor_priv->outputs,
123
+ g_object_ref (output));
127
diff --git a/src/backends/meta-output.c b/src/backends/meta-output.c
128
index b5ecccd..2139a17 100644
129
--- a/src/backends/meta-output.c
130
+++ b/src/backends/meta-output.c
131
@@ -43,7 +43,7 @@ meta_output_assign_crtc (MetaOutput *output,
136
+ g_set_object (&priv->crtc, crtc);
140
@@ -51,7 +51,7 @@ meta_output_unassign_crtc (MetaOutput *output)
142
MetaOutputPrivate *priv = meta_output_get_instance_private (output);
145
+ g_clear_object (&priv->crtc);
149
@@ -63,6 +63,17 @@ meta_output_get_assigned_crtc (MetaOutput *output)
153
+meta_output_dispose (GObject *object)
155
+ MetaOutput *output = META_OUTPUT (object);
156
+ MetaOutputPrivate *priv = meta_output_get_instance_private (output);
158
+ g_clear_object (&priv->crtc);
160
+ G_OBJECT_CLASS (meta_output_parent_class)->dispose (object);
164
meta_output_finalize (GObject *object)
166
MetaOutput *output = META_OUTPUT (object);
167
@@ -91,5 +102,6 @@ meta_output_class_init (MetaOutputClass *klass)
169
GObjectClass *object_class = G_OBJECT_CLASS (klass);
171
+ object_class->dispose = meta_output_dispose;
172
object_class->finalize = meta_output_finalize;