|
|
|
@ -66,10 +66,9 @@ static int index_child(const struct sway_container *child) {
|
|
|
|
|
|
|
|
|
|
static void container_handle_fullscreen_reparent(struct sway_container *con,
|
|
|
|
|
struct sway_container *old_parent) {
|
|
|
|
|
if (con->type != C_VIEW || !con->sway_view->is_fullscreen) {
|
|
|
|
|
if (!con->is_fullscreen) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
struct sway_view *view = con->sway_view;
|
|
|
|
|
struct sway_container *old_workspace = old_parent;
|
|
|
|
|
if (old_workspace && old_workspace->type != C_WORKSPACE) {
|
|
|
|
|
old_workspace = container_parent(old_workspace, C_WORKSPACE);
|
|
|
|
@ -85,19 +84,27 @@ static void container_handle_fullscreen_reparent(struct sway_container *con,
|
|
|
|
|
|
|
|
|
|
// Mark the new workspace as fullscreen
|
|
|
|
|
if (new_workspace->sway_workspace->fullscreen) {
|
|
|
|
|
view_set_fullscreen(new_workspace->sway_workspace->fullscreen, false);
|
|
|
|
|
container_set_fullscreen(
|
|
|
|
|
new_workspace->sway_workspace->fullscreen, false);
|
|
|
|
|
}
|
|
|
|
|
new_workspace->sway_workspace->fullscreen = view;
|
|
|
|
|
// Resize view to new output dimensions
|
|
|
|
|
new_workspace->sway_workspace->fullscreen = con;
|
|
|
|
|
|
|
|
|
|
// Resize container to new output dimensions
|
|
|
|
|
struct sway_container *output = new_workspace->parent;
|
|
|
|
|
view->x = output->x;
|
|
|
|
|
view->y = output->y;
|
|
|
|
|
view->width = output->width;
|
|
|
|
|
view->height = output->height;
|
|
|
|
|
con->x = output->x;
|
|
|
|
|
con->y = output->y;
|
|
|
|
|
con->width = output->width;
|
|
|
|
|
con->height = output->height;
|
|
|
|
|
|
|
|
|
|
if (con->type == C_VIEW) {
|
|
|
|
|
struct sway_view *view = con->sway_view;
|
|
|
|
|
view->x = output->x;
|
|
|
|
|
view->y = output->y;
|
|
|
|
|
view->width = output->width;
|
|
|
|
|
view->height = output->height;
|
|
|
|
|
} else {
|
|
|
|
|
arrange_windows(new_workspace);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void container_insert_child(struct sway_container *parent,
|
|
|
|
@ -146,7 +153,7 @@ void container_add_child(struct sway_container *parent,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct sway_container *container_remove_child(struct sway_container *child) {
|
|
|
|
|
if (child->type == C_VIEW && child->sway_view->is_fullscreen) {
|
|
|
|
|
if (child->is_fullscreen) {
|
|
|
|
|
struct sway_container *workspace = container_parent(child, C_WORKSPACE);
|
|
|
|
|
workspace->sway_workspace->fullscreen = NULL;
|
|
|
|
|
}
|
|
|
|
@ -229,10 +236,10 @@ void container_move_to(struct sway_container *container,
|
|
|
|
|
if (focus_ws->type != C_WORKSPACE) {
|
|
|
|
|
focus_ws = container_parent(focus_ws, C_WORKSPACE);
|
|
|
|
|
}
|
|
|
|
|
seat_set_focus(seat,
|
|
|
|
|
new_workspace->sway_workspace->fullscreen->swayc);
|
|
|
|
|
if (focus_ws != new_workspace) {
|
|
|
|
|
seat_set_focus(seat, focus);
|
|
|
|
|
if (focus_ws == new_workspace) {
|
|
|
|
|
struct sway_container *new_focus = seat_get_focus_inactive(seat,
|
|
|
|
|
new_workspace->sway_workspace->fullscreen);
|
|
|
|
|
seat_set_focus(seat, new_focus);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -375,10 +382,16 @@ void container_move(struct sway_container *container,
|
|
|
|
|
struct sway_container *sibling = NULL;
|
|
|
|
|
struct sway_container *current = container;
|
|
|
|
|
struct sway_container *parent = current->parent;
|
|
|
|
|
struct sway_container *top = &root_container;
|
|
|
|
|
|
|
|
|
|
// If moving a fullscreen view, only consider outputs
|
|
|
|
|
if (container->type == C_VIEW && container->sway_view->is_fullscreen) {
|
|
|
|
|
if (container->is_fullscreen) {
|
|
|
|
|
current = container_parent(container, C_OUTPUT);
|
|
|
|
|
} else if (container_is_fullscreen_or_child(container)) {
|
|
|
|
|
// If we've fullscreened a split container, only allow the child to move
|
|
|
|
|
// around within the fullscreen parent.
|
|
|
|
|
struct sway_container *ws = container_parent(container, C_WORKSPACE);
|
|
|
|
|
top = ws->sway_workspace->fullscreen;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct sway_container *new_parent = container_flatten(parent);
|
|
|
|
@ -388,7 +401,7 @@ void container_move(struct sway_container *container,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while (!sibling) {
|
|
|
|
|
if (current->type == C_ROOT) {
|
|
|
|
|
if (current == top) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -452,8 +465,9 @@ void container_move(struct sway_container *container,
|
|
|
|
|
if ((index == parent->children->length - 1 && offs > 0)
|
|
|
|
|
|| (index == 0 && offs < 0)) {
|
|
|
|
|
if (current->parent == container->parent) {
|
|
|
|
|
if (parent->layout == L_TABBED
|
|
|
|
|
|| parent->layout == L_STACKED) {
|
|
|
|
|
if (!parent->is_fullscreen &&
|
|
|
|
|
(parent->layout == L_TABBED ||
|
|
|
|
|
parent->layout == L_STACKED)) {
|
|
|
|
|
move_out_of_tabs_stacks(container, current,
|
|
|
|
|
move_dir, offs);
|
|
|
|
|
return;
|
|
|
|
@ -474,8 +488,8 @@ void container_move(struct sway_container *container,
|
|
|
|
|
sibling = parent->children->items[index + offs];
|
|
|
|
|
wlr_log(WLR_DEBUG, "Selecting sibling id:%zd", sibling->id);
|
|
|
|
|
}
|
|
|
|
|
} else if (parent->layout == L_TABBED
|
|
|
|
|
|| parent->layout == L_STACKED) {
|
|
|
|
|
} else if (!parent->is_fullscreen && (parent->layout == L_TABBED ||
|
|
|
|
|
parent->layout == L_STACKED)) {
|
|
|
|
|
move_out_of_tabs_stacks(container, current, move_dir, offs);
|
|
|
|
|
return;
|
|
|
|
|
} else {
|
|
|
|
@ -707,16 +721,16 @@ struct sway_container *container_get_in_direction(
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (container->type == C_VIEW && container->sway_view->is_fullscreen) {
|
|
|
|
|
if (dir == MOVE_PARENT || dir == MOVE_CHILD) {
|
|
|
|
|
if (dir == MOVE_CHILD) {
|
|
|
|
|
return seat_get_focus_inactive(seat, container);
|
|
|
|
|
}
|
|
|
|
|
if (container->is_fullscreen) {
|
|
|
|
|
if (dir == MOVE_PARENT) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
container = container_parent(container, C_OUTPUT);
|
|
|
|
|
parent = container->parent;
|
|
|
|
|
} else {
|
|
|
|
|
if (dir == MOVE_CHILD) {
|
|
|
|
|
return seat_get_focus_inactive(seat, container);
|
|
|
|
|
}
|
|
|
|
|
if (dir == MOVE_PARENT) {
|
|
|
|
|
if (parent->type == C_OUTPUT) {
|
|
|
|
|
return NULL;
|
|
|
|
@ -767,7 +781,8 @@ struct sway_container *container_get_in_direction(
|
|
|
|
|
}
|
|
|
|
|
sway_assert(next_workspace, "Next container has no workspace");
|
|
|
|
|
if (next_workspace->sway_workspace->fullscreen) {
|
|
|
|
|
return next_workspace->sway_workspace->fullscreen->swayc;
|
|
|
|
|
return seat_get_focus_inactive(seat,
|
|
|
|
|
next_workspace->sway_workspace->fullscreen);
|
|
|
|
|
}
|
|
|
|
|
if (next->children && next->children->length) {
|
|
|
|
|
// TODO consider floating children as well
|
|
|
|
@ -1014,13 +1029,13 @@ void container_swap(struct sway_container *con1, struct sway_container *con2) {
|
|
|
|
|
|
|
|
|
|
wlr_log(WLR_DEBUG, "Swapping containers %zu and %zu", con1->id, con2->id);
|
|
|
|
|
|
|
|
|
|
int fs1 = con1->type == C_VIEW && con1->sway_view->is_fullscreen;
|
|
|
|
|
int fs2 = con2->type == C_VIEW && con2->sway_view->is_fullscreen;
|
|
|
|
|
int fs1 = con1->is_fullscreen;
|
|
|
|
|
int fs2 = con2->is_fullscreen;
|
|
|
|
|
if (fs1) {
|
|
|
|
|
view_set_fullscreen(con1->sway_view, false);
|
|
|
|
|
container_set_fullscreen(con1, false);
|
|
|
|
|
}
|
|
|
|
|
if (fs2) {
|
|
|
|
|
view_set_fullscreen(con2->sway_view, false);
|
|
|
|
|
container_set_fullscreen(con2, false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct sway_seat *seat = input_manager_get_default_seat(input_manager);
|
|
|
|
@ -1053,10 +1068,10 @@ void container_swap(struct sway_container *con1, struct sway_container *con2) {
|
|
|
|
|
prev_workspace_name = stored_prev_name;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (fs1 && con2->type == C_VIEW) {
|
|
|
|
|
view_set_fullscreen(con2->sway_view, true);
|
|
|
|
|
if (fs1) {
|
|
|
|
|
container_set_fullscreen(con2, true);
|
|
|
|
|
}
|
|
|
|
|
if (fs2 && con1->type == C_VIEW) {
|
|
|
|
|
view_set_fullscreen(con1->sway_view, true);
|
|
|
|
|
if (fs2) {
|
|
|
|
|
container_set_fullscreen(con1, true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|