ref: a578dcbab74f736509dbe3e8fc1cefaa9919132c
parent: aab184987c79fc7a8e5467200f9ac448700b797f
author: sirjofri <sirjofri@sirjofri.de>
date: Sat Apr 12 10:26:10 EDT 2025
fixes box size calculation
--- a/n_box.c
+++ b/n_box.c
@@ -13,22 +13,21 @@
box_calcrect(Nelem* nelem, Image* screen, Rectangle r)
{
Rectangle cr;
+ Point childsize;
NBox* b = (NBox*)nelem;
GUARD(b);
Nelem *child = lgetfirst(&b->children);
cr.min = r.min;
- if (b->size.x >= 0 && b->size.y >= 0) {
- cr.max = addpt(cr.min, Pt(b->size.x, b->size.y));
- } else
- if (child) {
- cr.max = addpt(cr.min, ncalldesiredsize(child, screen));
- cr.max.x += 2*b->borderwidth;
- cr.max.y += 2*b->borderwidth;
- } else {
- cr.max = addpt(r.min, Pt(2*b->borderwidth, 2*b->borderwidth));
+
+ if (b->slot.fill&FILLX && b->slot.fill&FILLY) {
+ b->slot.r = cr = r;
+ if (child) {
+ cr = insetmargin(insetrect(cr, b->borderwidth), b->padding);
+ ncallcalcrect(child, screen, cr);
+ }
+ return b->slot.r;
}
- cr = extendmargin(cr, b->padding);
if (b->slot.fill&FILLX)
cr.max.x = r.max.x;
@@ -35,6 +34,31 @@
if (b->slot.fill&FILLY)
cr.max.y = r.max.y;
+ if (child)
+ childsize = ncalldesiredsize(child, screen);
+
+ if (!(b->slot.fill&FILLX)) {
+ if (b->size.x >= 0) {
+ cr.max.x = cr.min.x + b->size.x;
+ } else if (child) {
+ cr.max.x = cr.min.x + childsize.x;
+ } else {
+ cr.max.x = cr.min.x;
+ }
+ cr.max.x += 2*b->borderwidth + b->padding.left + b->padding.right;
+ }
+
+ if (!(b->slot.fill&FILLY)) {
+ if (b->size.y >= 0) {
+ cr.max.y = cr.min.y + b->size.y;
+ } else if (child) {
+ cr.max.y = cr.min.y + childsize.y;
+ } else {
+ cr.max.y = cr.min.y;
+ }
+ cr.max.y += 2*b->borderwidth + b->padding.top + b->padding.bottom;
+ }
+
b->slot.r = cr;
/* tell child its size (important!) */
@@ -53,8 +77,12 @@
NBox *b = (NBox*)nelem;
GUARD(b);
- if (b->size.x >= 0 && b->size.y >= 0)
- return b->size;
+ if (b->size.x >= 0 && b->size.y >= 0) {
+ pt = b->size;
+ pt.x += 2*b->borderwidth + b->padding.left + b->padding.right;
+ pt.y += 2*b->borderwidth + b->padding.top + b->padding.bottom;
+ return pt;
+ }
child = lgetfirst(&b->children);
if (child)
--
⑨