[PATCH weston 6/6] libweston-desktop/xwayland: add is_mapped handling for XWAYLAND

Pekka Paalanen ppaalanen at gmail.com
Thu Nov 24 11:40:50 UTC 2016


From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>

The xwayland window type XWAYLAND is not handled by the shell at all,
instead libweston-desktop maps such surfaces itself. However, it forgot
to set weston_surface::is_mapped and weston_view::is_mapped.

weston_surface::is_mapped affects the behaviour of weston_view_unmap()
and weston_surface_attach().

weston_view::is_mapped affects the behaviour of weston_view_unmap() and
weston_view_destroy().

When manually mapping a window of type XWAYLAND, mark both the view and
surface as mapped. This follows the expections in libweston, even though
the meaning of is_mapped is not clearly defined for either surface or
view.

Also, when the XWAYLAND window is manually unmapped, unmap the
weston_surface. This updates weston_surface::is_mapped to reflect the
state. However, as a side-effect it will also unmap all sibling views,
should any exist.

Signed-off-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
---
 libweston-desktop/xwayland.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/libweston-desktop/xwayland.c b/libweston-desktop/xwayland.c
index 7b8f6db..6fb566a 100644
--- a/libweston-desktop/xwayland.c
+++ b/libweston-desktop/xwayland.c
@@ -71,6 +71,7 @@ weston_desktop_xwayland_surface_change_state(struct weston_desktop_xwayland_surf
 					     struct weston_desktop_surface *parent,
 					     int32_t x, int32_t y)
 {
+	struct weston_surface *surface_base;
 	bool to_add = (parent == NULL && state != XWAYLAND);
 
 	assert(state != NONE);
@@ -81,6 +82,8 @@ weston_desktop_xwayland_surface_change_state(struct weston_desktop_xwayland_surf
 		return;
 	}
 
+	surface_base = weston_desktop_surface_get_surface(surface->surface);
+
 	if (surface->state != state) {
 		if (surface->state == XWAYLAND) {
 			assert(!surface->added);
@@ -88,6 +91,7 @@ weston_desktop_xwayland_surface_change_state(struct weston_desktop_xwayland_surf
 			weston_desktop_surface_unlink_view(surface->view);
 			weston_view_destroy(surface->view);
 			surface->view = NULL;
+			weston_surface_unmap(surface_base);
 		}
 
 		if (to_add) {
@@ -109,6 +113,8 @@ weston_desktop_xwayland_surface_change_state(struct weston_desktop_xwayland_surf
 			weston_layer_entry_insert(&surface->xwayland->layer.view_list,
 						  &surface->view->layer_link);
 			weston_view_set_position(surface->view, x, y);
+			surface->view->is_mapped = true;
+			surface_base->is_mapped = true;
 		}
 
 		surface->state = state;
-- 
2.7.3



More information about the wayland-devel mailing list