shithub: libnate

Download patch

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)
--