[mutter] stage: Add 'prepare-frame' signal



commit cecf4cd87cf35a1e2ec0367e5fabba09337fd0fd
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Fri Apr 29 16:02:08 2022 +0200

    stage: Add 'prepare-frame' signal
    
    This is a signal that will be emitted between the 'before-update' and
    'before-paint'. It can be used to handle things when you know whether
    there is an update, and you know whether a paint or not will happen, by
    looking at the current damage.
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2393>

 clutter/clutter/clutter-stage-private.h |  2 ++
 clutter/clutter/clutter-stage-view.c    |  1 +
 clutter/clutter/clutter-stage.c         | 24 ++++++++++++++++++++++++
 3 files changed, 27 insertions(+)
---
diff --git a/clutter/clutter/clutter-stage-private.h b/clutter/clutter/clutter-stage-private.h
index e9ba5707ed..b1a8105d22 100644
--- a/clutter/clutter/clutter-stage-private.h
+++ b/clutter/clutter/clutter-stage-private.h
@@ -49,6 +49,8 @@ void                clutter_stage_paint_view             (ClutterStage
 
 void                clutter_stage_emit_before_update     (ClutterStage          *stage,
                                                           ClutterStageView      *view);
+void                clutter_stage_emit_prepare_frame     (ClutterStage          *stage,
+                                                          ClutterStageView      *view);
 void                clutter_stage_emit_before_paint      (ClutterStage          *stage,
                                                           ClutterStageView      *view);
 void                clutter_stage_emit_after_paint       (ClutterStage          *stage,
diff --git a/clutter/clutter/clutter-stage-view.c b/clutter/clutter/clutter-stage-view.c
index 8a82de71ed..2e47237f0a 100644
--- a/clutter/clutter/clutter-stage-view.c
+++ b/clutter/clutter/clutter-stage-view.c
@@ -1183,6 +1183,7 @@ handle_frame_clock_frame (ClutterFrameClock *frame_clock,
   frame = CLUTTER_FRAME_INIT;
 
   _clutter_stage_window_prepare_frame (stage_window, view, &frame);
+  clutter_stage_emit_prepare_frame (stage, view);
 
   if (clutter_stage_view_has_redraw_clip (view))
     {
diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c
index ed803a4352..e97cd54a3f 100644
--- a/clutter/clutter/clutter-stage.c
+++ b/clutter/clutter/clutter-stage.c
@@ -162,6 +162,7 @@ enum
   DEACTIVATE,
   DELETE_EVENT,
   BEFORE_UPDATE,
+  PREPARE_FRAME,
   BEFORE_PAINT,
   AFTER_PAINT,
   AFTER_UPDATE,
@@ -465,6 +466,13 @@ clutter_stage_emit_before_update (ClutterStage     *stage,
   g_signal_emit (stage, stage_signals[BEFORE_UPDATE], 0, view);
 }
 
+void
+clutter_stage_emit_prepare_frame (ClutterStage     *stage,
+                                  ClutterStageView *view)
+{
+  g_signal_emit (stage, stage_signals[PREPARE_FRAME], 0, view);
+}
+
 void
 clutter_stage_emit_before_paint (ClutterStage     *stage,
                                  ClutterStageView *view)
@@ -1408,6 +1416,22 @@ clutter_stage_class_init (ClutterStageClass *klass)
                   NULL, NULL, NULL,
                   G_TYPE_NONE, 1,
                   CLUTTER_TYPE_STAGE_VIEW);
+  /**
+   * ClutterStage::prepare-frame:
+   * @stage: the stage that received the event
+   * @view: a #ClutterStageView
+   *
+   * The ::prepare-frame signal is emitted after the stage is updated,
+   * before the stage is painted, even if it will not be painted.
+   */
+  stage_signals[PREPARE_FRAME] =
+    g_signal_new (I_("prepare-frame"),
+                  G_TYPE_FROM_CLASS (gobject_class),
+                  G_SIGNAL_RUN_LAST,
+                  0,
+                  NULL, NULL, NULL,
+                  G_TYPE_NONE, 1,
+                  CLUTTER_TYPE_STAGE_VIEW);
 
   /**
    * ClutterStage::before-paint:


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]