From dd24991c9ef26bcd215e0601ca3a86a36e72a64b Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Wed, 7 Jun 2023 14:15:44 +0200 Subject: [PATCH] backend/wayland: take existing wl_display in wlr_wl_backend_create() This allows compositors to use an existing wl_display, to integrate wlroots with an existing toolkit. --- backend/wayland/backend.c | 23 ++++++++++++++++------- include/backend/wayland.h | 1 + include/wlr/backend/wayland.h | 7 +++---- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/backend/wayland/backend.c b/backend/wayland/backend.c index 82285be9..ba67b2bf 100644 --- a/backend/wayland/backend.c +++ b/backend/wayland/backend.c @@ -529,7 +529,9 @@ static void backend_destroy(struct wlr_backend *backend) { wl_compositor_destroy(wl->compositor); wl_registry_destroy(wl->registry); wl_display_flush(wl->remote_display); - wl_display_disconnect(wl->remote_display); + if (wl->own_remote_display) { + wl_display_disconnect(wl->remote_display); + } free(wl); } @@ -568,7 +570,7 @@ static void handle_display_destroy(struct wl_listener *listener, void *data) { } struct wlr_backend *wlr_wl_backend_create(struct wl_display *display, - const char *remote) { + struct wl_display *remote_display) { wlr_log(WLR_INFO, "Creating wayland backend"); struct wlr_wl_backend *wl = calloc(1, sizeof(*wl)); @@ -585,10 +587,15 @@ struct wlr_backend *wlr_wl_backend_create(struct wl_display *display, wl_list_init(&wl->buffers); wl->presentation_clock = CLOCK_MONOTONIC; - wl->remote_display = wl_display_connect(remote); - if (!wl->remote_display) { - wlr_log_errno(WLR_ERROR, "Could not connect to remote display"); - goto error_wl; + if (remote_display != NULL) { + wl->remote_display = remote_display; + } else { + wl->remote_display = wl_display_connect(NULL); + if (!wl->remote_display) { + wlr_log_errno(WLR_ERROR, "Could not connect to remote display"); + goto error_wl; + } + wl->own_remote_display = true; } wl->registry = wl_display_get_registry(wl->remote_display); @@ -685,7 +692,9 @@ error_registry: } wl_registry_destroy(wl->registry); error_display: - wl_display_disconnect(wl->remote_display); + if (wl->own_remote_display) { + wl_display_disconnect(wl->remote_display); + } error_wl: wlr_backend_finish(&wl->backend); free(wl); diff --git a/include/backend/wayland.h b/include/backend/wayland.h index fd056403..1e731469 100644 --- a/include/backend/wayland.h +++ b/include/backend/wayland.h @@ -30,6 +30,7 @@ struct wlr_wl_backend { /* remote state */ struct wl_display *remote_display; + bool own_remote_display; struct wl_event_source *remote_display_src; struct wl_registry *registry; struct wl_compositor *compositor; diff --git a/include/wlr/backend/wayland.h b/include/wlr/backend/wayland.h index 770d6a03..45df69e1 100644 --- a/include/wlr/backend/wayland.h +++ b/include/wlr/backend/wayland.h @@ -12,12 +12,11 @@ struct wlr_input_device; * Creates a new Wayland backend. This backend will be created with no outputs; * you must use wlr_wl_output_create() to add them. * - * The `remote` argument is the name of the host compositor wayland socket. Set - * to NULL for the default behaviour (WAYLAND_DISPLAY env variable or wayland-0 - * default). + * The remote_display argument is an existing libwayland-client struct wl_display + * to use. Leave it NULL to create a new connection to the compositor. */ struct wlr_backend *wlr_wl_backend_create(struct wl_display *display, - const char *remote); + struct wl_display *remote_display); /** * Returns the remote struct wl_display used by the Wayland backend.