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;
}
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);
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);
}
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;
}
}