container: Move pending state to state struct

Pending state is currently inlined directly in the container struct,
while the current state is in a state struct. A side-effect of this is
that it is not immediately obvious that pending double-buffered state is
accessed, nor is it obvious what state is double-buffered.

Instead, use the state struct for both current and pending.
This commit is contained in:
Kenny Levinsen 2021-02-12 23:22:51 +01:00 committed by Tudor Brindus
parent 28cadf5580
commit a047b5ee4a
33 changed files with 723 additions and 757 deletions

View file

@ -57,7 +57,7 @@ struct sway_container *container_find_resize_parent(struct sway_container *con,
(allow_last || index < siblings->length - 1)) {
return con;
}
con = con->parent;
con = con->pending.parent;
}
return NULL;
@ -115,13 +115,13 @@ void container_resize_tiled(struct sway_container *con,
int sibling_amount = prev ? ceil((double)amount / 2.0) : amount;
if (is_horizontal(axis)) {
if (con->width + amount < MIN_SANE_W) {
if (con->pending.width + amount < MIN_SANE_W) {
return;
}
if (next->width - sibling_amount < MIN_SANE_W) {
if (next->pending.width - sibling_amount < MIN_SANE_W) {
return;
}
if (prev && prev->width - sibling_amount < MIN_SANE_W) {
if (prev && prev->pending.width - sibling_amount < MIN_SANE_W) {
return;
}
if (con->child_total_width <= 0) {
@ -133,7 +133,7 @@ void container_resize_tiled(struct sway_container *con,
list_t *siblings = container_get_siblings(con);
for (int i = 0; i < siblings->length; ++i) {
struct sway_container *con = siblings->items[i];
con->width_fraction = con->width / con->child_total_width;
con->width_fraction = con->pending.width / con->child_total_width;
}
double amount_fraction = (double)amount / con->child_total_width;
@ -146,13 +146,13 @@ void container_resize_tiled(struct sway_container *con,
prev->width_fraction -= sibling_amount_fraction;
}
} else {
if (con->height + amount < MIN_SANE_H) {
if (con->pending.height + amount < MIN_SANE_H) {
return;
}
if (next->height - sibling_amount < MIN_SANE_H) {
if (next->pending.height - sibling_amount < MIN_SANE_H) {
return;
}
if (prev && prev->height - sibling_amount < MIN_SANE_H) {
if (prev && prev->pending.height - sibling_amount < MIN_SANE_H) {
return;
}
if (con->child_total_height <= 0) {
@ -164,7 +164,7 @@ void container_resize_tiled(struct sway_container *con,
list_t *siblings = container_get_siblings(con);
for (int i = 0; i < siblings->length; ++i) {
struct sway_container *con = siblings->items[i];
con->height_fraction = con->height / con->child_total_height;
con->height_fraction = con->pending.height / con->child_total_height;
}
double amount_fraction = (double)amount / con->child_total_height;
@ -178,10 +178,10 @@ void container_resize_tiled(struct sway_container *con,
}
}
if (con->parent) {
arrange_container(con->parent);
if (con->pending.parent) {
arrange_container(con->pending.parent);
} else {
arrange_workspace(con->workspace);
arrange_workspace(con->pending.workspace);
}
}
@ -203,15 +203,15 @@ static struct cmd_results *resize_adjust_floating(uint32_t axis,
int min_width, max_width, min_height, max_height;
floating_calculate_constraints(&min_width, &max_width,
&min_height, &max_height);
if (con->width + grow_width < min_width) {
grow_width = min_width - con->width;
} else if (con->width + grow_width > max_width) {
grow_width = max_width - con->width;
if (con->pending.width + grow_width < min_width) {
grow_width = min_width - con->pending.width;
} else if (con->pending.width + grow_width > max_width) {
grow_width = max_width - con->pending.width;
}
if (con->height + grow_height < min_height) {
grow_height = min_height - con->height;
} else if (con->height + grow_height > max_height) {
grow_height = max_height - con->height;
if (con->pending.height + grow_height < min_height) {
grow_height = min_height - con->pending.height;
} else if (con->pending.height + grow_height > max_height) {
grow_height = max_height - con->pending.height;
}
int grow_x = 0, grow_y = 0;
@ -227,15 +227,15 @@ static struct cmd_results *resize_adjust_floating(uint32_t axis,
if (grow_width == 0 && grow_height == 0) {
return cmd_results_new(CMD_INVALID, "Cannot resize any further");
}
con->x += grow_x;
con->y += grow_y;
con->width += grow_width;
con->height += grow_height;
con->pending.x += grow_x;
con->pending.y += grow_y;
con->pending.width += grow_width;
con->pending.height += grow_height;
con->content_x += grow_x;
con->content_y += grow_y;
con->content_width += grow_width;
con->content_height += grow_height;
con->pending.content_x += grow_x;
con->pending.content_y += grow_y;
con->pending.content_width += grow_width;
con->pending.content_height += grow_height;
arrange_container(con);
@ -256,9 +256,9 @@ static struct cmd_results *resize_adjust_tiled(uint32_t axis,
float pct = amount->amount / 100.0f;
if (is_horizontal(axis)) {
amount->amount = (float)current->width * pct;
amount->amount = (float)current->pending.width * pct;
} else {
amount->amount = (float)current->height * pct;
amount->amount = (float)current->pending.height * pct;
}
}
@ -281,20 +281,20 @@ static struct cmd_results *resize_set_tiled(struct sway_container *con,
if (width->unit == MOVEMENT_UNIT_PPT ||
width->unit == MOVEMENT_UNIT_DEFAULT) {
// Convert to px
struct sway_container *parent = con->parent;
while (parent && parent->layout != L_HORIZ) {
parent = parent->parent;
struct sway_container *parent = con->pending.parent;
while (parent && parent->pending.layout != L_HORIZ) {
parent = parent->pending.parent;
}
if (parent) {
width->amount = parent->width * width->amount / 100;
width->amount = parent->pending.width * width->amount / 100;
} else {
width->amount = con->workspace->width * width->amount / 100;
width->amount = con->pending.workspace->width * width->amount / 100;
}
width->unit = MOVEMENT_UNIT_PX;
}
if (width->unit == MOVEMENT_UNIT_PX) {
container_resize_tiled(con, AXIS_HORIZONTAL,
width->amount - con->width);
width->amount - con->pending.width);
}
}
@ -302,20 +302,20 @@ static struct cmd_results *resize_set_tiled(struct sway_container *con,
if (height->unit == MOVEMENT_UNIT_PPT ||
height->unit == MOVEMENT_UNIT_DEFAULT) {
// Convert to px
struct sway_container *parent = con->parent;
while (parent && parent->layout != L_VERT) {
parent = parent->parent;
struct sway_container *parent = con->pending.parent;
while (parent && parent->pending.layout != L_VERT) {
parent = parent->pending.parent;
}
if (parent) {
height->amount = parent->height * height->amount / 100;
height->amount = parent->pending.height * height->amount / 100;
} else {
height->amount = con->workspace->height * height->amount / 100;
height->amount = con->pending.workspace->height * height->amount / 100;
}
height->unit = MOVEMENT_UNIT_PX;
}
if (height->unit == MOVEMENT_UNIT_PX) {
container_resize_tiled(con, AXIS_VERTICAL,
height->amount - con->height);
height->amount - con->pending.height);
}
}
@ -339,15 +339,15 @@ static struct cmd_results *resize_set_floating(struct sway_container *con,
"Cannot resize a hidden scratchpad container by ppt");
}
// Convert to px
width->amount = con->workspace->width * width->amount / 100;
width->amount = con->pending.workspace->width * width->amount / 100;
width->unit = MOVEMENT_UNIT_PX;
// Falls through
case MOVEMENT_UNIT_PX:
case MOVEMENT_UNIT_DEFAULT:
width->amount = fmax(min_width, fmin(width->amount, max_width));
grow_width = width->amount - con->width;
con->x -= grow_width / 2;
con->width = width->amount;
grow_width = width->amount - con->pending.width;
con->pending.x -= grow_width / 2;
con->pending.width = width->amount;
break;
case MOVEMENT_UNIT_INVALID:
sway_assert(false, "invalid width unit");
@ -363,15 +363,15 @@ static struct cmd_results *resize_set_floating(struct sway_container *con,
"Cannot resize a hidden scratchpad container by ppt");
}
// Convert to px
height->amount = con->workspace->height * height->amount / 100;
height->amount = con->pending.workspace->height * height->amount / 100;
height->unit = MOVEMENT_UNIT_PX;
// Falls through
case MOVEMENT_UNIT_PX:
case MOVEMENT_UNIT_DEFAULT:
height->amount = fmax(min_height, fmin(height->amount, max_height));
grow_height = height->amount - con->height;
con->y -= grow_height / 2;
con->height = height->amount;
grow_height = height->amount - con->pending.height;
con->pending.y -= grow_height / 2;
con->pending.height = height->amount;
break;
case MOVEMENT_UNIT_INVALID:
sway_assert(false, "invalid height unit");
@ -379,10 +379,10 @@ static struct cmd_results *resize_set_floating(struct sway_container *con,
}
}
con->content_x -= grow_width / 2;
con->content_y -= grow_height / 2;
con->content_width += grow_width;
con->content_height += grow_height;
con->pending.content_x -= grow_width / 2;
con->pending.content_y -= grow_height / 2;
con->pending.content_width += grow_width;
con->pending.content_height += grow_height;
arrange_container(con);
@ -437,10 +437,10 @@ static struct cmd_results *cmd_resize_set(int argc, char **argv) {
// If 0, don't resize that dimension
struct sway_container *con = config->handler_context.container;
if (width.amount <= 0) {
width.amount = con->width;
width.amount = con->pending.width;
}
if (height.amount <= 0) {
height.amount = con->height;
height.amount = con->pending.height;
}
if (container_is_floating(con)) {