shell: Handle the desktop shell client destroy signal

Set the internal pointer for the client to NULL. This fixes a
segmentation fault at shutdown, where the shell would hang up before
and cause libwayland to call wl_client_destroy(). When the shell was
destroyed later, another call to wl_client_destroy() would cause the
crash.

https://bugs.freedesktop.org/show_bug.cgi?id=72550
diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index 3d586ec..714881b 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -5008,6 +5008,17 @@
 }
 
 static void
+desktop_shell_client_destroy(struct wl_listener *listener, void *data)
+{
+	struct desktop_shell *shell;
+
+	shell = container_of(listener, struct desktop_shell,
+			     child.client_destroy_listener);
+
+	shell->child.client = NULL;
+}
+
+static void
 launch_desktop_shell_process(void *data)
 {
 	struct desktop_shell *shell = data;
@@ -5019,6 +5030,11 @@
 
 	if (!shell->child.client)
 		weston_log("not able to start %s\n", shell->client);
+
+	shell->child.client_destroy_listener.notify =
+		desktop_shell_client_destroy;
+	wl_client_add_destroy_listener(shell->child.client,
+				       &shell->child.client_destroy_listener);
 }
 
 static void