aboutsummaryrefslogtreecommitdiffstats
path: root/sway/desktop
diff options
context:
space:
mode:
authorLibravatar Tudor Brindus <me@tbrindus.ca>2020-10-18 17:29:59 -0400
committerLibravatar Simon Ser <contact@emersion.fr>2020-10-19 01:40:10 +0200
commitcc8d318aa1ab380166aa8183dba84a8d2a9ab2aa (patch)
tree26be07c551d9a648167caa383bc96f4b76657ebf /sway/desktop
parenttransaction: validate X transaction completions by geometry, not size (diff)
downloadsway-cc8d318aa1ab380166aa8183dba84a8d2a9ab2aa.tar.gz
sway-cc8d318aa1ab380166aa8183dba84a8d2a9ab2aa.tar.zst
sway-cc8d318aa1ab380166aa8183dba84a8d2a9ab2aa.zip
transaction: make transaction collapsing smarter with > 2 views
Sway maintains a list of pending transactions, and tries to merge consecutive transactions applying to the same views into one. Given a pending transactions list on views {A, B, C} of: A -> A' -> A'' -> B -> B' -> B'' Sway will collapse the transactions into just A'' -> B''. This works fine when doing things like resizing views by their border. However, when interactively resizing layouts like H[V[A B] C], we end up with pending transaction lists like: A -> B -> C -> A' -> B' -> C' -> A'' -> B'' -> C'' Previously, Sway would not be able to simplify this transaction list, and execute many more transactions than would be necessary (the final state is determined by {A'', B'', C''}). After this commit, the transaction list gets simplified to A'' -> B'' -> C'', resolving performance problems (that were particularly noticeable with high-refresh-rate mice). Fixes #5736.
Diffstat (limited to 'sway/desktop')
-rw-r--r--sway/desktop/transaction.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c
index e186bf89..eac38991 100644
--- a/sway/desktop/transaction.c
+++ b/sway/desktop/transaction.c
@@ -358,11 +358,20 @@ static void transaction_progress_queue(void) {
358 // If there's a bunch of consecutive transactions which all apply to the 358 // If there's a bunch of consecutive transactions which all apply to the
359 // same views, skip all except the last one. 359 // same views, skip all except the last one.
360 while (server.transactions->length >= 2) { 360 while (server.transactions->length >= 2) {
361 struct sway_transaction *a = server.transactions->items[0]; 361 struct sway_transaction *txn = server.transactions->items[0];
362 struct sway_transaction *b = server.transactions->items[1]; 362 struct sway_transaction *dup = NULL;
363 if (transaction_same_nodes(a, b)) { 363
364 for (int i = 1; i < server.transactions->length; i++) {
365 struct sway_transaction *maybe_dup = server.transactions->items[i];
366 if (transaction_same_nodes(txn, maybe_dup)) {
367 dup = maybe_dup;
368 break;
369 }
370 }
371
372 if (dup) {
364 list_del(server.transactions, 0); 373 list_del(server.transactions, 0);
365 transaction_destroy(a); 374 transaction_destroy(txn);
366 } else { 375 } else {
367 break; 376 break;
368 } 377 }