From: Joshua Ashton Date: Sat, 26 Mar 2022 04:51:54 +0000 (+0000) Subject: output: Implement drm_lease_v1 X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=57a937bdf2210f5696609b30814618a19a015bac;p=proto%2Flabwc.git output: Implement drm_lease_v1 Needed for VR to work properly. --- diff --git a/include/labwc.h b/include/labwc.h index d7ad1ea4..44b4d34e 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -39,6 +39,7 @@ #include #include #include +#include #include #if HAVE_XWAYLAND #include @@ -194,6 +195,9 @@ struct server { struct wlr_foreign_toplevel_manager_v1 *foreign_toplevel_manager; + struct wlr_drm_lease_v1_manager *drm_lease_manager; + struct wl_listener drm_lease_request; + struct wlr_output_power_manager_v1 *output_power_manager_v1; struct wl_listener output_power_manager_set_mode; diff --git a/src/output.c b/src/output.c index 12ef53ed..dac30a6d 100644 --- a/src/output.c +++ b/src/output.c @@ -10,6 +10,7 @@ #include "config.h" #include #include +#include #include #include #include @@ -57,6 +58,20 @@ new_output_notify(struct wl_listener *listener, void *data) struct server *server = wl_container_of(listener, server, new_output); struct wlr_output *wlr_output = data; + /* + * If this is a non-desktop output, offer it for leasing. + * We may want to do more logic here in future, if we choose + * to offer non-desktop outputs. + */ + if (wlr_output->non_desktop) { + wlr_log(WLR_DEBUG, "Not configuring non-desktop output"); + if (server->drm_lease_manager) { + wlr_drm_lease_v1_manager_offer_output(server->drm_lease_manager, + wlr_output); + } + return; + } + /* * Configures the output created by the backend to use our allocator * and our renderer. Must be done once, before commiting the output diff --git a/src/server.c b/src/server.c index 6a713bc6..bc6fc20b 100644 --- a/src/server.c +++ b/src/server.c @@ -146,6 +146,19 @@ handle_input_disinhibit(struct wl_listener *listener, void *data) seat_disinhibit_input(&server->seat); } +static void +handle_drm_lease_request(struct wl_listener *listener, void *data) { + /* We only offer non-desktop outputs, but in the future we might want to do + * more logic here. */ + + 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 request"); + wlr_drm_lease_request_v1_reject(req); + } +} + void server_init(struct server *server) { @@ -339,6 +352,17 @@ server_init(struct server *server) server->foreign_toplevel_manager = wlr_foreign_toplevel_manager_v1_create(server->wl_display); + server->drm_lease_manager= + wlr_drm_lease_v1_manager_create(server->wl_display, server->backend); + if (server->drm_lease_manager) { + server->drm_lease_request.notify = handle_drm_lease_request; + wl_signal_add(&server->drm_lease_manager->events.request, + &server->drm_lease_request); + } else { + wlr_log(WLR_DEBUG, "Failed to create wlr_drm_lease_device_v1"); + wlr_log(WLR_INFO, "VR will not be available"); + } + server->output_power_manager_v1 = wlr_output_power_manager_v1_create(server->wl_display); server->output_power_manager_set_mode.notify =