diff --git a/backend/backend.c b/backend/backend.c index a391b272..93f764f6 100644 --- a/backend/backend.c +++ b/backend/backend.c @@ -62,8 +62,7 @@ static struct wlr_backend *attempt_wl_backend(struct wl_display *display) { return backend; } -struct wlr_backend *wlr_backend_autocreate(struct wl_display *display, - struct wlr_session *session) { +struct wlr_backend *wlr_backend_autocreate(struct wl_display *display) { struct wlr_backend *backend; if (getenv("WAYLAND_DISPLAY") || getenv("_WAYLAND_DISPLAY")) { backend = attempt_wl_backend(display); @@ -71,43 +70,61 @@ struct wlr_backend *wlr_backend_autocreate(struct wl_display *display, return backend; } } - // Attempt DRM+libinput - struct wlr_udev *udev; - if (!(udev = wlr_udev_create(display))) { - wlr_log(L_ERROR, "Failed to start udev"); - goto error; + + if (getenv("DISPLAY")) { + // TODO: X11 backend + return NULL; } + + // Attempt DRM+libinput + + struct wlr_session *session = wlr_session_start(display); + if (!session) { + wlr_log(L_ERROR, "Failed to start a DRM session"); + return NULL; + } + + struct wlr_udev *udev = wlr_udev_create(display); + if (!udev) { + wlr_log(L_ERROR, "Failed to start udev"); + goto error_session; + } + int gpu = wlr_udev_find_gpu(udev, session); if (gpu == -1) { wlr_log(L_ERROR, "Failed to open DRM device"); goto error_udev; } - backend = wlr_multi_backend_create(); + + backend = wlr_multi_backend_create(session, udev); if (!backend) { goto error_gpu; } - struct wlr_backend *libinput = - wlr_libinput_backend_create(display, session, udev); + + struct wlr_backend *libinput = wlr_libinput_backend_create(display, session, udev); if (!libinput) { goto error_multi; } - struct wlr_backend *drm = - wlr_drm_backend_create(display, session, udev, gpu); + + struct wlr_backend *drm = wlr_drm_backend_create(display, session, udev, gpu); if (!drm) { goto error_libinput; } + wlr_multi_backend_add(backend, libinput); wlr_multi_backend_add(backend, drm); return backend; + error_libinput: wlr_backend_destroy(libinput); error_multi: wlr_backend_destroy(backend); error_gpu: - close(gpu); + wlr_session_close_file(session, gpu); error_udev: wlr_udev_destroy(udev); -error: +error_session: + wlr_session_finish(session); return NULL; } diff --git a/backend/multi/backend.c b/backend/multi/backend.c index d33d137c..2e8f117c 100644 --- a/backend/multi/backend.c +++ b/backend/multi/backend.c @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include #include "backend/multi.h" @@ -31,6 +33,8 @@ static void multi_backend_destroy(struct wlr_backend_state *state) { free(sub); } list_free(state->backends); + wlr_session_finish(state->session); + wlr_udev_destroy(state->udev); free(state); } @@ -39,21 +43,26 @@ struct wlr_backend_impl backend_impl = { .destroy = multi_backend_destroy }; -struct wlr_backend *wlr_multi_backend_create() { +struct wlr_backend *wlr_multi_backend_create(struct wlr_session *session, + struct wlr_udev *udev) { struct wlr_backend_state *state = calloc(1, sizeof(struct wlr_backend_state)); if (!state) { wlr_log(L_ERROR, "Backend allocation failed"); return NULL; } + state->backends = list_create(); if (!state->backends) { free(state); wlr_log(L_ERROR, "Backend allocation failed"); return NULL; } + struct wlr_backend *backend = wlr_backend_create(&backend_impl, state); state->backend = backend; + state->session = session; + state->udev = udev; return backend; } diff --git a/examples/shared.c b/examples/shared.c index 6d225a85..823d8e0c 100644 --- a/examples/shared.c +++ b/examples/shared.c @@ -440,12 +440,6 @@ static void output_remove_notify(struct wl_listener *listener, void *data) { void compositor_init(struct compositor_state *state) { state->display = wl_display_create(); state->event_loop = wl_display_get_event_loop(state->display); - state->session = wlr_session_start(state->display); - if (!state->session - || !state->display - || !state->event_loop) { - exit(1); - } wl_list_init(&state->keyboards); wl_list_init(&state->pointers); @@ -463,10 +457,8 @@ void compositor_init(struct compositor_state *state) { wl_list_init(&state->output_remove.link); state->output_remove.notify = output_remove_notify; - struct wlr_backend *wlr = wlr_backend_autocreate( - state->display, state->session); + struct wlr_backend *wlr = wlr_backend_autocreate(state->display); if (!wlr) { - wlr_session_finish(state->session); exit(1); } wl_signal_add(&wlr->events.input_add, &state->input_add); @@ -481,7 +473,6 @@ void compositor_init(struct compositor_state *state) { if (!socket) { wlr_log_errno(L_ERROR, "Unable to open wayland socket"); wlr_backend_destroy(wlr); - wlr_session_finish(state->session); exit(1); } @@ -490,7 +481,6 @@ void compositor_init(struct compositor_state *state) { if (!wlr_backend_init(state->backend)) { wlr_log(L_ERROR, "Failed to initialize backend"); wlr_backend_destroy(wlr); - wlr_session_finish(state->session); exit(1); } } @@ -498,6 +488,5 @@ void compositor_init(struct compositor_state *state) { void compositor_run(struct compositor_state *state) { wl_display_run(state->display); wlr_backend_destroy(state->backend); - wlr_session_finish(state->session); wl_display_destroy(state->display); } diff --git a/include/backend/multi.h b/include/backend/multi.h index efaf61b9..617d4c98 100644 --- a/include/backend/multi.h +++ b/include/backend/multi.h @@ -3,10 +3,14 @@ #include #include +#include #include +#include struct wlr_backend_state { struct wlr_backend *backend; + struct wlr_session *session; + struct wlr_udev *udev; list_t *backends; }; diff --git a/include/wlr/backend.h b/include/wlr/backend.h index db85c169..74cb34a9 100644 --- a/include/wlr/backend.h +++ b/include/wlr/backend.h @@ -19,8 +19,7 @@ struct wlr_backend { } events; }; -struct wlr_backend *wlr_backend_autocreate(struct wl_display *display, - struct wlr_session *session); +struct wlr_backend *wlr_backend_autocreate(struct wl_display *display); bool wlr_backend_init(struct wlr_backend *backend); void wlr_backend_destroy(struct wlr_backend *backend); diff --git a/include/wlr/backend/multi.h b/include/wlr/backend/multi.h index a07ca770..00b34722 100644 --- a/include/wlr/backend/multi.h +++ b/include/wlr/backend/multi.h @@ -2,8 +2,11 @@ #define _WLR_BACKEND_MULTI_H #include +#include +#include -struct wlr_backend *wlr_multi_backend_create(); +struct wlr_backend *wlr_multi_backend_create(struct wlr_session *session, + struct wlr_udev *udev); void wlr_multi_backend_add(struct wlr_backend *multi, struct wlr_backend *backend); diff --git a/session/session.c b/session/session.c index 6f6aa2ea..3f4c7910 100644 --- a/session/session.c +++ b/session/session.c @@ -30,6 +30,10 @@ struct wlr_session *wlr_session_start(struct wl_display *disp) { } void wlr_session_finish(struct wlr_session *session) { + if (!session) { + return; + } + session->impl->finish(session); }; @@ -42,5 +46,9 @@ void wlr_session_close_file(struct wlr_session *session, int fd) { } bool wlr_session_change_vt(struct wlr_session *session, unsigned vt) { + if (!session) { + return false; + } + return session->impl->change_vt(session, vt); }