diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c index 4e6af86ae..edbe34e53 100644 --- a/sway/desktop/transaction.c +++ b/sway/desktop/transaction.c @@ -213,6 +213,18 @@ static void transaction_apply(struct sway_transaction *transaction) { } static void transaction_progress_queue() { + // Check if any transactions in the queue are in a partially ready state. + // If so, we shouldn't progress any transactions, even ones which are fully + // ready at the front of the queue, because the views in the ready + // transactions might have committed past it to a transaction which isn't + // yet ready. + for (int i = 0; i < server.transactions->length; ++i) { + struct sway_transaction *transaction = server.transactions->items[i]; + if (transaction->num_waiting != 0 && + transaction->num_waiting != transaction->num_configures) { + return; + } + } while (server.transactions->length) { struct sway_transaction *transaction = server.transactions->items[0]; if (transaction->num_waiting) {