Make destroy_workspace behave as expected

master
Kevin Hamacher 9 years ago
parent 6596582bc3
commit d77d03ce84

@ -323,9 +323,6 @@ swayc_t *destroy_workspace(swayc_t *workspace) {
if (!ASSERT_NONNULL(workspace)) { if (!ASSERT_NONNULL(workspace)) {
return NULL; return NULL;
} }
// NOTE: This is called from elsewhere without checking children length
// TODO move containers to other workspaces?
// for now just dont delete
// Do not destroy this if it's the last workspace on this output // Do not destroy this if it's the last workspace on this output
swayc_t *output = swayc_parent_by_type(workspace, C_OUTPUT); swayc_t *output = swayc_parent_by_type(workspace, C_OUTPUT);
@ -333,14 +330,35 @@ swayc_t *destroy_workspace(swayc_t *workspace) {
return NULL; return NULL;
} }
// Do not destroy if there are children swayc_t *parent = workspace->parent;
// destroy the WS if there are no children
if (workspace->children->length == 0 && workspace->floating->length == 0) { if (workspace->children->length == 0 && workspace->floating->length == 0) {
sway_log(L_DEBUG, "destroying workspace '%s'", workspace->name); sway_log(L_DEBUG, "destroying workspace '%s'", workspace->name);
swayc_t *parent = workspace->parent; } else {
// Move children to a different workspace on this output
swayc_t *new_workspace = NULL;
int i;
for(i = 0; i < output->children->length; i++) {
if(output->children->items[i] != workspace) {
break;
}
}
new_workspace = output->children->items[i];
sway_log(L_DEBUG, "moving children to different workspace '%s' -> '%s'",
workspace->name, new_workspace->name);
for(i = 0; i < workspace->children->length; i++) {
move_container_to(workspace->children->items[i], new_workspace);
}
for(i = 0; i < workspace->floating->length; i++) {
move_container_to(workspace->floating->items[i], new_workspace);
}
}
free_swayc(workspace); free_swayc(workspace);
return parent; return parent;
}
return NULL;
} }
swayc_t *destroy_container(swayc_t *container) { swayc_t *destroy_container(swayc_t *container) {

@ -37,8 +37,12 @@ static void update_focus(swayc_t *c) {
ipc_event_workspace(prev, c); ipc_event_workspace(prev, c);
// update visibility of old workspace // update visibility of old workspace
update_visibility(prev); update_visibility(prev);
// if the old workspace has no children, destroy it
if(prev->children->length == 0 && prev->floating->length == 0){
destroy_workspace(prev); destroy_workspace(prev);
} }
}
// Update visibility of newly focused workspace // Update visibility of newly focused workspace
update_visibility(c); update_visibility(c);
break; break;

Loading…
Cancel
Save