A new logic to calculate the percentages.
It's slower, but this way we make sure that the resulting percentages *ALWAYS* sum up to 1.0 (or as close to that as we get with double math).
This commit is contained in:
parent
a93f4643ec
commit
45227fba54
39
src/con.c
39
src/con.c
|
@ -385,17 +385,38 @@ int con_num_children(Con *con) {
|
||||||
void con_fix_percent(Con *con, int action) {
|
void con_fix_percent(Con *con, int action) {
|
||||||
Con *child;
|
Con *child;
|
||||||
int children = con_num_children(con);
|
int children = con_num_children(con);
|
||||||
/* TODO: better document why this math works */
|
|
||||||
double fix;
|
|
||||||
if (action == WINDOW_ADD)
|
|
||||||
fix = (1.0 - (1.0 / (children+1)));
|
|
||||||
else
|
|
||||||
fix = 1.0 / (1.0 - (1.0 / (children+1)));
|
|
||||||
|
|
||||||
|
// calculate how much we have distributed and how many containers
|
||||||
|
// with a percentage set we have
|
||||||
|
double total = 0.0;
|
||||||
|
int children_with_percent = 0;
|
||||||
TAILQ_FOREACH(child, &(con->nodes_head), nodes) {
|
TAILQ_FOREACH(child, &(con->nodes_head), nodes) {
|
||||||
if (child->percent <= 0.0)
|
if (child->percent > 0.0) {
|
||||||
continue;
|
total += child->percent;
|
||||||
child->percent *= fix;
|
++children_with_percent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if there were children without a percentage set, set to a value that
|
||||||
|
// will make those children proportional to all others
|
||||||
|
if (children_with_percent != children) {
|
||||||
|
TAILQ_FOREACH(child, &(con->nodes_head), nodes) {
|
||||||
|
if (child->percent <= 0.0) {
|
||||||
|
if (children_with_percent == 0)
|
||||||
|
total += (child->percent = 1.0);
|
||||||
|
else total += (child->percent = total / children_with_percent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we got a zero, just distribute the space equally, otherwise
|
||||||
|
// distribute according to the proportions we got
|
||||||
|
if (total == 0.0) {
|
||||||
|
TAILQ_FOREACH(child, &(con->nodes_head), nodes)
|
||||||
|
child->percent = 1.0 / children;
|
||||||
|
} else if (total != 1.0) {
|
||||||
|
TAILQ_FOREACH(child, &(con->nodes_head), nodes)
|
||||||
|
child->percent /= total;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue