From: Quentin Glidic <sardemff7+...@sardemff7.net>

This fixes a race between Xwayland committing the surface content via
the wl_surface, and the XWM setting the role of the surface.
We now keep track of the (first) content commit on the surface and
forward it to the shell when we finally get the role.
There is no need to track later changes, as the only way for Xwayland to
unmap a surface is to destroy it.

Signed-off-by: Quentin Glidic <sardemff7+...@sardemff7.net>
Reviewed-by: Pekka Paalanen <pekka.paala...@collabora.co.uk>
---
v2: a brand new commit message :-)

 libweston-desktop/xwayland.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/libweston-desktop/xwayland.c b/libweston-desktop/xwayland.c
index 002e2523c..4b4407b9c 100644
--- a/libweston-desktop/xwayland.c
+++ b/libweston-desktop/xwayland.c
@@ -61,6 +61,7 @@ struct weston_desktop_xwayland_surface {
        const struct weston_xwayland_client_interface *client_interface;
        struct weston_geometry next_geometry;
        bool has_next_geometry;
+       bool committed;
        bool added;
        enum weston_desktop_xwayland_surface_state state;
 };
@@ -99,6 +100,14 @@ weston_desktop_xwayland_surface_change_state(struct 
weston_desktop_xwayland_surf
                        weston_desktop_api_surface_added(surface->desktop,
                                                         surface->surface);
                        surface->added = true;
+                       if (surface->state == NONE && surface->committed)
+                               /* We had a race, and wl_surface.commit() was
+                                * faster, just fake a commit to map the
+                                * surface */
+                               weston_desktop_api_committed(surface->desktop,
+                                                            surface->surface,
+                                                            0, 0);
+
                } else if (surface->added) {
                        weston_desktop_api_surface_removed(surface->desktop,
                                                           surface->surface);
@@ -133,6 +142,7 @@ weston_desktop_xwayland_surface_committed(struct 
weston_desktop_surface *dsurfac
        struct weston_geometry oldgeom;
 
        assert(dsurface == surface->surface);
+       surface->committed = true;
 
 #ifdef WM_DEBUG
        weston_log("%s: xwayland surface %p\n", __func__, surface);
-- 
2.15.0

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to