From b1cc5fb459436d3d66637e50595abc051ebf1b0d Mon Sep 17 00:00:00 2001 From: Furkan Sahin Date: Fri, 8 May 2026 09:45:01 -0400 Subject: [PATCH] Allow copying of any outputs current attempts at copying regions outside the first output end up wrapping into the first output. Fix this by allowing compositors to expose the layout. --- .../wlr/types/wlr_ext_image_capture_source_v1.h | 6 ++++++ types/ext_image_capture_source_v1/output.c | 15 ++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/include/wlr/types/wlr_ext_image_capture_source_v1.h b/include/wlr/types/wlr_ext_image_capture_source_v1.h index 309cad0c8..99c8e9d7b 100644 --- a/include/wlr/types/wlr_ext_image_capture_source_v1.h +++ b/include/wlr/types/wlr_ext_image_capture_source_v1.h @@ -17,6 +17,7 @@ struct wlr_scene_node; struct wlr_allocator; struct wlr_renderer; +struct wlr_output_layout; /** * A screen capture source. @@ -80,6 +81,7 @@ struct wlr_ext_output_image_capture_source_manager_v1 { struct wl_global *global; struct wl_display *display; struct wlr_scene *scene; + struct wlr_output_layout *layout; struct { struct wl_listener display_destroy; @@ -87,6 +89,10 @@ struct wlr_ext_output_image_capture_source_manager_v1 { struct wlr_backend *headless_backend; }; +void wlr_ext_output_image_capture_source_manager_v1_set_layout( + struct wlr_ext_output_image_capture_source_manager_v1 *manager, + struct wlr_output_layout *layout); + void wlr_ext_output_image_capture_source_manager_v1_set_scene( struct wlr_ext_output_image_capture_source_manager_v1 *manager, struct wlr_scene *scene); diff --git a/types/ext_image_capture_source_v1/output.c b/types/ext_image_capture_source_v1/output.c index a358cbb13..65b99691c 100644 --- a/types/ext_image_capture_source_v1/output.c +++ b/types/ext_image_capture_source_v1/output.c @@ -6,13 +6,13 @@ #include #include #include +#include #include #include #include #include "types/wlr_scene.h" #include #include "ext-image-capture-source-v1-protocol.h" -#include #define OUTPUT_IMAGE_SOURCE_MANAGER_V1_VERSION 1 @@ -124,6 +124,11 @@ static void source_update_buffer_constraints(struct wlr_ext_output_image_capture output->swapchain, output->renderer); } +void wlr_ext_output_image_capture_source_manager_v1_set_layout( + struct wlr_ext_output_image_capture_source_manager_v1 *manager, + struct wlr_output_layout *layout) { + manager->layout = layout; +} static void output_source_start(struct wlr_ext_image_capture_source_v1 *base, bool with_cursors) { @@ -152,6 +157,14 @@ static void output_source_start(struct wlr_ext_image_capture_source_v1 *base, real->allocator, real->renderer); source->hidden_scene_output = wlr_scene_output_create( source->manager->scene, source->hidden_output); + if (source->manager->layout) { + struct wlr_box box; + wlr_output_layout_get_box(source->manager->layout, + source->output, &box); + wlr_scene_output_set_position(source->hidden_scene_output, + box.x, box.y); + } + if (!source->hidden_scene_output) { wlr_output_destroy(source->hidden_output); source->hidden_output = NULL;