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
