aboutsummaryrefslogtreecommitdiffstats
path: root/sway/desktop/transaction.c
diff options
context:
space:
mode:
authorLibravatar Ryan Dwyer <RyanDwyer@users.noreply.github.com>2018-08-02 23:05:49 +1000
committerLibravatar GitHub <noreply@github.com>2018-08-02 23:05:49 +1000
commit706c0fbe2376e15f8140be60f3c8b0713128ebba (patch)
treeffefcdd261970549f8b83adae8d93b6c3b9ebbbb /sway/desktop/transaction.c
parentswaynag: don't drop \n for first line (diff)
parentMerge pull request #2404 from RyanDwyer/move-containers-when-workspace-focused (diff)
downloadsway-706c0fbe2376e15f8140be60f3c8b0713128ebba.tar.gz
sway-706c0fbe2376e15f8140be60f3c8b0713128ebba.tar.zst
sway-706c0fbe2376e15f8140be60f3c8b0713128ebba.zip
Merge branch 'master' into nagbar
Diffstat (limited to 'sway/desktop/transaction.c')
-rw-r--r--sway/desktop/transaction.c58
1 files changed, 19 insertions, 39 deletions
diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c
index 7975366e..4e6af86a 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
60static 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
68static 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
81static void transaction_destroy(struct sway_transaction *transaction) { 58static 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,22 @@ 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->destroying) {
199 if (container->instructions->length == 1 &&
200 container->sway_view->saved_buffer) {
201 view_remove_saved_buffer(container->sway_view);
202 }
203 } else {
204 if (container->sway_view->saved_buffer) {
205 view_remove_saved_buffer(container->sway_view);
206 }
207 if (container->instructions->length > 1) {
208 view_save_buffer(container->sway_view);
209 }
210 }
211 }
223 } 212 }
224} 213}
225 214
@@ -295,6 +284,9 @@ static void transaction_commit(struct sway_transaction *transaction) {
295 struct timespec when; 284 struct timespec when;
296 wlr_surface_send_frame_done(con->sway_view->surface, &when); 285 wlr_surface_send_frame_done(con->sway_view->surface, &when);
297 } 286 }
287 if (con->type == C_VIEW && !con->sway_view->saved_buffer) {
288 view_save_buffer(con->sway_view);
289 }
298 list_add(con->instructions, instruction); 290 list_add(con->instructions, instruction);
299 } 291 }
300 transaction->num_configures = transaction->num_waiting; 292 transaction->num_configures = transaction->num_waiting;
@@ -400,18 +392,6 @@ void transaction_notify_view_ready_by_size(struct sway_view *view,
400 } 392 }
401} 393}
402 394
403struct 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
415void transaction_commit_dirty(void) { 395void transaction_commit_dirty(void) {
416 if (!server.dirty_containers->length) { 396 if (!server.dirty_containers->length) {
417 return; 397 return;