aboutsummaryrefslogtreecommitdiffstats
path: root/sway/desktop/transaction.c
diff options
context:
space:
mode:
authorLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2018-07-14 23:14:55 +1000
committerLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2018-07-14 23:14:55 +1000
commit2032f85d94f2f222282b242116b3e827dd458f6c (patch)
treed6ad82f79521cdd948985be22630b803af58afea /sway/desktop/transaction.c
parentMerge pull request #2244 from RyanDwyer/floating-resize (diff)
downloadsway-2032f85d94f2f222282b242116b3e827dd458f6c.tar.gz
sway-2032f85d94f2f222282b242116b3e827dd458f6c.tar.zst
sway-2032f85d94f2f222282b242116b3e827dd458f6c.zip
Simplify transactions by utilising a dirty flag on containers
This PR changes the way we handle transactions to a more simple method. The new method is to mark containers as dirty from low level code (eg. arranging, or container_destroy, and eventually seat_set_focus), then call transaction_commit_dirty which picks up those containers and runs them through a transaction. The old methods of using transactions (arrange_and_commit, or creating one manually) are now no longer possible. The highest-level code (execute_command and view implementation handlers) will call transaction_commit_dirty, so most other code just needs to set containers as dirty. This is done by arranging, but can also be done by calling container_set_dirty.
Diffstat (limited to 'sway/desktop/transaction.c')
-rw-r--r--sway/desktop/transaction.c35
1 files changed, 17 insertions, 18 deletions
diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c
index 2b3f87c3..d7ef7130 100644
--- a/sway/desktop/transaction.c
+++ b/sway/desktop/transaction.c
@@ -47,7 +47,7 @@ struct sway_transaction_instruction {
47 bool ready; 47 bool ready;
48}; 48};
49 49
50struct sway_transaction *transaction_create() { 50static struct sway_transaction *transaction_create() {
51 struct sway_transaction *transaction = 51 struct sway_transaction *transaction =
52 calloc(1, sizeof(struct sway_transaction)); 52 calloc(1, sizeof(struct sway_transaction));
53 transaction->instructions = create_list(); 53 transaction->instructions = create_list();
@@ -141,23 +141,8 @@ static void copy_pending_state(struct sway_container *container,
141 } 141 }
142} 142}
143 143
144static bool transaction_has_container(struct sway_transaction *transaction, 144static void transaction_add_container(struct sway_transaction *transaction,
145 struct sway_container *container) { 145 struct sway_container *container) {
146 for (int i = 0; i < transaction->instructions->length; ++i) {
147 struct sway_transaction_instruction *instruction =
148 transaction->instructions->items[i];
149 if (instruction->container == container) {
150 return true;
151 }
152 }
153 return false;
154}
155
156void transaction_add_container(struct sway_transaction *transaction,
157 struct sway_container *container) {
158 if (transaction_has_container(transaction, container)) {
159 return;
160 }
161 struct sway_transaction_instruction *instruction = 146 struct sway_transaction_instruction *instruction =
162 calloc(1, sizeof(struct sway_transaction_instruction)); 147 calloc(1, sizeof(struct sway_transaction_instruction));
163 instruction->transaction = transaction; 148 instruction->transaction = transaction;
@@ -285,7 +270,7 @@ static bool should_configure(struct sway_container *con,
285 return true; 270 return true;
286} 271}
287 272
288void transaction_commit(struct sway_transaction *transaction) { 273static void transaction_commit(struct sway_transaction *transaction) {
289 wlr_log(WLR_DEBUG, "Transaction %p committing with %i instructions", 274 wlr_log(WLR_DEBUG, "Transaction %p committing with %i instructions",
290 transaction, transaction->instructions->length); 275 transaction, transaction->instructions->length);
291 transaction->num_waiting = 0; 276 transaction->num_waiting = 0;
@@ -418,3 +403,17 @@ struct wlr_texture *transaction_get_saved_texture(struct sway_view *view,
418 *height = instruction->saved_buffer_height; 403 *height = instruction->saved_buffer_height;
419 return instruction->saved_buffer->texture; 404 return instruction->saved_buffer->texture;
420} 405}
406
407void transaction_commit_dirty() {
408 if (!server.dirty_containers->length) {
409 return;
410 }
411 struct sway_transaction *transaction = transaction_create();
412 for (int i = 0; i < server.dirty_containers->length; ++i) {
413 struct sway_container *container = server.dirty_containers->items[i];
414 transaction_add_container(transaction, container);
415 container->dirty = false;
416 }
417 server.dirty_containers->length = 0;
418 transaction_commit(transaction);
419}