diff options
Diffstat (limited to 'sway/desktop')
-rw-r--r-- | sway/desktop/render.c | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/sway/desktop/render.c b/sway/desktop/render.c index 908ad819..46622224 100644 --- a/sway/desktop/render.c +++ b/sway/desktop/render.c | |||
@@ -32,6 +32,7 @@ | |||
32 | struct render_data { | 32 | struct render_data { |
33 | pixman_region32_t *damage; | 33 | pixman_region32_t *damage; |
34 | float alpha; | 34 | float alpha; |
35 | struct sway_container *container; | ||
35 | }; | 36 | }; |
36 | 37 | ||
37 | /** | 38 | /** |
@@ -149,15 +150,23 @@ static void render_surface_iterator(struct sway_output *output, struct sway_view | |||
149 | struct wlr_fbox src_box; | 150 | struct wlr_fbox src_box; |
150 | wlr_surface_get_buffer_source_box(surface, &src_box); | 151 | wlr_surface_get_buffer_source_box(surface, &src_box); |
151 | 152 | ||
152 | struct wlr_box dst_box = *_box; | 153 | struct wlr_box proj_box = *_box; |
153 | scale_box(&dst_box, wlr_output->scale); | 154 | scale_box(&proj_box, wlr_output->scale); |
154 | 155 | ||
155 | float matrix[9]; | 156 | float matrix[9]; |
156 | enum wl_output_transform transform = | 157 | enum wl_output_transform transform = |
157 | wlr_output_transform_invert(surface->current.transform); | 158 | wlr_output_transform_invert(surface->current.transform); |
158 | wlr_matrix_project_box(matrix, &dst_box, transform, rotation, | 159 | wlr_matrix_project_box(matrix, &proj_box, transform, rotation, |
159 | wlr_output->transform_matrix); | 160 | wlr_output->transform_matrix); |
160 | 161 | ||
162 | struct wlr_box dst_box = *_box; | ||
163 | struct sway_container *container = data->container; | ||
164 | if (container != NULL) { | ||
165 | dst_box.width = fmin(dst_box.width, container->current.content_width - surface->sx); | ||
166 | dst_box.height = fmin(dst_box.height, container->current.content_height - surface->sy); | ||
167 | } | ||
168 | scale_box(&dst_box, wlr_output->scale); | ||
169 | |||
161 | render_texture(wlr_output, output_damage, texture, | 170 | render_texture(wlr_output, output_damage, texture, |
162 | &src_box, &dst_box, matrix, alpha); | 171 | &src_box, &dst_box, matrix, alpha); |
163 | 172 | ||
@@ -256,6 +265,9 @@ static void render_view_toplevels(struct sway_view *view, | |||
256 | .damage = damage, | 265 | .damage = damage, |
257 | .alpha = alpha, | 266 | .alpha = alpha, |
258 | }; | 267 | }; |
268 | if (!container_is_current_floating(view->container)) { | ||
269 | data.container = view->container; | ||
270 | } | ||
259 | // Render all toplevels without descending into popups | 271 | // Render all toplevels without descending into popups |
260 | double ox = view->container->surface_x - | 272 | double ox = view->container->surface_x - |
261 | output->lx - view->geometry.x; | 273 | output->lx - view->geometry.x; |
@@ -282,13 +294,16 @@ static void render_saved_view(struct sway_view *view, | |||
282 | if (wl_list_empty(&view->saved_buffers)) { | 294 | if (wl_list_empty(&view->saved_buffers)) { |
283 | return; | 295 | return; |
284 | } | 296 | } |
297 | |||
298 | bool floating = container_is_current_floating(view->container); | ||
299 | |||
285 | struct sway_saved_buffer *saved_buf; | 300 | struct sway_saved_buffer *saved_buf; |
286 | wl_list_for_each(saved_buf, &view->saved_buffers, link) { | 301 | wl_list_for_each(saved_buf, &view->saved_buffers, link) { |
287 | if (!saved_buf->buffer->texture) { | 302 | if (!saved_buf->buffer->texture) { |
288 | continue; | 303 | continue; |
289 | } | 304 | } |
290 | 305 | ||
291 | struct wlr_box box = { | 306 | struct wlr_box proj_box = { |
292 | .x = saved_buf->x - view->saved_geometry.x - output->lx, | 307 | .x = saved_buf->x - view->saved_geometry.x - output->lx, |
293 | .y = saved_buf->y - view->saved_geometry.y - output->ly, | 308 | .y = saved_buf->y - view->saved_geometry.y - output->ly, |
294 | .width = saved_buf->width, | 309 | .width = saved_buf->width, |
@@ -301,20 +316,31 @@ static void render_saved_view(struct sway_view *view, | |||
301 | }; | 316 | }; |
302 | 317 | ||
303 | struct wlr_box intersection; | 318 | struct wlr_box intersection; |
304 | bool intersects = wlr_box_intersection(&intersection, &output_box, &box); | 319 | bool intersects = wlr_box_intersection(&intersection, &output_box, &proj_box); |
305 | if (!intersects) { | 320 | if (!intersects) { |
306 | continue; | 321 | continue; |
307 | } | 322 | } |
308 | 323 | ||
309 | scale_box(&box, wlr_output->scale); | 324 | struct wlr_box dst_box = proj_box; |
325 | scale_box(&proj_box, wlr_output->scale); | ||
310 | 326 | ||
311 | float matrix[9]; | 327 | float matrix[9]; |
312 | enum wl_output_transform transform = wlr_output_transform_invert(saved_buf->transform); | 328 | enum wl_output_transform transform = wlr_output_transform_invert(saved_buf->transform); |
313 | wlr_matrix_project_box(matrix, &box, transform, 0, | 329 | wlr_matrix_project_box(matrix, &proj_box, transform, 0, |
314 | wlr_output->transform_matrix); | 330 | wlr_output->transform_matrix); |
315 | 331 | ||
332 | if (!floating) { | ||
333 | dst_box.width = fmin(dst_box.width, | ||
334 | view->container->current.content_width - | ||
335 | (saved_buf->x - view->container->current.content_x)); | ||
336 | dst_box.height = fmin(dst_box.height, | ||
337 | view->container->current.content_height - | ||
338 | (saved_buf->y - view->container->current.content_y)); | ||
339 | } | ||
340 | scale_box(&dst_box, wlr_output->scale); | ||
341 | |||
316 | render_texture(wlr_output, damage, saved_buf->buffer->texture, | 342 | render_texture(wlr_output, damage, saved_buf->buffer->texture, |
317 | &saved_buf->source_box, &box, matrix, alpha); | 343 | &saved_buf->source_box, &dst_box, matrix, alpha); |
318 | } | 344 | } |
319 | 345 | ||
320 | // FIXME: we should set the surface that this saved buffer originates from | 346 | // FIXME: we should set the surface that this saved buffer originates from |