backend/wayland: Implement start() interface of ds_backend
[platform/core/uifw/libds.git] / src / examples / tinyds.c
index 1c5ca4f..fcaabaf 100644 (file)
@@ -89,6 +89,7 @@ struct tinyds_server
 
     struct wl_list views;
 
+    struct wl_listener new_output;
     struct wl_listener new_input;
     struct wl_listener new_xdg_surface;
 };
@@ -115,7 +116,8 @@ static void server_fini(struct tinyds_server *server);
 static void server_add_view(struct tinyds_server *server,
         struct ds_xdg_surface *xdg_surface);
 static bool output_init(struct tinyds_output *output,
-        struct tinyds_server *server, int width, int height);
+        struct tinyds_server *server, struct ds_output *ds_output,
+        int width, int height);
 static void output_fini(struct tinyds_output *output);
 static void output_damage(struct tinyds_output *output);
 static void output_redraw(struct tinyds_output *output);
@@ -167,6 +169,18 @@ create_wl_backend(struct wl_display *display)
 }
 
 static void
+server_handle_new_output(struct wl_listener *listener, void *data)
+{
+    struct tinyds_server *server;
+    struct ds_output *ds_output = data;
+
+    server = wl_container_of(listener, server, new_output);
+
+    assert(output_init(&server->output, server, ds_output,
+            OUTPUT_WIDTH, OUTPUT_HEIGHT) == true);
+}
+
+static void
 keyboard_handle_device_destroy(struct wl_listener *listener, void *data)
 {
     struct tinyds_keyboard *kbd;
@@ -500,11 +514,13 @@ server_init(struct tinyds_server *server, struct wl_display *display)
     if (!server->backend)
         return false;
 
+    ds_wl_backend_create_output(server->backend);
+
     server->new_input.notify = server_handle_new_input;
     ds_backend_add_new_input_listener(server->backend, &server->new_input);
 
-    if (!output_init(&server->output, server, OUTPUT_WIDTH, OUTPUT_HEIGHT))
-        goto err;
+    server->new_output.notify = server_handle_new_output;
+    ds_backend_add_new_output_listener(server->backend, &server->new_output);
 
     server->compositor = ds_compositor_create(display);
     if (!server->compositor)
@@ -564,9 +580,10 @@ output_handle_frame(struct wl_listener *listener, void *data TINYDS_UNUSED)
 
 static bool
 output_init(struct tinyds_output *output, struct tinyds_server *server,
-        int width, int height)
+        struct ds_output *ds_output, int width, int height)
 {
     output->server = server;
+    output->ds_output = ds_output;
     output->width = width;
     output->height = height;
     output->drawable = true;
@@ -580,11 +597,6 @@ output_init(struct tinyds_output *output, struct tinyds_server *server,
     if (!output->swapchain)
         goto err_swapchain;
 
-    output->ds_output =
-        ds_wl_backend_create_output(server->backend);
-    if (!output->ds_output)
-        goto err_output;
-
     output->output_destroy.notify = output_handle_destroy;
     ds_output_add_destroy_listener(output->ds_output, &output->output_destroy);
 
@@ -593,8 +605,6 @@ output_init(struct tinyds_output *output, struct tinyds_server *server,
 
     return true;
 
-err_output:
-    ds_swapchain_destroy(output->swapchain);
 err_swapchain:
     ds_allocator_destroy(output->allocator);
 
@@ -604,8 +614,7 @@ err_swapchain:
 static void
 output_fini(struct tinyds_output *output)
 {
-    if (output->ds_output)
-        ds_output_destroy(output->ds_output);
+    ds_output_destroy(output->ds_output);
     ds_swapchain_destroy(output->swapchain);
     ds_allocator_destroy(output->allocator);
 }