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.
This commit is contained in:
Furkan Sahin 2026-05-08 09:45:01 -04:00
parent 5c1ba2cf04
commit b1cc5fb459
2 changed files with 20 additions and 1 deletions

View file

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

View file

@ -6,13 +6,13 @@
#include <wlr/types/wlr_ext_image_capture_source_v1.h>
#include <wlr/types/wlr_ext_image_copy_capture_v1.h>
#include <wlr/types/wlr_output.h>
#include <wlr/types/wlr_output_layout.h>
#include <wlr/util/addon.h>
#include <wlr/backend/headless.h>
#include <wlr/types/wlr_scene.h>
#include "types/wlr_scene.h"
#include <wayland-server-core.h>
#include "ext-image-capture-source-v1-protocol.h"
#include <wlr/util/log.h>
#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;