commit 5d32737

shrub  ·  2026-09-02 14:40:45 +0000 UTC
parent 361fa39
allow transparency in screenshots
1 files changed,  +19, -6
+19, -6
 1@@ -2076,12 +2076,25 @@ compositor_render_to_shm(struct screen *screen)
 2 
 3 		if (src &&
 4 		    (wld_capabilities(swc.shm->renderer, src) & WLD_CAPABILITY_READ)) {
 5-			int32_t x = view->base.geometry.x - screen->base.geometry.x;
 6-			int32_t y = view->base.geometry.y - screen->base.geometry.y;
 7-
 8-			wld_copy_rectangle(swc.shm->renderer, src, x, y, 0, 0,
 9-			                   view->base.geometry.width,
10-			                   view->base.geometry.height);
11+			const struct swc_rectangle *geom = &view->base.geometry;
12+			int32_t src_x = view->window ? view->buffer_offset_x : 0;
13+			int32_t src_y = view->window ? view->buffer_offset_y : 0;
14+			int32_t dst_x = geom->x - src_x - screen->base.geometry.x;
15+			int32_t dst_y = geom->y - src_y - screen->base.geometry.y;
16+			pixman_region32_t source_region;
17+
18+			pixman_region32_init_rect(&source_region, src_x, src_y, geom->width,
19+			                          geom->height);
20+			pixman_region32_intersect_rect(&source_region, &source_region, 0, 0,
21+			                               src->width, src->height);
22+			if (src->format == WLD_FORMAT_ARGB8888) {
23+				wld_blend_region(swc.shm->renderer, src, dst_x, dst_y,
24+				                 &source_region);
25+			} else {
26+				wld_copy_region(swc.shm->renderer, src, dst_x, dst_y,
27+				                &source_region);
28+			}
29+			pixman_region32_fini(&source_region);
30 		}
31 
32 		if ((view->border.outwidth > 0 || view->border.inwidth > 0) &&