aboutsummaryrefslogtreecommitdiff
path: root/backend/backend.c
diff options
context:
space:
mode:
authoremersion <contact@emersion.fr>2018-05-15 22:10:51 +0100
committeremersion <contact@emersion.fr>2018-05-19 09:09:03 +0100
commit007d83c6ee20ec4d39aa2d7a4ff3fb3158bc5fb3 (patch)
tree3a99294394606a8d5bb99d1514a25d46c573cf63 /backend/backend.c
parent52bd8aa71671fbdcf091a8b68b4eb2bb200b624d (diff)
backend: allow multiple backends in WLR_BACKENDS
Diffstat (limited to 'backend/backend.c')
-rw-r--r--backend/backend.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/backend/backend.c b/backend/backend.c
index 0ea42cf5..a66cb5f3 100644
--- a/backend/backend.c
+++ b/backend/backend.c
@@ -1,3 +1,4 @@
+#define _POSIX_C_SOURCE 200809L
#include <assert.h>
#include <errno.h>
#include <libinput.h>
@@ -138,16 +139,32 @@ struct wlr_backend *wlr_backend_autocreate(struct wl_display *display) {
return NULL;
}
- const char *name = getenv("WLR_BACKEND");
- if (name) {
- struct wlr_backend *subbackend = attempt_backend_by_name(display, name);
- if (subbackend) {
- wlr_multi_backend_add(backend, subbackend);
- return backend;
- } else {
- wlr_log(L_ERROR, "unrecognized backend '%s'", name);
+ char *names = getenv("WLR_BACKENDS");
+ if (names) {
+ names = strdup(names);
+ if (names == NULL) {
+ wlr_log(L_ERROR, "allocation failed");
return NULL;
}
+
+ char *saveptr;
+ char *name = strtok_r(names, ",", &saveptr);
+ while (name != NULL) {
+ struct wlr_backend *subbackend =
+ attempt_backend_by_name(display, name);
+ if (subbackend == NULL) {
+ wlr_log(L_ERROR, "unrecognized backend '%s'", name);
+ return NULL;
+ }
+
+ if (!wlr_multi_backend_add(backend, subbackend)) {
+ return NULL;
+ }
+
+ name = strtok_r(NULL, ",", &saveptr);
+ }
+
+ return backend;
}
if (getenv("WAYLAND_DISPLAY") || getenv("_WAYLAND_DISPLAY") ||