summaryrefslogtreecommitdiffstats
path: root/sway
diff options
context:
space:
mode:
authorLibravatar wil <william.barsse@gmail.com>2017-01-07 18:09:42 +0100
committerLibravatar wil <william.barsse@gmail.com>2017-01-07 18:09:42 +0100
commitd99efb5f6f37d9ffbb6794df8964d2537f75eeda (patch)
tree29a799136dcf7e270250f1bcfd45676f1a4e76db /sway
parentMoved auto_* layout functions from resize.c to layout.c (diff)
downloadsway-d99efb5f6f37d9ffbb6794df8964d2537f75eeda.tar.gz
sway-d99efb5f6f37d9ffbb6794df8964d2537f75eeda.tar.zst
sway-d99efb5f6f37d9ffbb6794df8964d2537f75eeda.zip
[fix] corner cases win nb_children < nb_master|nb_col
Diffstat (limited to 'sway')
-rw-r--r--sway/layout.c61
1 files changed, 40 insertions, 21 deletions
diff --git a/sway/layout.c b/sway/layout.c
index 5f8da9e6..9661f505 100644
--- a/sway/layout.c
+++ b/sway/layout.c
@@ -1505,11 +1505,32 @@ bool is_auto_layout(enum swayc_layouts layout) {
1505} 1505}
1506 1506
1507/** 1507/**
1508 * Return the number of master elements in a container
1509 */
1510static inline size_t auto_master_count(swayc_t *container) {
1511 return MIN(container->nb_master, container->children->length);
1512}
1513
1514/**
1508 * Return the number of children in the slave groups. This corresponds to the children 1515 * Return the number of children in the slave groups. This corresponds to the children
1509 * that are not members of the master group. 1516 * that are not members of the master group.
1510 */ 1517 */
1511static inline size_t auto_slave_count(swayc_t *container) { 1518static inline size_t auto_slave_count(swayc_t *container) {
1512 return container->children->length - container->nb_master; 1519 return container->children->length - auto_master_count(container);
1520}
1521
1522/**
1523 * Return the number of slave groups in the container.
1524 */
1525size_t auto_slave_group_count(swayc_t *container) {
1526 return MIN(container->nb_slave_groups, auto_slave_count(container));
1527}
1528
1529/**
1530 * Return the combined number of master and slave groups in the container.
1531 */
1532size_t auto_group_count(swayc_t *container) {
1533 return auto_slave_group_count(container) + (container->nb_master ? 1 : 0);
1513} 1534}
1514 1535
1515/** 1536/**
@@ -1521,10 +1542,12 @@ int auto_group_start_index(swayc_t *container, int index) {
1521 || (size_t) index < container->nb_master) { 1542 || (size_t) index < container->nb_master) {
1522 return 0; 1543 return 0;
1523 } else { 1544 } else {
1524 size_t grp_sz = auto_slave_count(container) / container->nb_slave_groups; 1545 size_t nb_slaves = auto_slave_count(container);
1525 size_t remainder = auto_slave_count(container) % container->nb_slave_groups; 1546 size_t nb_slave_grp = auto_slave_group_count(container);
1547 size_t grp_sz = nb_slaves / nb_slave_grp;
1548 size_t remainder = nb_slaves % nb_slave_grp;
1549 int idx2 = (nb_slave_grp - remainder) * grp_sz + container->nb_master;
1526 int start_idx; 1550 int start_idx;
1527 int idx2 = (container->nb_slave_groups - remainder) * grp_sz + container->nb_master;
1528 if (index < idx2) { 1551 if (index < idx2) {
1529 start_idx = ((index - container->nb_master) / grp_sz) * grp_sz + container->nb_master; 1552 start_idx = ((index - container->nb_master) / grp_sz) * grp_sz + container->nb_master;
1530 } else { 1553 } else {
@@ -1545,11 +1568,13 @@ int auto_group_end_index(swayc_t *container, int index) {
1545 } else { 1568 } else {
1546 int nxt_idx; 1569 int nxt_idx;
1547 if ((size_t)index < container->nb_master) { 1570 if ((size_t)index < container->nb_master) {
1548 nxt_idx = container->nb_master; 1571 nxt_idx = auto_master_count(container);
1549 } else { 1572 } else {
1550 size_t grp_sz = auto_slave_count(container) / container->nb_slave_groups; 1573 size_t nb_slaves = auto_slave_count(container);
1551 size_t remainder = auto_slave_count(container) % container->nb_slave_groups; 1574 size_t nb_slave_grp = auto_slave_group_count(container);
1552 int idx2 = (container->nb_slave_groups - remainder) * grp_sz + container->nb_master; 1575 size_t grp_sz = nb_slaves / nb_slave_grp;
1576 size_t remainder = nb_slaves % nb_slave_grp;
1577 int idx2 = (nb_slave_grp - remainder) * grp_sz + container->nb_master;
1553 if (index < idx2) { 1578 if (index < idx2) {
1554 nxt_idx = ((index - container->nb_master) / grp_sz + 1) * grp_sz + container->nb_master; 1579 nxt_idx = ((index - container->nb_master) / grp_sz + 1) * grp_sz + container->nb_master;
1555 } else { 1580 } else {
@@ -1561,13 +1586,6 @@ int auto_group_end_index(swayc_t *container, int index) {
1561} 1586}
1562 1587
1563/** 1588/**
1564 * Return the combined number of master and slave groups in the container.
1565 */
1566size_t auto_group_count(swayc_t *container) {
1567 return MIN(container->nb_slave_groups, auto_slave_count(container)) + (container->nb_master ? 1 : 0);
1568}
1569
1570/**
1571 * return the index of the Group containing <index>th child of <container>. 1589 * return the index of the Group containing <index>th child of <container>.
1572 * The index is the order of the group along the container's major axis (starting at 0). 1590 * The index is the order of the group along the container's major axis (starting at 0).
1573 */ 1591 */
@@ -1576,22 +1594,23 @@ size_t auto_group_index(swayc_t *container, int index) {
1576 return 0; 1594 return 0;
1577 } 1595 }
1578 bool master_first = (container->layout == L_AUTO_LEFT || container->layout == L_AUTO_TOP); 1596 bool master_first = (container->layout == L_AUTO_LEFT || container->layout == L_AUTO_TOP);
1579 int nb_slaves = auto_slave_count(container); 1597 size_t nb_slaves = auto_slave_count(container);
1580 if ((size_t) index < container->nb_master) { 1598 if ((size_t) index < container->nb_master) {
1581 if (master_first || nb_slaves <= 0) { 1599 if (master_first || nb_slaves <= 0) {
1582 return 0; 1600 return 0;
1583 } else { 1601 } else {
1584 return MIN(container->nb_slave_groups, nb_slaves); 1602 return auto_slave_group_count(container);
1585 } 1603 }
1586 } else { 1604 } else {
1587 size_t grp_sz = auto_slave_count(container) / container->nb_slave_groups; 1605 size_t nb_slave_grp = auto_slave_group_count(container);
1588 size_t remainder = auto_slave_count(container) % container->nb_slave_groups; 1606 size_t grp_sz = nb_slaves / nb_slave_grp;
1607 size_t remainder = nb_slaves % nb_slave_grp;
1608 int idx2 = (nb_slave_grp - remainder) * grp_sz + container->nb_master;
1589 size_t grp_idx; 1609 size_t grp_idx;
1590 int idx2 = (container->nb_slave_groups - remainder) * grp_sz + container->nb_master;
1591 if (index < idx2) { 1610 if (index < idx2) {
1592 grp_idx = (index - container->nb_master) / grp_sz; 1611 grp_idx = (index - container->nb_master) / grp_sz;
1593 } else { 1612 } else {
1594 grp_idx = (container->nb_slave_groups - remainder) + (index - idx2) / (grp_sz + 1) ; 1613 grp_idx = (nb_slave_grp - remainder) + (index - idx2) / (grp_sz + 1) ;
1595 } 1614 }
1596 return grp_idx + (master_first ? 1 : 0); 1615 return grp_idx + (master_first ? 1 : 0);
1597 } 1616 }