aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2023-06-07 14:15:44 +0200
committerSimon Ser <contact@emersion.fr>2023-08-16 16:29:09 +0200
commitdd24991c9ef26bcd215e0601ca3a86a36e72a64b (patch)
tree6a689b939f0438794beeaf6cdd3c25c1b6ebdf3e
parent664ec59095996662ad7c158c64a2d5dfc50f58a1 (diff)
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.
-rw-r--r--backend/wayland/backend.c23
-rw-r--r--include/backend/wayland.h1
-rw-r--r--include/wlr/backend/wayland.h7
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.