Skip to content

Commit cc0a694

Browse files
committed
later: Listen to MetaCompositor signal instead of clutter
We need to coordinate with MetaCompositor during pre-paint so that we have control over whether MetaLater callbacks happen first, or the MetaCompositor pre-paint logic. In order to do so, make MetaLater listen to a new signal "pre-paint" on MetaCompositor, that is called MetaCompositors own pre-paint handling. This fixes an issue where the top window actor was calculated after the MetaCompositor pre-paint handling, meaning the top actor being painted was out-of-date. Original Mutter commit: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/798/diffs?commit_id=b51c468c0facc3be5df597a6fe0c8c35b95a1fff
1 parent 3986a44 commit cc0a694

File tree

3 files changed

+44
-27
lines changed

3 files changed

+44
-27
lines changed

src/compositor/compositor.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,15 @@ enum
9999

100100
static GParamSpec *obj_props[N_PROPS] = { NULL, };
101101

102+
enum
103+
{
104+
PRE_PAINT,
105+
106+
N_SIGNALS
107+
};
108+
109+
static guint signals[N_SIGNALS];
110+
102111
typedef struct _MetaCompositorPrivate
103112
{
104113
GObject parent;
@@ -1277,7 +1286,8 @@ meta_compositor_pre_paint (MetaCompositor *compositor)
12771286
{
12781287
COGL_TRACE_BEGIN_SCOPED (MetaCompositorPrePaint,
12791288
"Compositor (pre-paint)");
1280-
META_COMPOSITOR_GET_CLASS (compositor)->pre_paint (compositor);
1289+
1290+
g_signal_emit (compositor, signals[PRE_PAINT], 0);
12811291
}
12821292

12831293
static gboolean
@@ -1405,7 +1415,7 @@ meta_compositor_init (MetaCompositor *compositor)
14051415
compositor,
14061416
NULL);
14071417

1408-
priv->laters = meta_laters_new ();
1418+
priv->laters = meta_laters_new (compositor);
14091419
}
14101420

14111421
static void
@@ -1461,6 +1471,14 @@ meta_compositor_class_init (MetaCompositorClass *klass)
14611471
G_PARAM_CONSTRUCT_ONLY |
14621472
G_PARAM_STATIC_STRINGS);
14631473
g_object_class_install_properties (object_class, N_PROPS, obj_props);
1474+
1475+
signals[PRE_PAINT] =
1476+
g_signal_new ("pre-paint",
1477+
G_TYPE_FROM_CLASS (klass),
1478+
G_SIGNAL_RUN_LAST,
1479+
G_STRUCT_OFFSET (MetaCompositorClass, pre_paint),
1480+
NULL, NULL, NULL,
1481+
G_TYPE_NONE, 0);
14641482
}
14651483

14661484
/**

src/compositor/meta-later-private.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@
1919
#define META_LATER_PRIVATE_H
2020

2121
typedef struct _MetaLaters MetaLaters;
22+
typedef struct _MetaCompositor MetaCompositor;
2223

23-
MetaLaters * meta_laters_new (void);
24+
MetaLaters * meta_laters_new (MetaCompositor *compositor);
2425

2526
void meta_laters_free (MetaLaters *laters);
2627

src/compositor/meta-later.c

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,14 @@ typedef struct _MetaLater
4444

4545
struct _MetaLaters
4646
{
47+
MetaCompositor *compositor;
48+
4749
unsigned int last_later_id;
4850

4951
GSList *laters[META_LATER_N_TYPES];
5052

5153
ClutterTimeline *timeline;
52-
guint repaint_func;
54+
gulong pre_paint_handler_id;
5355
};
5456

5557
static MetaLater *
@@ -163,10 +165,10 @@ run_repaint_laters (GSList **laters_list)
163165
}
164166
}
165167

166-
static gboolean
167-
run_all_repaint_laters (gpointer data)
168+
static void
169+
on_pre_paint (MetaCompositor *compositor,
170+
MetaLaters *laters)
168171
{
169-
MetaLaters *laters = data;
170172
unsigned int i;
171173
GSList *l;
172174
gboolean keep_timeline_running = FALSE;
@@ -187,24 +189,11 @@ run_all_repaint_laters (gpointer data)
187189

188190
if (!keep_timeline_running)
189191
clutter_timeline_stop (laters->timeline);
190-
191-
return TRUE;
192192
}
193193

194194
static void
195-
ensure_later_repaint_func (MetaLaters *laters)
195+
ensure_timeline_running (MetaLaters *laters)
196196
{
197-
if (!laters->timeline)
198-
laters->timeline = clutter_timeline_new (G_MAXUINT);
199-
200-
if (laters->repaint_func == 0)
201-
{
202-
laters->repaint_func =
203-
clutter_threads_add_repaint_func (run_all_repaint_laters,
204-
laters, NULL);
205-
}
206-
207-
/* Make sure the repaint function gets run */
208197
clutter_timeline_start (laters->timeline);
209198
}
210199

@@ -250,13 +239,13 @@ meta_laters_add (MetaLaters *laters,
250239
invoke_later_idle,
251240
later, NULL);
252241
g_source_set_name_by_id (later->source_id, "[muffin] invoke_later_idle");
253-
ensure_later_repaint_func (laters);
242+
ensure_timeline_running (laters);
254243
break;
255244
case META_LATER_CALC_SHOWING:
256245
case META_LATER_CHECK_FULLSCREEN:
257246
case META_LATER_SYNC_STACK:
258247
case META_LATER_BEFORE_REDRAW:
259-
ensure_later_repaint_func (laters);
248+
ensure_timeline_running (laters);
260249
break;
261250
case META_LATER_IDLE:
262251
later->source_id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
@@ -331,9 +320,19 @@ meta_later_remove (unsigned int later_id)
331320
}
332321

333322
MetaLaters *
334-
meta_laters_new (void)
323+
meta_laters_new (MetaCompositor *compositor)
335324
{
336-
return g_new0 (MetaLaters, 1);
325+
MetaLaters *laters;
326+
327+
laters = g_new0 (MetaLaters, 1);
328+
laters->compositor = compositor;
329+
laters->timeline = clutter_timeline_new (G_MAXUINT);
330+
331+
laters->pre_paint_handler_id = g_signal_connect (compositor, "pre-paint",
332+
G_CALLBACK (on_pre_paint),
333+
laters);
334+
335+
return laters;
337336
}
338337

339338
void
@@ -345,7 +344,6 @@ meta_laters_free (MetaLaters *laters)
345344
g_slist_free_full (laters->laters[i], (GDestroyNotify) meta_later_unref);
346345

347346
g_clear_object (&laters->timeline);
348-
if (laters->repaint_func)
349-
clutter_threads_remove_repaint_func (laters->repaint_func);
347+
g_clear_signal_handler (&laters->pre_paint_handler_id, laters->compositor);
350348
g_free (laters);
351349
}

0 commit comments

Comments
 (0)