aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backend/multi/backend.c1
-rw-r--r--backend/session/session.c13
-rw-r--r--include/wlr/backend/session.h2
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;
};
/*