When a surface gets created and no outputs are present,
it won't get properly configured. This happens because
call to configure_presented_surface() depends on a call
to fs_output_set_surface() which requires a valid output.

This patch makes the code save the surface when no
outputs are present and reconfigure it when an output
gets attached, so it gets properly displayed.

Signed-off-by: Armin Krezović <[email protected]>
---
 fullscreen-shell/fullscreen-shell.c | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/fullscreen-shell/fullscreen-shell.c 
b/fullscreen-shell/fullscreen-shell.c
index 9716dc5..f58df2f 100644
--- a/fullscreen-shell/fullscreen-shell.c
+++ b/fullscreen-shell/fullscreen-shell.c
@@ -46,6 +46,8 @@ struct fullscreen_shell {
        struct wl_listener output_created_listener;
 
        struct wl_listener seat_created_listener;
+
+       struct wl_list unmapped_surfaces;
 };
 
 struct fs_output {
@@ -83,6 +85,12 @@ struct pointer_focus_listener {
        struct wl_listener seat_destroyed;
 };
 
+struct fs_surface_list {
+       struct weston_surface *surface;
+       enum zwp_fullscreen_shell_v1_present_method method;
+       struct wl_list link;
+};
+
 static void
 pointer_focus_changed(struct wl_listener *listener, void *data)
 {
@@ -245,10 +253,15 @@ pending_surface_destroyed(struct wl_listener *listener, 
void *data)
        fsout->pending.surface = NULL;
 }
 
+static void
+configure_presented_surface(struct weston_surface *surface, int32_t sx,
+                           int32_t sy);
+
 static struct fs_output *
 fs_output_create(struct fullscreen_shell *shell, struct weston_output *output)
 {
        struct fs_output *fsout;
+       struct fs_surface_list *surf, *next;
 
        fsout = zalloc(sizeof *fsout);
        if (!fsout)
@@ -271,6 +284,14 @@ fs_output_create(struct fullscreen_shell *shell, struct 
weston_output *output)
        weston_layer_entry_insert(&shell->layer.view_list,
                       &fsout->black_view->layer_link);
        wl_list_init(&fsout->transform.link);
+
+       wl_list_for_each_safe(surf, next, &shell->unmapped_surfaces, link) {
+               fs_output_set_surface(fsout, surf->surface, surf->method, 0, 0);
+               configure_presented_surface(surf->surface, 0, 0);
+               wl_list_remove(&surf->link);
+               free(surf);
+       }
+
        return fsout;
 }
 
@@ -676,6 +697,7 @@ fullscreen_shell_present_surface(struct wl_client *client,
        struct weston_surface *surface;
        struct weston_seat *seat;
        struct fs_output *fsout;
+       struct fs_surface_list *surf;
 
        surface = surface_res ? wl_resource_get_user_data(surface_res) : NULL;
 
@@ -692,7 +714,13 @@ fullscreen_shell_present_surface(struct wl_client *client,
                                       "Invalid presentation method");
        }
 
-       if (output_res) {
+       if (wl_list_empty(&shell->output_list)) {
+               surf = zalloc(sizeof *surf);
+               surf->surface = surface;
+               surf->method = method;
+               wl_list_init(&surf->link);
+               wl_list_insert(shell->unmapped_surfaces.prev, &surf->link);
+       } else if (output_res) {
                output = wl_resource_get_user_data(output_res);
                fsout = fs_output_for_output(output);
                fs_output_set_surface(fsout, surface, method, 0, 0);
@@ -831,6 +859,7 @@ module_init(struct weston_compositor *compositor,
                return -1;
 
        shell->compositor = compositor;
+       wl_list_init(&shell->unmapped_surfaces);
 
        shell->client_destroyed.notify = client_destroyed;
 
-- 
2.9.0

_______________________________________________
wayland-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to