diff --git a/hw/xwayland/xwayland-present.c b/hw/xwayland/xwayland-present.c index dcacb8ee8..8e800d91b 100644 --- a/hw/xwayland/xwayland-present.c +++ b/hw/xwayland/xwayland-present.c @@ -873,7 +873,9 @@ xwl_present_flip(present_vblank_ptr vblank, RegionPtr damage) struct xwl_present_event *event = xwl_present_event_from_vblank(vblank); Bool implicit_sync = TRUE; - if (!xwl_window || !xwl_window->allow_commits) + if (!xwl_window || + !xwl_window->allow_commits || + xwl_window->awaiting_initial_configure_event) return FALSE; buffer = xwl_pixmap_get_wl_buffer(pixmap); diff --git a/hw/xwayland/xwayland-screen.c b/hw/xwayland/xwayland-screen.c index edb8007a5..1bdd957db 100644 --- a/hw/xwayland/xwayland-screen.c +++ b/hw/xwayland/xwayland-screen.c @@ -454,6 +454,12 @@ xwl_screen_post_damage(struct xwl_screen *xwl_screen) if (!xwl_window->allow_commits) continue; + /* Running rootful, we must wait for the initial configuration + * negotiation to complete before we can post damage. + */ + if (xwl_window->awaiting_initial_configure_event) + continue; + xwl_window_post_damage(xwl_window); xorg_list_del(&xwl_window->link_damage); xorg_list_append(&xwl_window->link_damage, &commit_window_list); diff --git a/hw/xwayland/xwayland-window.c b/hw/xwayland/xwayland-window.c index 7a7a54da4..7d6599089 100644 --- a/hw/xwayland/xwayland-window.c +++ b/hw/xwayland/xwayland-window.c @@ -360,6 +360,13 @@ unregister_damage(struct xwl_window *xwl_window) dixSetPrivate(&surface_window->devPrivates, &xwl_damage_private_key, NULL); } +static void +xwl_window_maybe_commit_surface(struct xwl_window *xwl_window) +{ + if (!xwl_window->awaiting_initial_configure_event) + wl_surface_commit(xwl_window->surface); +} + static Bool xwl_window_update_fractional_scale(struct xwl_window *xwl_window, int fractional_scale_numerator) @@ -828,7 +835,7 @@ xwl_window_set_fullscreen(struct xwl_window *xwl_window) xdg_toplevel_set_fullscreen(xwl_window->xdg_toplevel, wl_output); xwl_window_check_resolution_change_emulation(xwl_window); - wl_surface_commit(xwl_window->surface); + xwl_window_maybe_commit_surface(xwl_window); xwl_window->wl_output_fullscreen = wl_output; @@ -1008,7 +1015,12 @@ handle_libdecor_configure(struct libdecor_frame *frame, xwl_window_update_libdecor_size(xwl_window, configuration, round(new_width), round(new_height)); - wl_surface_commit(xwl_window->surface); + + if (xwl_window->awaiting_initial_configure_event) { + xwl_window->awaiting_initial_configure_event = FALSE; + xwl_window_attach_buffer(xwl_window); + wl_surface_commit(xwl_window->surface); + } } static void @@ -1054,7 +1066,12 @@ xdg_surface_handle_configure(void *data, xwl_window_set_fullscreen(xwl_window); xdg_surface_ack_configure(xdg_surface, serial); - wl_surface_commit(xwl_window->surface); + + if (xwl_window->awaiting_initial_configure_event) { + xwl_window->awaiting_initial_configure_event = FALSE; + xwl_window_attach_buffer(xwl_window); + wl_surface_commit(xwl_window->surface); + } } static const struct xdg_surface_listener xdg_surface_listener = { @@ -1095,7 +1112,7 @@ xwl_window_update_surface_scale(struct xwl_window *xwl_window) } else #endif - wl_surface_commit(xwl_window->surface); + xwl_window_maybe_commit_surface(xwl_window); } } @@ -1280,7 +1297,7 @@ xwl_window_update_rootful_scale(struct xwl_window *xwl_window, double previous_s } else #endif - wl_surface_commit(xwl_window->surface); + xwl_window_maybe_commit_surface(xwl_window); } static void @@ -1360,6 +1377,7 @@ xwl_create_root_surface(struct xwl_window *xwl_window) xwl_window_rootful_update_title(xwl_window); xwl_window_rootful_set_app_id(xwl_window); wl_surface_commit(xwl_window->surface); + xwl_window->awaiting_initial_configure_event = TRUE; region = wl_compositor_create_region(xwl_screen->compositor); if (region == NULL) { diff --git a/hw/xwayland/xwayland-window.h b/hw/xwayland/xwayland-window.h index ac3ce5034..09d53054c 100644 --- a/hw/xwayland/xwayland-window.h +++ b/hw/xwayland/xwayland-window.h @@ -106,6 +106,7 @@ struct xwl_window { struct wp_fractional_scale_v1 *fractional_scale; int fractional_scale_numerator; struct wp_linux_drm_syncobj_surface_v1 *surface_sync; + Bool awaiting_initial_configure_event; }; struct xwl_window *xwl_window_get(WindowPtr window);