summaryrefslogtreecommitdiff
path: root/sway/desktop/render.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/desktop/render.c')
-rw-r--r--sway/desktop/render.c49
1 files changed, 27 insertions, 22 deletions
diff --git a/sway/desktop/render.c b/sway/desktop/render.c
index 467ab440..0cbe0d62 100644
--- a/sway/desktop/render.c
+++ b/sway/desktop/render.c
@@ -173,7 +173,10 @@ static void render_surface_iterator(struct sway_output *output,
if (clip_box != NULL) {
dst_box.width = fmin(dst_box.width, clip_box->width);
dst_box.height = fmin(dst_box.height, clip_box->height);
+ dst_box.x = fmax(dst_box.x, clip_box->x);
+ dst_box.y = fmax(dst_box.y, clip_box->y);
}
+
scale_box(&dst_box, wlr_output->scale);
data->deco_data.corner_radius *= wlr_output->scale;
@@ -382,21 +385,22 @@ static void render_view_toplevels(struct sway_view *view, struct sway_output *ou
.damage = damage,
.deco_data = deco_data,
};
+ // Clip the window to its view size, ignoring CSD
struct wlr_box clip_box;
- if (!container_is_current_floating(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;
+ struct sway_container_state state = view->container->current;
+ clip_box.x = state.x - output->lx;
+ clip_box.y = state.y - output->ly;
+ clip_box.width = state.width;
+ clip_box.height = state.height;
+ if (state.border == B_PIXEL || state.border == B_NORMAL) {
+ clip_box.x += state.border_thickness;
+ clip_box.y += state.border_thickness;
+ clip_box.width -= state.border_thickness * 2;
+ clip_box.height -= state.border_thickness * 2;
}
- // Render all toplevels without descending into popups
- double ox = view->container->surface_x -
- output->lx - view->geometry.x;
- double oy = view->container->surface_y -
- output->ly - view->geometry.y;
- output_surface_for_each_surface(output, view->surface, ox, oy,
- render_surface_iterator, &data);
+ data.clip_box = &clip_box;
+
+ output_view_for_each_surface(output, view, render_surface_iterator, &data);
}
static void render_view_popups(struct sway_view *view, struct sway_output *output,
@@ -417,8 +421,6 @@ static void render_saved_view(struct sway_view *view, struct sway_output *output
return;
}
- bool floating = container_is_current_floating(view->container);
-
struct sway_saved_buffer *saved_buf;
wl_list_for_each(saved_buf, &view->saved_buffers, link) {
if (!saved_buf->buffer->texture) {
@@ -451,13 +453,16 @@ static void render_saved_view(struct sway_view *view, struct sway_output *output
wlr_matrix_project_box(matrix, &proj_box, transform, 0,
wlr_output->transform_matrix);
- if (!floating) {
- dst_box.width = fmin(dst_box.width,
- view->container->current.content_width -
- (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) + view->saved_geometry.y);
+ struct sway_container_state state = view->container->current;
+ dst_box.x = state.x - output->lx;
+ dst_box.y = state.y - output->ly;
+ dst_box.width = state.width;
+ dst_box.height = state.height;
+ if (state.border == B_PIXEL || state.border == B_NORMAL) {
+ dst_box.x += state.border_thickness;
+ dst_box.y += state.border_thickness;
+ dst_box.width -= state.border_thickness * 2;
+ dst_box.height -= state.border_thickness * 2;
}
scale_box(&dst_box, wlr_output->scale);