manage off-screen tick better

This commit is contained in:
rsc 2007-05-10 19:08:47 +00:00
parent 813751d754
commit 7a3533513e
2 changed files with 18 additions and 8 deletions

View file

@ -274,6 +274,7 @@ void
flsetselect(Flayer *l, long p0, long p1) flsetselect(Flayer *l, long p0, long p1)
{ {
ulong fp0, fp1; ulong fp0, fp1;
int ticked;
l->click = 0; l->click = 0;
if(l->visible==None || !flprepare(l)){ if(l->visible==None || !flprepare(l)){
@ -281,9 +282,12 @@ flsetselect(Flayer *l, long p0, long p1)
return; return;
} }
l->p0 = p0, l->p1 = p1; l->p0 = p0, l->p1 = p1;
flfp0p1(l, &fp0, &fp1); flfp0p1(l, &fp0, &fp1, &ticked);
if(fp0==l->f.p0 && fp1==l->f.p1) if(fp0==l->f.p0 && fp1==l->f.p1){
if(l->f.ticked != ticked)
frdrawseltick(&l->f, frptofchar(&l->f, fp0), fp0, fp1, 1, ticked);
return; return;
}
if(fp1<=l->f.p0 || fp0>=l->f.p1 || l->f.p0==l->f.p1 || fp0==fp1){ if(fp1<=l->f.p0 || fp0>=l->f.p1 || l->f.p0==l->f.p1 || fp0==fp1){
/* no overlap or trivial repainting */ /* no overlap or trivial repainting */
@ -315,18 +319,23 @@ flsetselect(Flayer *l, long p0, long p1)
} }
void void
flfp0p1(Flayer *l, ulong *pp0, ulong *pp1) flfp0p1(Flayer *l, ulong *pp0, ulong *pp1, int *ticked)
{ {
long p0 = l->p0-l->origin, p1 = l->p1-l->origin; long p0 = l->p0-l->origin, p1 = l->p1-l->origin;
if(p0 < 0) *ticked = 1;
if(p0 < 0){
*ticked = 0;
p0 = 0; p0 = 0;
}
if(p1 < 0) if(p1 < 0)
p1 = 0; p1 = 0;
if(p0 > l->f.nchars) if(p0 > l->f.nchars)
p0 = l->f.nchars; p0 = l->f.nchars;
if(p1 > l->f.nchars) if(p1 > l->f.nchars){
*ticked = 0;
p1 = l->f.nchars; p1 = l->f.nchars;
}
*pp0 = p0; *pp0 = p0;
*pp1 = p1; *pp1 = p1;
} }
@ -401,6 +410,7 @@ flprepare(Flayer *l)
Frame *f; Frame *f;
ulong n; ulong n;
Rune *r; Rune *r;
int ticked;
if(l->visible == None) if(l->visible == None)
return 0; return 0;
@ -418,8 +428,8 @@ flprepare(Flayer *l)
r = (*l->textfn)(l, n, &n); r = (*l->textfn)(l, n, &n);
frinsert(f, r, r+n, (ulong)0); frinsert(f, r, r+n, (ulong)0);
frdrawsel(f, frptofchar(f, f->p0), f->p0, f->p1, 0); frdrawsel(f, frptofchar(f, f->p0), f->p0, f->p1, 0);
flfp0p1(l, &f->p0, &f->p1); flfp0p1(l, &f->p0, &f->p1, &ticked);
frdrawsel(f, frptofchar(f, f->p0), f->p0, f->p1, 1); frdrawseltick(f, frptofchar(f, f->p0), f->p0, f->p1, 1, ticked);
l->lastsr = ZR; l->lastsr = ZR;
scrdraw(l, scrtotal(l)); scrdraw(l, scrtotal(l));
} }

View file

@ -28,7 +28,7 @@ struct Flayer
void flborder(Flayer*, int); void flborder(Flayer*, int);
void flclose(Flayer*); void flclose(Flayer*);
void fldelete(Flayer*, long, long); void fldelete(Flayer*, long, long);
void flfp0p1(Flayer*, ulong*, ulong*); void flfp0p1(Flayer*, ulong*, ulong*, int*);
void flinit(Flayer*, Rectangle, Font*, Image**); void flinit(Flayer*, Rectangle, Font*, Image**);
void flinsert(Flayer*, Rune*, Rune*, long); void flinsert(Flayer*, Rune*, Rune*, long);
void flnew(Flayer*, Rune *(*fn)(Flayer*, long, ulong*), int, void*); void flnew(Flayer*, Rune *(*fn)(Flayer*, long, ulong*), int, void*);