aboutsummaryrefslogtreecommitdiff
path: root/backend/backend.c
diff options
context:
space:
mode:
authorTony Crisci <tony@dubstepdish.com>2017-12-21 18:40:54 -0500
committerGitHub <noreply@github.com>2017-12-21 18:40:54 -0500
commit0a370c529806077a11638e7fa856d5fbb539496b (patch)
treeb00eb27649a61035af82b735673e6fd780862f9b /backend/backend.c
parent1a96ce0c53c84295d33b143e1b6cf02cb7017d50 (diff)
parent4cec7f54e24a58fd9756395ce64a5bd73f412c9e (diff)
Merge pull request #506 from acrisci/multi-backend-fixes
[wip] multibackend fixes
Diffstat (limited to 'backend/backend.c')
-rw-r--r--backend/backend.c52
1 files changed, 31 insertions, 21 deletions
diff --git a/backend/backend.c b/backend/backend.c
index f93dde38..6b32bc6a 100644
--- a/backend/backend.c
+++ b/backend/backend.c
@@ -18,6 +18,7 @@ void wlr_backend_init(struct wlr_backend *backend,
const struct wlr_backend_impl *impl) {
assert(backend);
backend->impl = impl;
+ wl_signal_init(&backend->events.destroy);
wl_signal_init(&backend->events.input_add);
wl_signal_init(&backend->events.input_remove);
wl_signal_init(&backend->events.output_add);
@@ -32,6 +33,11 @@ bool wlr_backend_start(struct wlr_backend *backend) {
}
void wlr_backend_destroy(struct wlr_backend *backend) {
+ if (!backend) {
+ return;
+ }
+
+ wl_signal_emit(&backend->events.destroy, backend);
if (backend->impl && backend->impl->destroy) {
backend->impl->destroy(backend);
} else {
@@ -70,39 +76,46 @@ static struct wlr_backend *attempt_wl_backend(struct wl_display *display) {
}
struct wlr_backend *wlr_backend_autocreate(struct wl_display *display) {
- struct wlr_backend *backend;
+ struct wlr_backend *backend = wlr_multi_backend_create(display);
+ if (!backend) {
+ wlr_log(L_ERROR, "could not allocate multibackend");
+ return NULL;
+ }
+
if (getenv("WAYLAND_DISPLAY") || getenv("_WAYLAND_DISPLAY")) {
- backend = attempt_wl_backend(display);
- if (backend) {
+ struct wlr_backend *wl_backend = attempt_wl_backend(display);
+ if (wl_backend) {
+ wlr_multi_backend_add(backend, wl_backend);
return backend;
}
}
const char *x11_display = getenv("DISPLAY");
if (x11_display) {
- return wlr_x11_backend_create(display, x11_display);
+ struct wlr_backend *x11_backend =
+ wlr_x11_backend_create(display, x11_display);
+ wlr_multi_backend_add(backend, x11_backend);
+ return backend;
}
// Attempt DRM+libinput
-
struct wlr_session *session = wlr_session_create(display);
if (!session) {
wlr_log(L_ERROR, "Failed to start a DRM session");
+ wlr_backend_destroy(backend);
return NULL;
}
- backend = wlr_multi_backend_create(display, session);
- if (!backend) {
- goto error_session;
- }
-
struct wlr_backend *libinput = wlr_libinput_backend_create(display, session);
- if (!libinput) {
- goto error_multi;
+ if (libinput) {
+ wlr_multi_backend_add(backend, libinput);
+ } else {
+ wlr_log(L_ERROR, "Failed to start libinput backend");
+ wlr_backend_destroy(backend);
+ wlr_session_destroy(session);
+ return NULL;
}
- wlr_multi_backend_add(backend, libinput);
-
int gpus[8];
size_t num_gpus = wlr_session_find_gpus(session, 8, gpus);
struct wlr_backend *primary_drm = NULL;
@@ -125,16 +138,13 @@ struct wlr_backend *wlr_backend_autocreate(struct wl_display *display) {
if (!primary_drm) {
wlr_log(L_ERROR, "Failed to open any DRM device");
- goto error_multi;
+ wlr_backend_destroy(libinput);
+ wlr_session_destroy(session);
+ wlr_backend_destroy(backend);
+ return NULL;
}
return backend;
-
-error_multi:
- wlr_backend_destroy(backend);
-error_session:
- wlr_session_destroy(session);
- return NULL;
}
uint32_t usec_to_msec(uint64_t usec) {