From 52bd8aa71671fbdcf091a8b68b4eb2bb200b624d Mon Sep 17 00:00:00 2001 From: emersion Date: Tue, 15 May 2018 22:08:08 +0100 Subject: [PATCH] backend/multi: disallow multiple renderers at the same time --- backend/multi/backend.c | 20 +++++++++++++++----- include/wlr/backend/multi.h | 2 +- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/backend/multi/backend.c b/backend/multi/backend.c index b70d7003..33dfc6c5 100644 --- a/backend/multi/backend.c +++ b/backend/multi/backend.c @@ -130,20 +130,29 @@ static struct subbackend_state *multi_backend_get_subbackend(struct wlr_multi_ba return NULL; } -void wlr_multi_backend_add(struct wlr_backend *_multi, +bool wlr_multi_backend_add(struct wlr_backend *_multi, struct wlr_backend *backend) { assert(wlr_backend_is_multi(_multi)); struct wlr_multi_backend *multi = (struct wlr_multi_backend *)_multi; if (multi_backend_get_subbackend(multi, backend)) { // already added - return; + return true; } - struct subbackend_state *sub; - if (!(sub = calloc(1, sizeof(struct subbackend_state)))) { + struct wlr_renderer *multi_renderer = + multi_backend_get_renderer(&multi->backend); + struct wlr_renderer *backend_renderer = wlr_backend_get_renderer(backend); + if (multi_renderer != NULL && backend_renderer != NULL) { + wlr_log(L_ERROR, "Could not add backend: multiple renderers at the " + "same time aren't supported"); + return false; + } + + struct subbackend_state *sub = calloc(1, sizeof(struct subbackend_state)); + if (sub == NULL) { wlr_log(L_ERROR, "Could not add backend: allocation failed"); - return; + return false; } wl_list_insert(&multi->backends, &sub->link); @@ -160,6 +169,7 @@ void wlr_multi_backend_add(struct wlr_backend *_multi, sub->new_output.notify = new_output_reemit; wlr_signal_emit_safe(&multi->events.backend_add, backend); + return true; } void wlr_multi_backend_remove(struct wlr_backend *_multi, diff --git a/include/wlr/backend/multi.h b/include/wlr/backend/multi.h index 842eed67..1e04dba4 100644 --- a/include/wlr/backend/multi.h +++ b/include/wlr/backend/multi.h @@ -13,7 +13,7 @@ struct wlr_backend *wlr_multi_backend_create(struct wl_display *display); * Adds the given backend to the multi backend. This should be done before the * new backend is started. */ -void wlr_multi_backend_add(struct wlr_backend *multi, +bool wlr_multi_backend_add(struct wlr_backend *multi, struct wlr_backend *backend); void wlr_multi_backend_remove(struct wlr_backend *multi,