From cecf4cd87cf35a1e2ec0367e5fabba09337fd0fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 29 Apr 2022 16:02:08 +0200 Subject: [PATCH] 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: --- 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 e9ba5707e..b1a8105d2 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 8a82de71e..2e47237f0 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 ed803a435..e97cd54a3 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: