mirror of
https://github.com/swaywm/sway.git
synced 2024-11-26 09:51:29 +00:00
Fix crash when moving last child of a container to workspace or output
We were arranging a parent which may have been deleted by the reaper, which meant the `current` children list of the surviving parent had a dangling pointer. Instead, we now reap the workspace.
This commit is contained in:
parent
9652529cc1
commit
e8fb6b3325
|
@ -90,6 +90,7 @@ static struct cmd_results *cmd_move_container(struct sway_container *current,
|
||||||
}
|
}
|
||||||
free(ws_name);
|
free(ws_name);
|
||||||
struct sway_container *old_parent = current->parent;
|
struct sway_container *old_parent = current->parent;
|
||||||
|
struct sway_container *old_ws = container_parent(current, C_WORKSPACE);
|
||||||
struct sway_container *destination = seat_get_focus_inactive(
|
struct sway_container *destination = seat_get_focus_inactive(
|
||||||
config->handler_context.seat, ws);
|
config->handler_context.seat, ws);
|
||||||
container_move_to(current, destination);
|
container_move_to(current, destination);
|
||||||
|
@ -99,8 +100,11 @@ static struct cmd_results *cmd_move_container(struct sway_container *current,
|
||||||
container_reap_empty(old_parent);
|
container_reap_empty(old_parent);
|
||||||
container_reap_empty(destination->parent);
|
container_reap_empty(destination->parent);
|
||||||
|
|
||||||
|
// TODO: Ideally we would arrange the surviving parent after reaping,
|
||||||
|
// but container_reap_empty does not return it, so we arrange the
|
||||||
|
// workspace instead.
|
||||||
struct sway_transaction *txn = transaction_create();
|
struct sway_transaction *txn = transaction_create();
|
||||||
arrange_windows(old_parent, txn);
|
arrange_windows(old_ws, txn);
|
||||||
arrange_windows(destination->parent, txn);
|
arrange_windows(destination->parent, txn);
|
||||||
transaction_commit(txn);
|
transaction_commit(txn);
|
||||||
|
|
||||||
|
@ -129,13 +133,17 @@ static struct cmd_results *cmd_move_container(struct sway_container *current,
|
||||||
focus = destination->children->items[0];
|
focus = destination->children->items[0];
|
||||||
}
|
}
|
||||||
struct sway_container *old_parent = current->parent;
|
struct sway_container *old_parent = current->parent;
|
||||||
|
struct sway_container *old_ws = container_parent(current, C_WORKSPACE);
|
||||||
container_move_to(current, focus);
|
container_move_to(current, focus);
|
||||||
seat_set_focus(config->handler_context.seat, old_parent);
|
seat_set_focus(config->handler_context.seat, old_parent);
|
||||||
container_reap_empty(old_parent);
|
container_reap_empty(old_parent);
|
||||||
container_reap_empty(focus->parent);
|
container_reap_empty(focus->parent);
|
||||||
|
|
||||||
|
// TODO: Ideally we would arrange the surviving parent after reaping,
|
||||||
|
// but container_reap_empty does not return it, so we arrange the
|
||||||
|
// workspace instead.
|
||||||
struct sway_transaction *txn = transaction_create();
|
struct sway_transaction *txn = transaction_create();
|
||||||
arrange_windows(old_parent, txn);
|
arrange_windows(old_ws, txn);
|
||||||
arrange_windows(focus->parent, txn);
|
arrange_windows(focus->parent, txn);
|
||||||
transaction_commit(txn);
|
transaction_commit(txn);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue