diff options
Diffstat (limited to 'sway/desktop/transaction.c')
-rw-r--r-- | sway/desktop/transaction.c | 51 |
1 files changed, 12 insertions, 39 deletions
diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c index 7975366e..94070363 100644 --- a/sway/desktop/transaction.c +++ b/sway/desktop/transaction.c | |||
@@ -41,8 +41,6 @@ struct sway_transaction_instruction { | |||
41 | struct sway_transaction *transaction; | 41 | struct sway_transaction *transaction; |
42 | struct sway_container *container; | 42 | struct sway_container *container; |
43 | struct sway_container_state state; | 43 | struct sway_container_state state; |
44 | struct wlr_buffer *saved_buffer; | ||
45 | int saved_buffer_width, saved_buffer_height; | ||
46 | uint32_t serial; | 44 | uint32_t serial; |
47 | bool ready; | 45 | bool ready; |
48 | }; | 46 | }; |
@@ -57,27 +55,6 @@ static struct sway_transaction *transaction_create() { | |||
57 | return transaction; | 55 | return transaction; |
58 | } | 56 | } |
59 | 57 | ||
60 | static void remove_saved_view_buffer( | ||
61 | struct sway_transaction_instruction *instruction) { | ||
62 | if (instruction->saved_buffer) { | ||
63 | wlr_buffer_unref(instruction->saved_buffer); | ||
64 | instruction->saved_buffer = NULL; | ||
65 | } | ||
66 | } | ||
67 | |||
68 | static void save_view_buffer(struct sway_view *view, | ||
69 | struct sway_transaction_instruction *instruction) { | ||
70 | if (!sway_assert(instruction->saved_buffer == NULL, | ||
71 | "Didn't expect instruction to have a saved buffer already")) { | ||
72 | remove_saved_view_buffer(instruction); | ||
73 | } | ||
74 | if (view->surface && wlr_surface_has_buffer(view->surface)) { | ||
75 | instruction->saved_buffer = wlr_buffer_ref(view->surface->buffer); | ||
76 | instruction->saved_buffer_width = view->surface->current.width; | ||
77 | instruction->saved_buffer_height = view->surface->current.height; | ||
78 | } | ||
79 | } | ||
80 | |||
81 | static void transaction_destroy(struct sway_transaction *transaction) { | 58 | static void transaction_destroy(struct sway_transaction *transaction) { |
82 | // Free instructions | 59 | // Free instructions |
83 | for (int i = 0; i < transaction->instructions->length; ++i) { | 60 | for (int i = 0; i < transaction->instructions->length; ++i) { |
@@ -93,7 +70,6 @@ static void transaction_destroy(struct sway_transaction *transaction) { | |||
93 | if (con->destroying && !con->instructions->length) { | 70 | if (con->destroying && !con->instructions->length) { |
94 | container_free(con); | 71 | container_free(con); |
95 | } | 72 | } |
96 | remove_saved_view_buffer(instruction); | ||
97 | free(instruction); | 73 | free(instruction); |
98 | } | 74 | } |
99 | list_free(transaction->instructions); | 75 | list_free(transaction->instructions); |
@@ -158,9 +134,6 @@ static void transaction_add_container(struct sway_transaction *transaction, | |||
158 | 134 | ||
159 | copy_pending_state(container, &instruction->state); | 135 | copy_pending_state(container, &instruction->state); |
160 | 136 | ||
161 | if (container->type == C_VIEW) { | ||
162 | save_view_buffer(container->sway_view, instruction); | ||
163 | } | ||
164 | list_add(transaction->instructions, instruction); | 137 | list_add(transaction->instructions, instruction); |
165 | } | 138 | } |
166 | 139 | ||
@@ -220,6 +193,15 @@ static void transaction_apply(struct sway_transaction *transaction) { | |||
220 | 193 | ||
221 | memcpy(&container->current, &instruction->state, | 194 | memcpy(&container->current, &instruction->state, |
222 | sizeof(struct sway_container_state)); | 195 | sizeof(struct sway_container_state)); |
196 | |||
197 | if (container->type == C_VIEW) { | ||
198 | if (container->sway_view->saved_buffer) { | ||
199 | view_remove_saved_buffer(container->sway_view); | ||
200 | } | ||
201 | if (container->instructions->length > 1) { | ||
202 | view_save_buffer(container->sway_view); | ||
203 | } | ||
204 | } | ||
223 | } | 205 | } |
224 | } | 206 | } |
225 | 207 | ||
@@ -294,6 +276,9 @@ static void transaction_commit(struct sway_transaction *transaction) { | |||
294 | // mapping and its default geometry doesn't intersect an output. | 276 | // mapping and its default geometry doesn't intersect an output. |
295 | struct timespec when; | 277 | struct timespec when; |
296 | wlr_surface_send_frame_done(con->sway_view->surface, &when); | 278 | wlr_surface_send_frame_done(con->sway_view->surface, &when); |
279 | if (!con->sway_view->saved_buffer) { | ||
280 | view_save_buffer(con->sway_view); | ||
281 | } | ||
297 | } | 282 | } |
298 | list_add(con->instructions, instruction); | 283 | list_add(con->instructions, instruction); |
299 | } | 284 | } |
@@ -400,18 +385,6 @@ void transaction_notify_view_ready_by_size(struct sway_view *view, | |||
400 | } | 385 | } |
401 | } | 386 | } |
402 | 387 | ||
403 | struct wlr_texture *transaction_get_saved_texture(struct sway_view *view, | ||
404 | int *width, int *height) { | ||
405 | struct sway_transaction_instruction *instruction = | ||
406 | view->swayc->instructions->items[0]; | ||
407 | if (!instruction->saved_buffer) { | ||
408 | return NULL; | ||
409 | } | ||
410 | *width = instruction->saved_buffer_width; | ||
411 | *height = instruction->saved_buffer_height; | ||
412 | return instruction->saved_buffer->texture; | ||
413 | } | ||
414 | |||
415 | void transaction_commit_dirty(void) { | 388 | void transaction_commit_dirty(void) { |
416 | if (!server.dirty_containers->length) { | 389 | if (!server.dirty_containers->length) { |
417 | return; | 390 | return; |