aboutsummaryrefslogtreecommitdiff
path: root/sway/tree
diff options
context:
space:
mode:
Diffstat (limited to 'sway/tree')
-rw-r--r--sway/tree/view.c39
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,