diff options
author | wil <william.barsse@gmail.com> | 2017-01-07 18:09:42 +0100 |
---|---|---|
committer | wil <william.barsse@gmail.com> | 2017-01-07 18:09:42 +0100 |
commit | d99efb5f6f37d9ffbb6794df8964d2537f75eeda (patch) | |
tree | 29a799136dcf7e270250f1bcfd45676f1a4e76db | |
parent | Moved auto_* layout functions from resize.c to layout.c (diff) | |
download | sway-d99efb5f6f37d9ffbb6794df8964d2537f75eeda.tar.gz sway-d99efb5f6f37d9ffbb6794df8964d2537f75eeda.tar.zst sway-d99efb5f6f37d9ffbb6794df8964d2537f75eeda.zip |
[fix] corner cases win nb_children < nb_master|nb_col
-rw-r--r-- | sway/layout.c | 61 |
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 | */ | ||
1510 | static 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 | */ |
1511 | static inline size_t auto_slave_count(swayc_t *container) { | 1518 | static 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 | */ | ||
1525 | size_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 | */ | ||
1532 | size_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 | */ | ||
1566 | size_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 | } |