diff options
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, |