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:
2026-08-14 22:46:42 +09:00
parent 8df43cecd8
commit 59482d00f3
2 changed files with 77 additions and 98 deletions

View File

@@ -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;
}