shithub: riscv

Download patch

ref: 4a7d29dd5fcd022e6ef482ed5f2ba399f7555ce1
parent: e4436ec0bbb6e525addbe2f4a250c1de69247828
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Thu Jul 17 19:29:55 EDT 2014

libframe: use correct text color on frinsert depending on selection (thanks sl)

frinsert() used cols[TEXT] for drawing selected text instead of the
HTEXT color. this was discovered with rio -b.

--- a/sys/src/libframe/frinsert.c
+++ b/sys/src/libframe/frinsert.c
@@ -101,7 +101,7 @@
 	Frbox *b;
 	int n, n0, nn0, y;
 	ulong cn0;
-	Image *col;
+	Image *back, *text;
 	Rectangle r;
 	static struct{
 		Point pt0, pt1;
@@ -219,10 +219,10 @@
 				r.max.x = f->r.max.x;
 				r.max.y += f->font->height;
 				if(f->p0<=cn0 && cn0<f->p1)	/* b+1 is inside selection */
-					col = f->cols[HIGH];
+					back = f->cols[HIGH];
 				else
-					col = f->cols[BACK];
-				draw(f->b, r, col, nil, r.min);
+					back = f->cols[BACK];
+				draw(f->b, r, back, nil, r.min);
 			}else if(pt.y < y){
 				r.min = pt;
 				r.max = pt;
@@ -230,10 +230,10 @@
 				r.max.x = f->r.max.x;
 				r.max.y += f->font->height;
 				if(f->p0<=cn0 && cn0<f->p1)	/* b+1 is inside selection */
-					col = f->cols[HIGH];
+					back = f->cols[HIGH];
 				else
-					col = f->cols[BACK];
-				draw(f->b, r, col, nil, r.min);
+					back = f->cols[BACK];
+				draw(f->b, r, back, nil, r.min);
 			}
 			y = pt.y;
 			cn0 -= b->nrune;
@@ -246,10 +246,10 @@
 				r.max.x = f->r.max.x;
 			cn0--;
 			if(f->p0<=cn0 && cn0<f->p1)	/* b is inside selection */
-				col = f->cols[HIGH];
+				back = f->cols[HIGH];
 			else
-				col = f->cols[BACK];
-			draw(f->b, r, col, nil, r.min);
+				back = f->cols[BACK];
+			draw(f->b, r, back, nil, r.min);
 			y = 0;
 			if(pt.x == f->r.min.x)
 				y = pt.y;
@@ -256,12 +256,16 @@
 		}
 	}
 	/* insertion can extend the selection, so the condition here is different */
-	if(f->p0<p0 && p0<=f->p1)
-		col = f->cols[HIGH];
-	else
-		col = f->cols[BACK];
-	frselectpaint(f, ppt0, ppt1, col);
-	_frdrawtext(&frame, ppt0, f->cols[TEXT], col);
+	if(f->p0<p0 && p0<=f->p1){
+		text = f->cols[HTEXT];
+		back = f->cols[HIGH];
+	}
+	else {
+		text = f->cols[TEXT];
+		back = f->cols[BACK];
+	}
+	frselectpaint(f, ppt0, ppt1, back);
+	_frdrawtext(&frame, ppt0, text, back);
 	_fraddbox(f, nn0, frame.nbox);
 	for(n=0; n<frame.nbox; n++)
 		f->box[nn0+n] = frame.box[n];