diff options
author | Kenny Levinsen <kl@kl.wtf> | 2020-05-31 01:37:43 +0200 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2020-06-03 16:41:17 +0200 |
commit | fcd0ab8f331a6e74fde113d665d4aed21bccdfc5 (patch) | |
tree | c2f53f827372904f8d7b1356231350652bed8a8d /sway/tree | |
parent | 613abdda6fa978480067a35c3adc46fb414b0b5c (diff) | |
download | sway-fcd0ab8f331a6e74fde113d665d4aed21bccdfc5.tar.xz |
view: Save all buffers associated with view
During the execution of a resize transaction, the buffer associated
with a view's surface is saved and reused until the client acknowledges
the resulting configure event.
However, only one the main buffer of the main surface was stored and
rendered, meaning that subsurfaces disappear during resize.
Iterate over all, store and render buffers from all surfaces in the view
to ensure that correct rendering is preserved.
Diffstat (limited to 'sway/tree')
-rw-r--r-- | sway/tree/view.c | 39 |
1 files changed, 29 insertions, 10 deletions
diff --git a/sway/tree/view.c b/sway/tree/view.c index 8e12a229..25951deb 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -36,6 +36,7 @@ void view_init(struct sway_view *view, enum sway_view_type type, view->type = type; view->impl = impl; view->executed_criteria = create_list(); + wl_list_init(&view->saved_buffers); view->allow_request_urgent = true; view->shortcuts_inhibit = SHORTCUTS_INHIBIT_DEFAULT; wl_signal_init(&view->events.unmap); @@ -54,6 +55,9 @@ void view_destroy(struct sway_view *view) { "(might have a pending transaction?)")) { return; } + if (!wl_list_empty(&view->saved_buffers)) { + view_remove_saved_buffer(view); + } list_free(view->executed_criteria); free(view->title_format); @@ -1176,23 +1180,38 @@ bool view_is_urgent(struct sway_view *view) { } void view_remove_saved_buffer(struct sway_view *view) { - if (!sway_assert(view->saved_buffer, "Expected a saved buffer")) { + if (!sway_assert(!wl_list_empty(&view->saved_buffers), "Expected a saved buffer")) { return; } - wlr_buffer_unlock(&view->saved_buffer->base); - view->saved_buffer = NULL; + struct sway_saved_buffer *saved_buf, *tmp; + wl_list_for_each_safe(saved_buf, tmp, &view->saved_buffers, link) { + wlr_buffer_unlock(&saved_buf->buffer->base); + wl_list_remove(&saved_buf->link); + free(saved_buf); + } +} + +static void view_save_buffer_iterator(struct wlr_surface *surface, + int sx, int sy, void *data) { + struct sway_view *view = data; + + if (surface && wlr_surface_has_buffer(surface)) { + wlr_buffer_lock(&surface->buffer->base); + struct sway_saved_buffer *saved_buffer = calloc(1, sizeof(struct sway_saved_buffer)); + saved_buffer->buffer = surface->buffer; + saved_buffer->width = surface->current.width; + saved_buffer->height = surface->current.height; + saved_buffer->x = sx; + saved_buffer->y = sy; + wl_list_insert(&view->saved_buffers, &saved_buffer->link); + } } void view_save_buffer(struct sway_view *view) { - if (!sway_assert(!view->saved_buffer, "Didn't expect saved buffer")) { + if (!sway_assert(wl_list_empty(&view->saved_buffers), "Didn't expect saved buffer")) { view_remove_saved_buffer(view); } - if (view->surface && wlr_surface_has_buffer(view->surface)) { - wlr_buffer_lock(&view->surface->buffer->base); - view->saved_buffer = view->surface->buffer; - view->saved_buffer_width = view->surface->current.width; - view->saved_buffer_height = view->surface->current.height; - } + view_for_each_surface(view, view_save_buffer_iterator, view); } bool view_is_transient_for(struct sway_view *child, |