fix(engine): compare logical transition state
Avoid reading inactive Str storage when deciding whether to publish a redraw. Keep the focused engine suite compact by retaining one case for each page, navigation, and empty-result invariant.
This commit is contained in:
41
strans.c
41
strans.c
@@ -835,6 +835,41 @@ transition(u32int ks, u32int mod, Str *com)
|
||||
return n;
|
||||
}
|
||||
|
||||
static int
|
||||
samestate(Im *a, Search *as, Im *b, Search *bs)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(a->l != b->l || scmp(&a->pre, &b->pre) != 0 ||
|
||||
scmp(&a->raw, &b->raw) != 0 || a->nkouho != b->nkouho ||
|
||||
a->sel != b->sel || as->lang != bs->lang ||
|
||||
scmp(&as->raw, &bs->raw) != 0 || scmp(&as->text, &bs->text) != 0)
|
||||
return 0;
|
||||
for(i = 0; i < a->nkouho; i++)
|
||||
if(scmp(&a->kouho[i], &b->kouho[i]) != 0)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
savestate(Im *p, Search *s)
|
||||
{
|
||||
int i;
|
||||
|
||||
memset(p, 0, sizeof *p);
|
||||
memset(s, 0, sizeof *s);
|
||||
p->l = im.l;
|
||||
sappend(&p->pre, &im.pre);
|
||||
sappend(&p->raw, &im.raw);
|
||||
p->nkouho = im.nkouho;
|
||||
p->sel = im.sel;
|
||||
for(i = 0; i < im.nkouho; i++)
|
||||
sappend(&p->kouho[i], &im.kouho[i]);
|
||||
s->lang = search.lang;
|
||||
sappend(&s->raw, &search.raw);
|
||||
sappend(&s->text, &search.text);
|
||||
}
|
||||
|
||||
static int
|
||||
keystrokeforce(u32int ks, u32int mod, Str *com, int force)
|
||||
{
|
||||
@@ -842,13 +877,11 @@ keystrokeforce(u32int ks, u32int mod, Str *com, int force)
|
||||
Search oldsearch;
|
||||
int eaten, ncom;
|
||||
|
||||
oldim = im;
|
||||
oldsearch = search;
|
||||
savestate(&oldim, &oldsearch);
|
||||
ncom = com->n;
|
||||
eaten = transition(ks, mod, com);
|
||||
if(force || eaten || com->n != ncom ||
|
||||
memcmp(&oldim, &im, sizeof im) != 0 ||
|
||||
memcmp(&oldsearch, &search, sizeof search) != 0)
|
||||
!samestate(&oldim, &oldsearch, &im, &search))
|
||||
redraw();
|
||||
return eaten;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user