shithub: patches

ref: 4ac3a0224ed9d54818f858fba69c8e94f38f2c12
dir: /9front/e51d4aa069548de51d0e88a6d621d278e9138cd0.patch/

View raw version
From: Romano <[email protected]>
Date: Thu, 09 May 2024 21:04:32 +0000
Subject: [PATCH] rio: resize border and scrollbar based on font


when using large fonts the scroll bar is aberrantly small, as is
the border size. initialize the border widths and scroll widths
based on the font size. set a minimum value based on existing
hard-coded values.
---
diff 025a2d172ebfe36bc0da32f5712dd250916c73f1 e51d4aa069548de51d0e88a6d621d278e9138cd0
--- a/sys/src/cmd/rio/dat.h
+++ b/sys/src/cmd/rio/dat.h
@@ -46,11 +46,11 @@
 
 enum
 {
-	Selborder		= 4,		/* border of selected window */
-	Unselborder	= 1,		/* border of unselected window */
-	Scrollwid 		= 12,		/* width of scroll bar */
-	Scrollgap 		= 4,		/* gap right of scroll bar */
-	BIG			= 3,		/* factor by which window dimension can exceed screen */
+	Minselborder	= 4,		/* minimum border of selected window */
+	Minunselborder	= 1,		/* minimum border of unselected window */
+	Minscrollwid 	= 12,		/* minimum width of scroll bar */
+	Minscrollgap 	= 4,		/* minimum gap right of scroll bar */
+	BIG		= 3,		/* factor by which window dimension can exceed screen */
 	TRUE		= 1,
 	FALSE		= 0,
 };
@@ -341,3 +341,8 @@
 int		messagesize;		/* negotiated in 9P version setup */
 int		shiftdown;
 int		debug;
+int 		Borderwid;		/* border width of window */
+int 		Selborder;		/* border of selected window */
+int 		Unselborder;		/* border of unselected window */
+int 		Scrollwid;		/* width of scroll bar */
+int 		Scrollgap;		/* gap right of scroll bar */
--- a/sys/src/cmd/rio/data.c
+++ b/sys/src/cmd/rio/data.c
@@ -185,6 +185,16 @@
 };
 
 void
+fontinit(void)
+{
+	Borderwid = ceil(stringwidth(font, "0") / 4) > Borderwidth ? ceil(stringwidth(font, "0") / 4) : Borderwidth;
+	Selborder = ceil(stringwidth(font, "0") / 2) > Minselborder ? ceil(stringwidth(font, "0") / 2) : Minselborder;
+	Unselborder = ceil(stringwidth(font, "0") / 8) > Minunselborder ? ceil(stringwidth(font, "0") / 8) : Minunselborder;
+	Scrollwid = ceil(stringwidth(font, "0") * 1.5) > Minscrollwid ? ceil(stringwidth(font, "0") * 1.5) : Minscrollwid;
+	Scrollgap = ceil(stringwidth(font, "0") / 2) > Minscrollgap ? ceil(stringwidth(font, "0") / 2) : Minscrollgap;
+}
+
+void
 iconinit(void)
 {
 	background = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x777777FF);
--- a/sys/src/cmd/rio/fns.h
+++ b/sys/src/cmd/rio/fns.h
@@ -16,6 +16,7 @@
 void	error(char*);
 void	killprocs(void);
 int	shutdown(void*, char*);
+void	fontinit(void);
 void	iconinit(void);
 void	*erealloc(void*, uint);
 void *emalloc(uint);
--- a/sys/src/cmd/rio/rio.c
+++ b/sys/src/cmd/rio/rio.c
@@ -182,6 +182,7 @@
 		fprint(2, "rio: can't open display: %r\n");
 		exits("display open");
 	}
+	fontinit();
 	iconinit();
 
 	exitchan = chancreate(sizeof(int), 0);
@@ -951,10 +952,10 @@
 	}
 	if(col != nil){
 		r = canonrect(r);
-		drawedge(&b[0], col, Rect(r.min.x, r.min.y, r.min.x+Borderwidth, r.max.y));
-		drawedge(&b[1], col, Rect(r.min.x+Borderwidth, r.min.y, r.max.x-Borderwidth, r.min.y+Borderwidth));
-		drawedge(&b[2], col, Rect(r.max.x-Borderwidth, r.min.y, r.max.x, r.max.y));
-		drawedge(&b[3], col, Rect(r.min.x+Borderwidth, r.max.y-Borderwidth, r.max.x-Borderwidth, r.max.y));
+		drawedge(&b[0], col, Rect(r.min.x, r.min.y, r.min.x+Borderwid, r.max.y));
+		drawedge(&b[1], col, Rect(r.min.x+Borderwid, r.min.y, r.max.x-Borderwid, r.min.y+Borderwid));
+		drawedge(&b[2], col, Rect(r.max.x-Borderwid, r.min.y, r.max.x, r.max.y));
+		drawedge(&b[3], col, Rect(r.min.x+Borderwid, r.max.y-Borderwid, r.max.x-Borderwid, r.max.y));
 	}
 	lastcol = col;
 }
--- a/sys/src/cmd/rio/wctl.c
+++ b/sys/src/cmd/rio/wctl.c
@@ -100,13 +100,13 @@
 	 * that includes the border on each side with an extra pixel
 	 * so that the text is still drawn
 	 */
-	if(Dx(r) < 100 || Dy(r) < 2*(Borderwidth+1)+font->height)
+	if(Dx(r) < 100 || Dy(r) < 2*(Borderwid+Unselborder)+font->height)
 		return 0;
 	/* window must be on screen */
 	if(!rectXrect(screen->r, r))
 		return 0;
 	/* must have some screen and border visible so we can move it out of the way */
-	if(rectinrect(screen->r, insetrect(r, Borderwidth)))
+	if(rectinrect(screen->r, insetrect(r, Borderwid)))
 		return 0;
 	return 1;
 }
@@ -148,8 +148,8 @@
 	static int i = 0;
 	int minx, miny, dx, dy;
 
-	dx = min(600, Dx(screen->r) - 2*Borderwidth);
-	dy = min(400, Dy(screen->r) - 2*Borderwidth);
+	dx = min(600, Dx(screen->r) - 2*Borderwid);
+	dy = min(400, Dy(screen->r) - 2*Borderwid);
 	minx = 32 + 16*i;
 	miny = 32 + 16*i;
 	i++;
--- a/sys/src/cmd/rio/wind.c
+++ b/sys/src/cmd/rio/wind.c
@@ -353,7 +353,7 @@
 
 	w->i = i;
 	w->mc.image = i;
-	r = insetrect(i->r, Selborder+1);
+	r = insetrect(i->r, Selborder+Unselborder);
 	w->scrollr = r;
 	w->scrollr.max.x = r.min.x+Scrollwid;
 	w->lastsr = ZR;
@@ -1249,7 +1249,7 @@
 
 	w = emalloc(sizeof(Window));
 	w->screenr = i->r;
-	r = insetrect(i->r, Selborder+1);
+	r = insetrect(i->r,Selborder+Unselborder);
 	w->i = i;
 	w->mc = *mc;
 	w->ck = ck;