aboutsummaryrefslogtreecommitdiffstats
path: root/sway/desktop/transaction.c
diff options
context:
space:
mode:
authorLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2018-08-20 08:54:58 +1000
committerLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2018-08-20 09:04:04 +1000
commitb3e2c497742197bbeb7270fcc882f641cf84a612 (patch)
treeeef53d774ae0970c1912fe3420dbae8d751c91a6 /sway/desktop/transaction.c
parentMerge pull request #2493 from RyanDwyer/fix-popup-position (diff)
downloadsway-b3e2c497742197bbeb7270fcc882f641cf84a612.tar.gz
sway-b3e2c497742197bbeb7270fcc882f641cf84a612.tar.zst
sway-b3e2c497742197bbeb7270fcc882f641cf84a612.zip
Fix crash when a view destroys with pending transactions
We were removing the saved buffer when one transaction applies, then didn't have a new buffer to save when the next transaction ran. This made the rendering code crash as it had no surface to use. This commit makes it continue to hold the buffer if the view is destroying and has more transactions. Additionally, a check is added when saving the buffer to make sure there's no one already there.
Diffstat (limited to 'sway/desktop/transaction.c')
-rw-r--r--sway/desktop/transaction.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c
index d77a2afd..3b626cb7 100644
--- a/sway/desktop/transaction.c
+++ b/sway/desktop/transaction.c
@@ -175,7 +175,9 @@ static void transaction_apply(struct sway_transaction *transaction) {
175 sizeof(struct sway_container_state)); 175 sizeof(struct sway_container_state));
176 176
177 if (container->type == C_VIEW && container->sway_view->saved_buffer) { 177 if (container->type == C_VIEW && container->sway_view->saved_buffer) {
178 view_remove_saved_buffer(container->sway_view); 178 if (!container->destroying || container->ntxnrefs == 1) {
179 view_remove_saved_buffer(container->sway_view);
180 }
179 } 181 }
180 182
181 // Damage the new location 183 // Damage the new location
@@ -283,7 +285,7 @@ static void transaction_commit(struct sway_transaction *transaction) {
283 struct timespec when; 285 struct timespec when;
284 wlr_surface_send_frame_done(con->sway_view->surface, &when); 286 wlr_surface_send_frame_done(con->sway_view->surface, &when);
285 } 287 }
286 if (con->type == C_VIEW) { 288 if (con->type == C_VIEW && !con->sway_view->saved_buffer) {
287 view_save_buffer(con->sway_view); 289 view_save_buffer(con->sway_view);
288 memcpy(&con->sway_view->saved_geometry, &con->sway_view->geometry, 290 memcpy(&con->sway_view->saved_geometry, &con->sway_view->geometry,
289 sizeof(struct wlr_box)); 291 sizeof(struct wlr_box));