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];