diff --git a/clutter/clutter/clutter-mutter.h b/clutter/clutter/clutter-mutter.h
index f09a07fcc..ab5074214 100644
--- a/clutter/clutter/clutter-mutter.h
+++ b/clutter/clutter/clutter-mutter.h
@@ -36,6 +36,14 @@ void clutter_set_custom_backend_func (ClutterBackend *(* func) (void));
CLUTTER_AVAILABLE_IN_MUTTER
gboolean _clutter_get_sync_to_vblank (void);
+CLUTTER_AVAILABLE_IN_MUTTER
+CoglFrameClosure *clutter_stage_add_frame_callback (ClutterStage *stage,
+ CoglFrameCallback callback,
+ gpointer user_data);
+
+CLUTTER_AVAILABLE_IN_MUTTER
+int64_t clutter_stage_get_frame_counter (ClutterStage *stage);
+
#undef __CLUTTER_H_INSIDE__
#endif /* __CLUTTER_MUTTER_H__ */
diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c
index 8f5abb4a1..ac5a356ad 100644
--- a/clutter/clutter/clutter-stage.c
+++ b/clutter/clutter/clutter-stage.c
@@ -4510,3 +4510,25 @@ _clutter_stage_set_scale_factor (ClutterStage *stage,
clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
}
+
+CoglFrameClosure *
+clutter_stage_add_frame_callback (ClutterStage *stage,
+ CoglFrameCallback callback,
+ gpointer user_data)
+{
+ ClutterStageWindow *stage_window;
+
+ stage_window = _clutter_stage_get_window (stage);
+ return _clutter_stage_window_set_frame_callback (stage_window,
+ callback,
+ user_data);
+}
+
+int64_t
+clutter_stage_get_frame_counter (ClutterStage *stage)
+{
+ ClutterStageWindow *stage_window;
+
+ stage_window = _clutter_stage_get_window (stage);
+ return _clutter_stage_window_get_frame_counter (stage_window);
+}
diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h
index c5349260c..72dffe51f 100644
--- a/src/compositor/compositor-private.h
+++ b/src/compositor/compositor-private.h
@@ -29,7 +29,6 @@ struct _MetaCompositor
GList *windows;
Window output;
- CoglOnscreen *onscreen;
CoglFrameClosure *frame_closure;
CoglContext *context;
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
index 49b039d51..0efb09b5a 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -77,6 +77,7 @@
#include "meta-sync-ring.h"
#include "backends/x11/meta-backend-x11.h"
+#include "clutter/clutter-mutter.h"
#ifdef HAVE_WAYLAND
#include "wayland/meta-wayland-private.h"
@@ -1044,13 +1045,12 @@ meta_pre_paint_func (gpointer data)
MetaWindowActor *top_window;
MetaCompositor *compositor = data;
- if (compositor->onscreen == NULL)
+ if (!compositor->frame_closure)
{
- compositor->onscreen = COGL_ONSCREEN (cogl_get_draw_framebuffer ());
- compositor->frame_closure = cogl_onscreen_add_frame_callback (compositor->onscreen,
- frame_callback,
- compositor,
- NULL);
+ compositor->frame_closure =
+ clutter_stage_add_frame_callback (CLUTTER_STAGE (compositor->stage),
+ frame_callback,
+ compositor);
}
if (compositor->windows == NULL)
diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
index 5ab79c5c2..197a19315 100644
--- a/src/compositor/meta-window-actor.c
+++ b/src/compositor/meta-window-actor.c
@@ -23,6 +23,7 @@
#include
#include
+#include "clutter/clutter-mutter.h"
#include "compositor-private.h"
#include "meta-shaped-texture-private.h"
#include "meta-window-actor-private.h"
@@ -659,6 +660,8 @@ static void
assign_frame_counter_to_frames (MetaWindowActor *self)
{
MetaWindowActorPrivate *priv = self->priv;
+ MetaCompositor *compositor = priv->compositor;
+ ClutterStage *stage = CLUTTER_STAGE (compositor->stage);
GList *l;
/* If the window is obscured, then we're expecting to deal with sending
@@ -672,10 +675,7 @@ assign_frame_counter_to_frames (MetaWindowActor *self)
FrameData *frame = l->data;
if (frame->frame_counter == -1)
- {
- CoglOnscreen *onscreen = COGL_ONSCREEN (cogl_get_draw_framebuffer());
- frame->frame_counter = cogl_onscreen_get_frame_counter (onscreen);
- }
+ frame->frame_counter = clutter_stage_get_frame_counter (stage);
}
}