]> git.mdlowis.com Git - proto/labwc.git/commitdiff
output: Implement drm_lease_v1
authorJoshua Ashton <joshua@froggi.es>
Sat, 26 Mar 2022 04:51:54 +0000 (04:51 +0000)
committerJohan Malm <johanmalm@users.noreply.github.com>
Mon, 28 Mar 2022 20:13:51 +0000 (21:13 +0100)
Needed for VR to work properly.

include/labwc.h
src/output.c
src/server.c

index d7ad1ea4c9c699e821701dacd25382496032518e..44b4d34e67cb853b14a2222f5bf290fbe31a17a5 100644 (file)
@@ -39,6 +39,7 @@
 #include <wlr/types/wlr_xcursor_manager.h>
 #include <wlr/types/wlr_xdg_decoration_v1.h>
 #include <wlr/types/wlr_xdg_shell.h>
+#include <wlr/types/wlr_drm_lease_v1.h>
 #include <wlr/util/log.h>
 #if HAVE_XWAYLAND
 #include <wlr/xwayland.h>
@@ -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;
 
index 12ef53edd9b64ff715ea552d21ad09171a05adbe..dac30a6dab61e0ad29bf8e1caf2248967f0a83d7 100644 (file)
@@ -10,6 +10,7 @@
 #include "config.h"
 #include <assert.h>
 #include <wlr/types/wlr_buffer.h>
+#include <wlr/types/wlr_drm_lease_v1.h>
 #include <wlr/types/wlr_output.h>
 #include <wlr/types/wlr_xdg_output_v1.h>
 #include <wlr/types/wlr_scene.h>
@@ -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
index 6a713bc69985fb339a9591262f6c42dd979dc418..bc6fc20bb763347b6b62779316bcc38375c3f589 100644 (file)
@@ -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 =