diff options
author | Tudor Brindus <me@tbrindus.ca> | 2020-10-18 17:29:59 -0400 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2020-10-19 01:40:10 +0200 |
commit | cc8d318aa1ab380166aa8183dba84a8d2a9ab2aa (patch) | |
tree | 26be07c551d9a648167caa383bc96f4b76657ebf | |
parent | transaction: validate X transaction completions by geometry, not size (diff) | |
download | sway-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.
-rw-r--r-- | sway/desktop/transaction.c | 17 |
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 | } |