compositor: send the output_created signal after inserting it in the list
authorGiulio Camuffo <giuliocamuffo@gmail.com>
Wed, 6 May 2015 18:41:57 +0000 (21:41 +0300)
committerBryce Harrington <bryce@osg.samsung.com>
Fri, 8 May 2015 21:09:02 +0000 (14:09 -0700)
The compositor's output_created signal used to be sent in weston_output_init()
which the backend call before putting the output in the output_list.
This caused problems when creating a new view in a listener to that signal,
because weston_view_assign_output() doesn't yet know the new output exists.
To fix this add a new weston_composito_add_output() func which adds the
output in the list and later sends the signal, and make the backends call
that.

src/compositor-drm.c
src/compositor-fbdev.c
src/compositor-headless.c
src/compositor-rdp.c
src/compositor-rpi.c
src/compositor-wayland.c
src/compositor-x11.c
src/compositor.c
src/compositor.h

index 43197a87d679fbebcb9f25a18657bf34296cf4ca..0cdb8f47a58bced016450c7c34fabf9b7248b1f8 100644 (file)
@@ -2125,7 +2125,7 @@ create_output_for_connector(struct drm_compositor *ec,
                weston_log("Failed to initialize backlight\n");
        }
 
-       wl_list_insert(ec->base.output_list.prev, &output->base.link);
+       weston_compositor_add_output(&ec->base, &output->base);
 
        find_and_parse_output_edid(ec, output, connector);
        if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)
index bac6b87de9eb50f53096e083cb3f4c4ce86e34d1..7c505ce8c7935547ad98431f6818120e07f08df5 100644 (file)
@@ -581,7 +581,7 @@ fbdev_output_create(struct fbdev_compositor *compositor,
        output->finish_frame_timer =
                wl_event_loop_add_timer(loop, finish_frame_handler, output);
 
-       wl_list_insert(compositor->base.output_list.prev, &output->base.link);
+       weston_compositor_add_output(&compositor->base, &output->base);
 
        weston_log("fbdev output %d×%d px\n",
                   output->mode.width, output->mode.height);
index 1b1d327aef18720575445ec790f7154d71b6dae1..fe35289e9882588f9bb37fc9960d7e5609843b2a 100644 (file)
@@ -169,7 +169,7 @@ headless_compositor_create_output(struct headless_compositor *c,
                                                  output->image);
        }
 
-       wl_list_insert(c->base.output_list.prev, &output->base.link);
+       weston_compositor_add_output(&c->base, &output->base);
 
        return 0;
 }
index 6955d49389645caf6f8e691b413f69c11f362995..0d649286ef3fe6770a4b3ab624757848f10c13aa 100644 (file)
@@ -488,7 +488,7 @@ rdp_compositor_create_output(struct rdp_compositor *c, int width, int height)
        output->base.switch_mode = rdp_switch_mode;
        c->output = output;
 
-       wl_list_insert(c->base.output_list.prev, &output->base.link);
+       weston_compositor_add_output(&c->base, &output->base);
        return 0;
 
 out_shadow_surface:
index bc93923cef761460e052af4ea0d06030d38d8490..1c0a783310ee31e7e4d0e9a63d0a0dd669cf8b6b 100644 (file)
@@ -357,7 +357,7 @@ rpi_output_create(struct rpi_compositor *compositor, uint32_t transform)
        if (rpi_renderer_output_create(&output->base, output->display) < 0)
                goto out_output;
 
-       wl_list_insert(compositor->base.output_list.prev, &output->base.link);
+       weston_compositor_add_output(&compositor->base, &output->base);
 
        weston_log("Raspberry Pi HDMI output %dx%d px\n",
                   output->mode.width, output->mode.height);
index 6c333619f05321b4c1cfc91a1e3440b00319bce2..303151c4be0f1374fbc295bf2149ab5cfd7f5a6a 100644 (file)
@@ -1057,7 +1057,7 @@ wayland_output_create(struct wayland_compositor *c, int x, int y,
        output->base.set_dpms = NULL;
        output->base.switch_mode = wayland_output_switch_mode;
 
-       wl_list_insert(c->base.output_list.prev, &output->base.link);
+       weston_compositor_add_output(&c->base, &output->base);
 
        return output;
 
index 9792ac6da49e7d3f2e2be9dd96ba4993da1d25c5..5129e852b2162d3c62f6b377b1bd7772e973d1f1 100644 (file)
@@ -915,7 +915,7 @@ x11_compositor_create_output(struct x11_compositor *c, int x, int y,
        output->finish_frame_timer =
                wl_event_loop_add_timer(loop, finish_frame_handler, output);
 
-       wl_list_insert(c->base.output_list.prev, &output->base.link);
+       weston_compositor_add_output(&c->base, &output->base);
 
        weston_log("x11 output %dx%d, window id %d\n",
                   width, height, output->window);
index 698ee52073b4cba7562f9db86ad85b6f6668ed74..8f02b4de4b7b3f9d2f6a0f248255221a4adf4166 100644 (file)
@@ -4125,7 +4125,20 @@ weston_output_init(struct weston_output *output, struct weston_compositor *c,
        output->global =
                wl_global_create(c->wl_display, &wl_output_interface, 2,
                                 output, bind_output);
-       wl_signal_emit(&c->output_created_signal, output);
+}
+
+/** Adds an output to the compositor's output list and
+ *  send the compositor's output_created signal.
+ *
+ * \param compositor The compositor instance.
+ * \param output The output to be added.
+ */
+WL_EXPORT void
+weston_compositor_add_output(struct weston_compositor *compositor,
+                             struct weston_output *output)
+{
+       wl_list_insert(compositor->output_list.prev, &output->link);
+       wl_signal_emit(&compositor->output_created_signal, output);
 }
 
 WL_EXPORT void
index f9834ba6eb049aba79a808abbf52094fffe28118..867f8c461d09a2b15d474bdc7bc5c7c33fcd8c8f 100644 (file)
@@ -1374,6 +1374,9 @@ void
 weston_output_init(struct weston_output *output, struct weston_compositor *c,
                   int x, int y, int width, int height, uint32_t transform, int32_t scale);
 void
+weston_compositor_add_output(struct weston_compositor *compositor,
+                             struct weston_output *output);
+void
 weston_output_destroy(struct weston_output *output);
 void
 weston_output_transform_coordinate(struct weston_output *output,