aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFurkan Sahin <furkan-dev@proton.me>2021-04-25 23:25:23 +0200
committerFurkan Sahin <furkan-dev@proton.me>2021-04-25 23:25:23 +0200
commit2a920e8a53de12f06f113a38e15d2ed9abea8d03 (patch)
tree7b9f8eb230e971c5588f8a9d8de2a0ff5c6eecab
parent0c2fdca94bf84293c5fb03e47411863b5c0f1790 (diff)
desktop/render: Pass explicit clip box to render
render_surface_iterator previously deduced the clip box from an optional container passed with render data. This causes problems when offsets in view geometry need to be compensated for in the clip dimensions. Instead, prepare the clip box in render_view_toplevels where the offsets are being applied, and compensate for them immediately. A similar compensation is applied to render_saved_view. Closes: https://github.com/swaywm/sway/issues/6223
-rw-r--r--sway/desktop/render.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/sway/desktop/render.c b/sway/desktop/render.c
index 42d62b90..8f1e9c52 100644
--- a/sway/desktop/render.c
+++ b/sway/desktop/render.c
@@ -32,7 +32,7 @@
struct render_data {
pixman_region32_t *damage;
float alpha;
- struct sway_container *container;
+ struct wlr_box *clip_box;
};
/**
@@ -157,10 +157,10 @@ static void render_surface_iterator(struct sway_output *output, struct sway_view
wlr_output->transform_matrix);
struct wlr_box dst_box = *_box;
- struct sway_container *container = data->container;
- if (container != NULL) {
- dst_box.width = fmin(dst_box.width, container->current.content_width);
- dst_box.height = fmin(dst_box.height, container->current.content_height);
+ struct wlr_box *clip_box = data->clip_box;
+ if (clip_box != NULL) {
+ dst_box.width = fmin(dst_box.width, clip_box->width);
+ dst_box.height = fmin(dst_box.height, clip_box->height);
}
scale_box(&dst_box, wlr_output->scale);
@@ -262,8 +262,13 @@ static void render_view_toplevels(struct sway_view *view,
.damage = damage,
.alpha = alpha,
};
+ struct wlr_box clip_box;
if (!container_is_current_floating(view->container)) {
- data.container = view->container;
+ // As we pass the geometry offsets to the surface iterator, we will
+ // need to account for the offsets in the clip dimensions.
+ clip_box.width = view->container->current.content_width + view->geometry.x;
+ clip_box.height = view->container->current.content_height + view->geometry.y;
+ data.clip_box = &clip_box;
}
// Render all toplevels without descending into popups
double ox = view->container->surface_x -
@@ -329,10 +334,10 @@ static void render_saved_view(struct sway_view *view,
if (!floating) {
dst_box.width = fmin(dst_box.width,
view->container->current.content_width -
- (saved_buf->x - view->container->current.content_x));
+ (saved_buf->x - view->container->current.content_x) + view->saved_geometry.x);
dst_box.height = fmin(dst_box.height,
view->container->current.content_height -
- (saved_buf->y - view->container->current.content_y));
+ (saved_buf->y - view->container->current.content_y) + view->saved_geometry.y);
}
scale_box(&dst_box, wlr_output->scale);