From b47d96b86248daa1451f25028e98609c0eca633c Mon Sep 17 00:00:00 2001
From: Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
Date: Tue, 24 Jan 2023 11:59:17 -0300
Subject: [PATCH] backends/stage: Pass ClutterFrame to MetaStageWatchFunc

We'll need to access the timestamp of the frame later on, so pass
it to stage watchers.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2804>
---
 src/backends/meta-screen-cast-area-stream-src.c    |  2 ++
 src/backends/meta-screen-cast-monitor-stream-src.c |  2 ++
 src/backends/meta-screen-cast-virtual-stream-src.c |  1 +
 src/backends/meta-stage-private.h                  |  1 +
 src/backends/meta-stage.c                          | 13 ++++++++-----
 src/tests/meta-ref-test.c                          |  1 +
 6 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/src/backends/meta-screen-cast-area-stream-src.c b/src/backends/meta-screen-cast-area-stream-src.c
index c0b6b39c0..696a46e8f 100644
--- a/src/backends/meta-screen-cast-area-stream-src.c
+++ b/src/backends/meta-screen-cast-area-stream-src.c
@@ -248,6 +248,7 @@ static void
 before_stage_painted (MetaStage           *stage,
                       ClutterStageView    *view,
                       ClutterPaintContext *paint_context,
+                      ClutterFrame        *frame,
                       gpointer             user_data)
 {
   MetaScreenCastAreaStreamSrc *area_src =
@@ -267,6 +268,7 @@ static void
 stage_painted (MetaStage           *stage,
                ClutterStageView    *view,
                ClutterPaintContext *paint_context,
+               ClutterFrame        *frame,
                gpointer             user_data)
 {
   MetaScreenCastAreaStreamSrc *area_src =
diff --git a/src/backends/meta-screen-cast-monitor-stream-src.c b/src/backends/meta-screen-cast-monitor-stream-src.c
index 5ed744f56..ed0d854c1 100644
--- a/src/backends/meta-screen-cast-monitor-stream-src.c
+++ b/src/backends/meta-screen-cast-monitor-stream-src.c
@@ -152,6 +152,7 @@ static void
 stage_painted (MetaStage           *stage,
                ClutterStageView    *view,
                ClutterPaintContext *paint_context,
+               ClutterFrame        *frame,
                gpointer             user_data)
 {
   MetaScreenCastMonitorStreamSrc *monitor_src =
@@ -171,6 +172,7 @@ static void
 before_stage_painted (MetaStage           *stage,
                       ClutterStageView    *view,
                       ClutterPaintContext *paint_context,
+                      ClutterFrame        *frame,
                       gpointer             user_data)
 {
   MetaScreenCastMonitorStreamSrc *monitor_src =
diff --git a/src/backends/meta-screen-cast-virtual-stream-src.c b/src/backends/meta-screen-cast-virtual-stream-src.c
index 9cb8e98f5..edf6e861b 100644
--- a/src/backends/meta-screen-cast-virtual-stream-src.c
+++ b/src/backends/meta-screen-cast-virtual-stream-src.c
@@ -186,6 +186,7 @@ static void
 actors_painted (MetaStage           *stage,
                 ClutterStageView    *view,
                 ClutterPaintContext *paint_context,
+                ClutterFrame        *frame,
                 gpointer             user_data)
 {
   MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (user_data);
diff --git a/src/backends/meta-stage-private.h b/src/backends/meta-stage-private.h
index e296e274e..809e71a52 100644
--- a/src/backends/meta-stage-private.h
+++ b/src/backends/meta-stage-private.h
@@ -42,6 +42,7 @@ typedef enum
 typedef void (* MetaStageWatchFunc) (MetaStage           *stage,
                                      ClutterStageView    *view,
                                      ClutterPaintContext *paint_context,
+                                     ClutterFrame        *frame,
                                      gpointer             user_data);
 
 ClutterActor     *meta_stage_new                     (MetaBackend *backend);
diff --git a/src/backends/meta-stage.c b/src/backends/meta-stage.c
index e3f4ae077..2599daef0 100644
--- a/src/backends/meta-stage.c
+++ b/src/backends/meta-stage.c
@@ -189,6 +189,7 @@ static void
 notify_watchers_for_mode (MetaStage           *stage,
                           ClutterStageView    *view,
                           ClutterPaintContext *paint_context,
+                          ClutterFrame        *frame,
                           MetaStageWatchPhase  watch_phase)
 {
   GPtrArray *watchers;
@@ -203,7 +204,7 @@ notify_watchers_for_mode (MetaStage           *stage,
       if (watch->view && view != watch->view)
         continue;
 
-      watch->callback (stage, view, paint_context, watch->user_data);
+      watch->callback (stage, view, paint_context, frame, watch->user_data);
     }
 }
 
@@ -214,7 +215,7 @@ meta_stage_before_paint (ClutterStage     *stage,
 {
   MetaStage *meta_stage = META_STAGE (stage);
 
-  notify_watchers_for_mode (meta_stage, view, NULL,
+  notify_watchers_for_mode (meta_stage, view, NULL, frame,
                             META_STAGE_WATCH_BEFORE_PAINT);
 }
 
@@ -224,13 +225,15 @@ meta_stage_paint (ClutterActor        *actor,
 {
   MetaStage *stage = META_STAGE (actor);
   ClutterStageView *view;
+  ClutterFrame *frame;
 
   CLUTTER_ACTOR_CLASS (meta_stage_parent_class)->paint (actor, paint_context);
 
+  frame = clutter_paint_context_get_frame (paint_context);
   view = clutter_paint_context_get_stage_view (paint_context);
   if (view)
     {
-      notify_watchers_for_mode (stage, view, paint_context,
+      notify_watchers_for_mode (stage, view, paint_context, frame,
                                 META_STAGE_WATCH_AFTER_ACTOR_PAINT);
     }
 
@@ -260,7 +263,7 @@ meta_stage_paint (ClutterActor        *actor,
 
   if (view)
     {
-      notify_watchers_for_mode (stage, view, paint_context,
+      notify_watchers_for_mode (stage, view, paint_context, frame,
                                 META_STAGE_WATCH_AFTER_OVERLAY_PAINT);
     }
 }
@@ -277,7 +280,7 @@ meta_stage_paint_view (ClutterStage         *stage,
                                                              redraw_clip,
                                                              frame);
 
-  notify_watchers_for_mode (meta_stage, view, NULL,
+  notify_watchers_for_mode (meta_stage, view, NULL, frame,
                             META_STAGE_WATCH_AFTER_PAINT);
 }
 
diff --git a/src/tests/meta-ref-test.c b/src/tests/meta-ref-test.c
index 0c019365d..4861f3b95 100644
--- a/src/tests/meta-ref-test.c
+++ b/src/tests/meta-ref-test.c
@@ -273,6 +273,7 @@ static void
 on_after_paint (MetaStage           *stage,
                 ClutterStageView    *view,
                 ClutterPaintContext *paint_context,
+                ClutterFrame        *frame,
                 gpointer             user_data)
 {
   CaptureViewData *data = user_data;