Skip to content

Commit

Permalink
desktop/render: Pass explicit clip box to render
Browse files Browse the repository at this point in the history
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: #6223
(cherry picked from commit 4e6f515)
  • Loading branch information
kennylevinsen authored and emersion committed Jun 24, 2021
1 parent ee4e4bb commit 2660c0c
Showing 1 changed file with 13 additions and 8 deletions.
21 changes: 13 additions & 8 deletions sway/desktop/render.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
struct render_data {
pixman_region32_t *damage;
float alpha;
struct sway_container *container;
struct wlr_box *clip_box;
};

/**
Expand Down Expand Up @@ -160,10 +160,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);

Expand Down Expand Up @@ -265,8 +265,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 -
Expand Down Expand Up @@ -332,10 +337,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);

Expand Down

0 comments on commit 2660c0c

Please sign in to comment.