[PATCH weston 1/2] compositor: Emit a signal once the first frame is displayed

Ander Conselvan de Oliveira ander.conselvan.de.oliveira at intel.com
Tue Feb 12 07:52:52 PST 2013


This patch adds a signal to the compositor that is fired after the
first frame is displayed. The intent of this signal is to let non
critical initialization to be done after something is displayed.
---
 src/compositor.c |   22 +++++++++++++++++++---
 src/compositor.h |    3 +++
 2 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/src/compositor.c b/src/compositor.c
index 8a2504b..ea43b4b 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -1135,8 +1135,8 @@ weston_compositor_read_input(int fd, uint32_t mask, void *data)
 	return 1;
 }
 
-WL_EXPORT void
-weston_output_finish_frame(struct weston_output *output, uint32_t msecs)
+static void
+output_finish_frame(struct weston_output *output, uint32_t msecs)
 {
 	struct weston_compositor *compositor = output->compositor;
 	struct wl_event_loop *loop =
@@ -1159,12 +1159,25 @@ weston_output_finish_frame(struct weston_output *output, uint32_t msecs)
 				     weston_compositor_read_input, compositor);
 }
 
+WL_EXPORT void
+weston_output_finish_frame(struct weston_output *output, uint32_t msecs)
+{
+	struct weston_compositor *compositor = output->compositor;
+
+	if (!compositor->first_frame_displayed) {
+		wl_signal_emit(&compositor->first_frame_signal, compositor);
+		compositor->first_frame_displayed = 1;
+	}
+
+	output_finish_frame(output, msecs);
+}
+
 static void
 idle_repaint(void *data)
 {
 	struct weston_output *output = data;
 
-	weston_output_finish_frame(output, weston_compositor_get_time());
+	output_finish_frame(output, weston_compositor_get_time());
 }
 
 WL_EXPORT void
@@ -2957,6 +2970,7 @@ weston_compositor_init(struct weston_compositor *ec,
 
 	ec->wl_display = display;
 	wl_signal_init(&ec->destroy_signal);
+	wl_signal_init(&ec->first_frame_signal);
 	wl_signal_init(&ec->activate_signal);
 	wl_signal_init(&ec->kill_signal);
 	wl_signal_init(&ec->lock_signal);
@@ -2966,6 +2980,8 @@ weston_compositor_init(struct weston_compositor *ec,
 	wl_signal_init(&ec->seat_created_signal);
 	ec->launcher_sock = weston_environment_get_fd("WESTON_LAUNCHER_SOCK");
 
+	ec->first_frame_displayed = 0;
+
 	ec->output_id_pool = 0;
 
 	if (!wl_display_add_global(display, &wl_compositor_interface,
diff --git a/src/compositor.h b/src/compositor.h
index 544cf33..bcbabc6 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -344,6 +344,9 @@ struct weston_compositor {
 	struct xkb_rule_names xkb_names;
 	struct xkb_context *xkb_context;
 	struct weston_xkb_info xkb_info;
+
+	struct wl_signal first_frame_signal;
+	int first_frame_displayed;
 };
 
 struct weston_buffer_reference {
-- 
1.7.10.4



More information about the wayland-devel mailing list