git: 9front

Download patch

ref: b8e7ffe8e8383985ba7e35db7333ec0d91af3aa5
parent: c3bb4951998c5a4e52ca8c190e999e04b61ad0c7
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Thu Sep 13 05:37:28 EDT 2012

mothra: fix wrong ascent calculation if text element is too large, fix image border layout

--- a/sys/src/cmd/mothra/libpanel/rtext.c
+++ b/sys/src/cmd/mothra/libpanel/rtext.c
@@ -9,7 +9,10 @@
 #include <panel.h>
 #include "pldefs.h"
 #include "rtext.h"
-#define	LEAD	4		/* extra space between lines */
+
+#define LEAD	4	/* extra space between lines */
+#define BORD	2	/* extra border for images */
+
 Rtext *pl_rtnew(Rtext **t, int space, int indent, Image *b, Panel *p, Font *f, char *s, int hot, void *user){
 	Rtext *new;
 	new=pl_emalloc(sizeof(Rtext));
@@ -80,9 +83,9 @@
 		tp=t;
 		for(;;){
 			if(tp->b){
-				a=tp->b->r.max.y-tp->b->r.min.y+2;
-				d=0;
-				w=tp->b->r.max.x-tp->b->r.min.x+4;
+				a=tp->b->r.max.y-tp->b->r.min.y+BORD;
+				d=BORD;
+				w=tp->b->r.max.x-tp->b->r.min.x+BORD*2;
 			}
 			else if(tp->p){
 				/* what if plpack fails? */
@@ -110,11 +113,11 @@
 			if(space) eline=tp;
 		}
 		if(eline==t){	/* No progress!  Force fit the first block! */
-			if(a>ascent) ascent=a;
-			if(d>descent) descent=d;
-			if(tp==t)
+			if(tp==t){
+				if(a>ascent) ascent=a;
+				if(d>descent) descent=d;
 				eline=tp->next;
-			else
+			}else
 				eline=tp;
 		}
 		topy=p.y;
@@ -124,10 +127,9 @@
 			t->topy=topy;
 			t->r.min.x=p.x;
 			if(t->b){
-				t->r.max.y=p.y;
-				t->r.min.y=p.y-(t->b->r.max.y-t->b->r.min.y);
-				p.x+=t->b->r.max.x-t->b->r.min.x+2;
-				t->r=rectaddpt(t->r, Pt(2, 2));
+				t->r.max.y=p.y+BORD;
+				t->r.min.y=p.y-(t->b->r.max.y-t->b->r.min.y)-BORD;
+				p.x+=(t->b->r.max.x-t->b->r.min.x)+BORD*2;
 			}
 			else if(t->p){
 				t->r.max.y=p.y;
@@ -168,8 +170,8 @@
 		if(dr.max.y>r.min.y
 		&& dr.min.y<r.max.y){
 			if(t->b){
-				draw(b, dr, t->b, 0, t->b->r.min);
-				if(t->hot) border(b, insetrect(dr, -2), 1, display->black, ZP);
+				draw(b, insetrect(dr, BORD), t->b, 0, t->b->r.min);
+				if(t->hot) border(b, dr, 1, display->black, ZP);
 			}
 			else if(t->p){
 				plmove(t->p, subpt(dr.min, t->p->r.min));
--