From 6001235b0465ba1961f8abd66a860bcf1f14fc22 Mon Sep 17 00:00:00 2001
From: emersion <contact@emersion.fr>
Date: Fri, 8 Dec 2017 11:17:56 +0100
Subject: Listen to display destroy in session

It's not the backend's responsibility to destroy the session anymore.
---
 backend/multi/backend.c       |  1 -
 backend/session/session.c     | 13 ++++++++++++-
 include/wlr/backend/session.h |  2 ++
 3 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/backend/multi/backend.c b/backend/multi/backend.c
index c35303e0..fc0c5b81 100644
--- a/backend/multi/backend.c
+++ b/backend/multi/backend.c
@@ -35,7 +35,6 @@ static void multi_backend_destroy(struct wlr_backend *_backend) {
 		wlr_backend_destroy(sub->backend);
 		free(sub);
 	}
-	wlr_session_destroy(backend->session);
 	free(backend);
 }
 
diff --git a/backend/session/session.c b/backend/session/session.c
index 657558fd..0ed54499 100644
--- a/backend/session/session.c
+++ b/backend/session/session.c
@@ -58,6 +58,12 @@ out:
 	return 1;
 }
 
+static void handle_display_destroy(struct wl_listener *listener, void *data) {
+	struct wlr_session *session =
+		wl_container_of(listener, session, display_destroy);
+	wlr_session_destroy(session);
+}
+
 struct wlr_session *wlr_session_create(struct wl_display *disp) {
 	struct wlr_session *session = NULL;
 	const struct session_impl **iter;
@@ -100,6 +106,9 @@ struct wlr_session *wlr_session_create(struct wl_display *disp) {
 		goto error_mon;
 	}
 
+	session->display_destroy.notify = handle_display_destroy;
+	wl_display_add_destroy_listener(disp, &session->display_destroy);
+
 	return session;
 
 error_mon:
@@ -107,7 +116,7 @@ error_mon:
 error_udev:
 	udev_unref(session->udev);
 error_session:
-	wlr_session_destroy(session);
+	session->impl->destroy(session);
 	return NULL;
 }
 
@@ -116,6 +125,8 @@ void wlr_session_destroy(struct wlr_session *session) {
 		return;
 	}
 
+	wl_list_remove(&session->display_destroy.link);
+
 	wl_event_source_remove(session->udev_event);
 	udev_monitor_unref(session->mon);
 	udev_unref(session->udev);
diff --git a/include/wlr/backend/session.h b/include/wlr/backend/session.h
index 5c822ea9..3242a13f 100644
--- a/include/wlr/backend/session.h
+++ b/include/wlr/backend/session.h
@@ -33,6 +33,8 @@ struct wlr_session {
 	struct wl_event_source *udev_event;
 
 	struct wl_list devices;
+
+	struct wl_listener display_destroy;
 };
 
 /*
-- 
cgit v1.2.3