From dcd64ae48bd088e4288bf233b8fc138190fec6b0 Mon Sep 17 00:00:00 2001 From: Yuxuan Shui Date: Sun, 4 Jan 2026 20:27:18 +0000 Subject: [PATCH] Implement the drm-lease-v1 protocol --- cage.c | 29 +++++++++++++++++++++++++++++ output.c | 10 ++++++++++ server.h | 7 +++++++ 3 files changed, 46 insertions(+) diff --git a/cage.c b/cage.c index 0f03cd9..7c3d89d 100644 --- a/cage.c +++ b/cage.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -80,6 +81,19 @@ handle_display_destroy(struct wl_listener *listener, void *data) server->terminated = true; } +#if WLR_HAS_DRM_BACKEND +static void +handle_drm_lease_request(struct wl_listener *listener, void *data) +{ + struct wlr_drm_lease_request_v1 *req = data; + struct wlr_drm_lease_v1 *lease = wlr_drm_lease_request_v1_grant(req); + if (!lease) { + wlr_log(WLR_ERROR, "Failed to grant lease"); + wlr_drm_lease_request_v1_reject(req); + } +} +#endif + static int sigchld_handler(int fd, uint32_t mask, void *data) { @@ -497,6 +511,16 @@ main(int argc, char *argv[]) server.output_manager_test.notify = handle_output_manager_test; wl_signal_add(&server.output_manager_v1->events.test, &server.output_manager_test); +#if WLR_HAS_DRM_BACKEND + server.drm_lease_v1 = wlr_drm_lease_v1_manager_create(server.wl_display, server.backend); + if (server.drm_lease_v1) { + server.drm_lease_request.notify = handle_drm_lease_request; + wl_signal_add(&server.drm_lease_v1->events.request, &server.drm_lease_request); + } else { + wlr_log(WLR_INFO, "Failed to create wlr_drm_lease_manager_v1"); + } +#endif + if (!wlr_gamma_control_manager_v1_create(server.wl_display)) { wlr_log(WLR_ERROR, "Unable to create the gamma control manager"); ret = 1; @@ -612,6 +636,11 @@ main(int argc, char *argv[]) #endif wl_display_destroy_clients(server.wl_display); +#if WLR_HAS_DRM_BACKEND + if (server.drm_lease_v1) { + wl_list_remove(&server.drm_lease_request.link); + } +#endif wl_list_remove(&server.new_virtual_pointer.link); wl_list_remove(&server.new_virtual_keyboard.link); wl_list_remove(&server.output_manager_apply.link); diff --git a/output.c b/output.c index 093836b..9f2a708 100644 --- a/output.c +++ b/output.c @@ -237,6 +237,16 @@ handle_new_output(struct wl_listener *listener, void *data) struct cg_server *server = wl_container_of(listener, server, new_output); struct wlr_output *wlr_output = data; + if (wlr_output->non_desktop) { + wlr_log(WLR_DEBUG, "Not configuring non-desktop output: %s", wlr_output->name); +#if WLR_HAS_DRM_BACKEND + if (server->drm_lease_v1) { + wlr_drm_lease_v1_manager_offer_output(server->drm_lease_v1, wlr_output); + } +#endif + return; + } + if (!wlr_output_init_render(wlr_output, server->allocator, server->renderer)) { wlr_log(WLR_ERROR, "Failed to initialize output rendering"); return; diff --git a/server.h b/server.h index 277b09e..27f212a 100644 --- a/server.h +++ b/server.h @@ -4,6 +4,8 @@ #include "config.h" #include +#include +#include #include #include #include @@ -59,6 +61,11 @@ struct cg_server { struct wl_listener output_manager_apply; struct wl_listener output_manager_test; +#if WLR_HAS_DRM_BACKEND + struct wlr_drm_lease_v1_manager *drm_lease_v1; + struct wl_listener drm_lease_request; +#endif + struct wlr_relative_pointer_manager_v1 *relative_pointer_manager; struct wlr_foreign_toplevel_manager_v1 *foreign_toplevel_manager;