]> git.mdlowis.com Git - proto/labwc.git/commitdiff
Allow leasing desktop displays
authorJoshua Ashton <joshua@froggi.es>
Thu, 16 Jun 2022 05:56:38 +0000 (05:56 +0000)
committerJohan Malm <johanmalm@users.noreply.github.com>
Thu, 16 Jun 2022 19:42:17 +0000 (20:42 +0100)
Apps such as Gamescope eventually want to offer a DRM lease option to use planes and handle all of getting to the screen themselves.

This implements logic to allow leasing of desktop displays

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

index 83a30db0856f784da3cffa49f9fc7f69b46aae48..41778345bea6e2cc8ca9b3fba86ee561217b29f1 100644 (file)
@@ -251,6 +251,8 @@ struct output {
 
        struct wl_listener destroy;
        struct wl_listener frame;
+
+       bool leased;
 };
 
 #undef LAB_NR_LAYERS
index 7f6ac9affc7ecffd2a87c12e9a96fba3a243c0d4..d2634cf74bd481d614a101eb31be57262f5e37d6 100644 (file)
@@ -59,16 +59,22 @@ new_output_notify(struct wl_listener *listener, void *data)
        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.
+        * We offer any display as available for lease, some apps like
+        * gamescope, want to take ownership of a display when they can
+        * to use planes and present directly.
+        * This is also useful for debugging the DRM parts of
+        * another compositor.
+        */
+       if (server->drm_lease_manager) {
+               wlr_drm_lease_v1_manager_offer_output(
+                       server->drm_lease_manager, wlr_output);
+       }
+
+       /*
+        * Don't configure any non-desktop displays, such as VR headsets;
         */
        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;
        }
 
@@ -231,11 +237,12 @@ output_config_apply(struct server *server,
        wl_list_for_each(head, &config->heads, link) {
                struct wlr_output *o = head->state.output;
                struct output *output = output_from_wlr_output(server, o);
-               bool need_to_add = head->state.enabled && !o->enabled;
-               bool need_to_remove = !head->state.enabled && o->enabled;
+               bool output_enabled = head->state.enabled && !output->leased;
+               bool need_to_add = output_enabled && !o->enabled;
+               bool need_to_remove = !output_enabled && o->enabled;
 
-               wlr_output_enable(o, head->state.enabled);
-               if (head->state.enabled) {
+               wlr_output_enable(o, output_enabled);
+               if (output_enabled) {
                        /* Output specifc actions only */
                        if (head->state.mode) {
                                wlr_output_set_mode(o, head->state.mode);
@@ -261,7 +268,7 @@ output_config_apply(struct server *server,
                        assert(output->scene_output);
                }
 
-               if (head->state.enabled) {
+               if (output_enabled) {
                        wlr_output_layout_move(server->output_layout, o,
                                head->state.x, head->state.y);
                }
index 9f6ad07801ac43b62e4d4ed37bcce0bba54ed868..df9d89358756c4723e214ff37492a30ed473ef0a 100644 (file)
@@ -151,16 +151,27 @@ handle_input_disinhibit(struct wl_listener *listener, void *data)
 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);
+               return;
+       }
+
+       for(size_t i = 0; i < req->n_connectors; ++i) {
+               struct output *output = req->connectors[i]->output->data;
+               if (!output) {
+                       continue;
+               }
+
+               wlr_output_enable(output->wlr_output, false);
+               wlr_output_commit(output->wlr_output);
+
+               wlr_output_layout_remove(output->server->output_layout, output->wlr_output);
+               output->scene_output = NULL;
+
+               output->leased = true;
        }
 }