mirror of
https://github.com/swaywm/sway.git
synced 2025-11-08 13:29:50 -05:00
Fix crash when unmapping a view with reapable parents
container_destroy was calling container_reap_empty, which calls container_destroy and so on. Eventually the original container_destroy would return a NULL pointer to the caller which caused a crash. This also fixes an arrange on the wrong container when moving views in and out of stacks.
This commit is contained in:
parent
33e03cb277
commit
b864ac0149
2 changed files with 58 additions and 38 deletions
|
|
@ -177,13 +177,19 @@ static struct cmd_results *cmd_move_workspace(struct sway_container *current,
|
|||
|
||||
static void move_in_direction(struct sway_container *container,
|
||||
enum wlr_direction direction, int move_amt) {
|
||||
struct sway_container *old_parent = container->parent;
|
||||
// For simplicity, we'll arrange the entire workspace. The reason for this
|
||||
// is moving the container might reap the old parent, and container_move
|
||||
// does not return a surviving parent.
|
||||
// TODO: Make container_move return the surviving parent so we can arrange
|
||||
// just that.
|
||||
struct sway_container *old_ws = container_parent(container, C_WORKSPACE);
|
||||
container_move(container, direction, move_amt);
|
||||
struct sway_container *new_ws = container_parent(container, C_WORKSPACE);
|
||||
|
||||
struct sway_transaction *txn = transaction_create();
|
||||
arrange_windows(old_parent, txn);
|
||||
if (container->parent != old_parent) {
|
||||
arrange_windows(container->parent, txn);
|
||||
arrange_windows(old_ws, txn);
|
||||
if (new_ws != old_ws) {
|
||||
arrange_windows(new_ws, txn);
|
||||
}
|
||||
transaction_commit(txn);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue