container: don't split single children

In i3 splits are ineffective on singleton H/V containers,
and the command is interpreted to affect the parent layout
instead.
This commit is contained in:
Ronan Pigott 2020-10-23 12:00:45 -07:00 committed by Tudor Brindus
parent 33b64667ae
commit 2478f2f010
2 changed files with 22 additions and 4 deletions

View file

@ -23,10 +23,6 @@ static struct cmd_results *do_split(int layout) {
workspace_split(ws, layout); workspace_split(ws, layout);
} }
if (con && con->parent && con->parent->parent) {
container_flatten(con->parent->parent);
}
if (root->fullscreen_global) { if (root->fullscreen_global) {
arrange_root(); arrange_root();
} else { } else {

View file

@ -1410,6 +1410,28 @@ void container_replace(struct sway_container *container,
struct sway_container *container_split(struct sway_container *child, struct sway_container *container_split(struct sway_container *child,
enum sway_container_layout layout) { enum sway_container_layout layout) {
// i3 doesn't split singleton H/V containers
// https://github.com/i3/i3/blob/3cd1c45eba6de073bc4300eebb4e1cc1a0c4479a/src/tree.c#L354
if (child->parent || child->workspace) {
list_t *siblings = container_get_siblings(child);
if (siblings->length == 1) {
enum sway_container_layout current = container_parent_layout(child);
if (container_is_floating(child)) {
current = L_NONE;
}
if (current == L_HORIZ || current == L_VERT) {
if (child->parent) {
child->parent->layout = layout;
container_update_representation(child->parent);
} else {
child->workspace->layout = layout;
workspace_update_representation(child->workspace);
}
return child;
}
}
}
struct sway_seat *seat = input_manager_get_default_seat(); struct sway_seat *seat = input_manager_get_default_seat();
bool set_focus = (seat_get_focus(seat) == &child->node); bool set_focus = (seat_get_focus(seat) == &child->node);