From 23de56175c8666effae80d7ebb9fdcbf205644cb Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Thu, 27 Jun 2019 13:55:34 -0400 Subject: Implement DRM leasing for non-desktop outputs This prevents sway from extending the desktop to i.e. VR headsets, and makes them available for DRM leasing. --- include/sway/server.h | 4 ++++ sway/desktop/output.c | 14 +++++++++++++- sway/server.c | 17 +++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/include/sway/server.h b/include/sway/server.h index 3c972bc5..e26571e9 100644 --- a/include/sway/server.h +++ b/include/sway/server.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -69,6 +70,9 @@ struct sway_server { struct wl_listener xdg_decoration; struct wl_list xdg_decorations; // sway_xdg_decoration::link + struct wlr_drm_lease_manager_v1 *drm_lease_manager; + struct wl_listener drm_lease_requested; + struct wlr_presentation *presentation; struct wlr_pointer_constraints_v1 *pointer_constraints; diff --git a/sway/desktop/output.c b/sway/desktop/output.c index a86622e1..563c04b8 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -4,9 +4,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -920,7 +922,17 @@ static void handle_present(struct wl_listener *listener, void *data) { void handle_new_output(struct wl_listener *listener, void *data) { struct sway_server *server = wl_container_of(listener, server, new_output); struct wlr_output *wlr_output = data; - sway_log(SWAY_DEBUG, "New output %p: %s", wlr_output, wlr_output->name); + sway_log(SWAY_DEBUG, "New output %p: %s (non-desktop: %d)", + wlr_output, wlr_output->name, wlr_output->non_desktop); + + if (wlr_output->non_desktop) { + sway_log(SWAY_DEBUG, "Not configuring non-desktop output"); + if (server->drm_lease_manager && wlr_output_is_drm(wlr_output)) { + wlr_drm_lease_manager_v1_offer_output( + server->drm_lease_manager, wlr_output); + } + return; + } struct sway_output *output = output_create(wlr_output); if (!output) { diff --git a/sway/server.c b/sway/server.c index ec30430c..63b4bdd7 100644 --- a/sway/server.c +++ b/sway/server.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -51,6 +52,14 @@ bool server_privileged_prepare(struct sway_server *server) { return true; } +static void handle_drm_lease_requested( + 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; + wlr_drm_lease_manager_v1_grant_lease_request(req->manager, req); +} + bool server_init(struct sway_server *server) { sway_log(SWAY_DEBUG, "Initializing Wayland server"); @@ -142,6 +151,14 @@ bool server_init(struct sway_server *server) { server->input_method = wlr_input_method_manager_v2_create(server->wl_display); server->text_input = wlr_text_input_manager_v3_create(server->wl_display); + server->drm_lease_manager = + wlr_drm_lease_manager_v1_create(server->wl_display, server->backend); + if (server->drm_lease_manager) { + server->drm_lease_requested.notify = handle_drm_lease_requested; + wl_signal_add(&server->drm_lease_manager->events.lease_requested, + &server->drm_lease_requested); + } + wlr_export_dmabuf_manager_v1_create(server->wl_display); wlr_screencopy_manager_v1_create(server->wl_display); wlr_data_control_manager_v1_create(server->wl_display); -- cgit v1.2.3