From 681f38c8783c14723a8cf88114e5af824d4952b8 Mon Sep 17 00:00:00 2001
From: emersion <contact@emersion.fr>
Date: Fri, 30 Mar 2018 11:22:12 -0400
Subject: [PATCH] Fix segfault on xwayland unmanaged view unmap

---
 sway/desktop/xwayland.c | 18 ++++++++----------
 1 file changed, 8 insertions(+), 10 deletions(-)

diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c
index c3697b4c..d608c8b6 100644
--- a/sway/desktop/xwayland.c
+++ b/sway/desktop/xwayland.c
@@ -104,14 +104,11 @@ static void handle_commit(struct wl_listener *listener, void *data) {
 static void handle_destroy(struct wl_listener *listener, void *data) {
 	struct sway_xwayland_surface *sway_surface =
 		wl_container_of(listener, sway_surface, destroy);
-	struct wlr_xwayland_surface *xsurface = data;
+
 	wl_list_remove(&sway_surface->commit.link);
 	wl_list_remove(&sway_surface->destroy.link);
 	wl_list_remove(&sway_surface->request_configure.link);
-	if (xsurface->override_redirect && xsurface->mapped) {
-		wl_list_remove(&sway_surface->view->unmanaged_view_link);
-		wl_list_init(&sway_surface->view->unmanaged_view_link);
-	}
+	wl_list_remove(&sway_surface->view->unmanaged_view_link);
 
 	struct sway_container *parent = container_view_destroy(sway_surface->view->swayc);
 	if (parent) {
@@ -125,11 +122,9 @@ static void handle_destroy(struct wl_listener *listener, void *data) {
 static void handle_unmap_notify(struct wl_listener *listener, void *data) {
 	struct sway_xwayland_surface *sway_surface =
 		wl_container_of(listener, sway_surface, unmap_notify);
-	struct wlr_xwayland_surface *xsurface = data;
-	if (xsurface->override_redirect && xsurface->mapped) {
-		wl_list_remove(&sway_surface->view->unmanaged_view_link);
-		wl_list_init(&sway_surface->view->unmanaged_view_link);
-	}
+
+	wl_list_remove(&sway_surface->view->unmanaged_view_link);
+	wl_list_init(&sway_surface->view->unmanaged_view_link);
 
 	// take it out of the tree
 	struct sway_container *parent = container_view_destroy(sway_surface->view->swayc);
@@ -152,6 +147,7 @@ static void handle_map_notify(struct wl_listener *listener, void *data) {
 	// put it back into the tree
 	if (wlr_xwayland_surface_is_unmanaged(xsurface) ||
 			xsurface->override_redirect) {
+		wl_list_remove(&sway_surface->view->unmanaged_view_link);
 		wl_list_insert(&root_container.sway_root->unmanaged_views,
 			&sway_surface->view->unmanaged_view_link);
 	} else {
@@ -210,6 +206,8 @@ void handle_xwayland_surface(struct wl_listener *listener, void *data) {
 	sway_view->surface = xsurface->surface;
 	sway_surface->view = sway_view;
 
+	wl_list_init(&sway_view->unmanaged_view_link);
+
 	// TODO:
 	// - Look up pid and open on appropriate workspace
 	// - Set new view to maximized so it behaves nicely