summaryrefslogtreecommitdiff
path: root/src/wayland/meta-wayland.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wayland/meta-wayland.c')
-rw-r--r--src/wayland/meta-wayland.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c
index 731e24727..b032a8bfc 100644
--- a/src/wayland/meta-wayland.c
+++ b/src/wayland/meta-wayland.c
@@ -230,6 +230,52 @@ on_after_update (ClutterStage *stage,
}
}
+static MetaWaylandOutput *
+get_output_for_stage_view (MetaWaylandCompositor *compositor,
+ ClutterStageView *stage_view)
+{
+ MetaCrtc *crtc;
+ MetaOutput *output;
+ MetaMonitor *monitor;
+ MetaLogicalMonitor *logical_monitor;
+
+ crtc = meta_renderer_view_get_crtc (META_RENDERER_VIEW (stage_view));
+
+ /*
+ * All outputs occupy the same region of the screen, as their contents are
+ * the same, so pick the first one.
+ */
+ output = meta_crtc_get_outputs (crtc)->data;
+
+ monitor = meta_output_get_monitor (output);
+ logical_monitor = meta_monitor_get_logical_monitor (monitor);
+ return g_hash_table_lookup (compositor->outputs, &logical_monitor->winsys_id);
+}
+
+static void
+on_presented (ClutterStage *stage,
+ ClutterStageView *stage_view,
+ ClutterFrameInfo *frame_info,
+ MetaWaylandCompositor *compositor)
+{
+ MetaWaylandPresentationFeedback *feedback, *next;
+ struct wl_list *feedbacks;
+ MetaWaylandOutput *output;
+
+ feedbacks =
+ meta_wayland_presentation_time_ensure_feedbacks (&compositor->presentation_time,
+ stage_view);
+
+ output = get_output_for_stage_view (compositor, stage_view);
+
+ wl_list_for_each_safe (feedback, next, feedbacks, link)
+ {
+ meta_wayland_presentation_feedback_present (feedback,
+ frame_info,
+ output);
+ }
+}
+
/**
* meta_wayland_compositor_handle_event:
* @compositor: the #MetaWaylandCompositor instance
@@ -438,6 +484,8 @@ meta_wayland_compositor_setup (MetaWaylandCompositor *compositor)
g_signal_connect (stage, "after-update",
G_CALLBACK (on_after_update), compositor);
+ g_signal_connect (stage, "presented",
+ G_CALLBACK (on_presented), compositor);
if (!wl_global_create (compositor->wayland_display,
&wl_compositor_interface,