fix: retain the active owner's caret

This commit is contained in:
2026-08-12 15:44:04 +09:00
parent 5ba5cf209c
commit bc5712b6ac
8 changed files with 70 additions and 2 deletions

View File

@@ -7,6 +7,7 @@ static int visible = 0;
static Lock ownerlock;
static uvlong ownerctr;
static uvlong activeowner;
static Caret caret;
static void dictqmap(Im*);
static void dictqjp(Im*);
static void backjp(Im*);
@@ -128,6 +129,7 @@ show(void)
if(n > Maxdisp) n = Maxdisp;
dc.nkouho = n;
dc.sel = im.sel >= 0 ? im.sel - first : -1;
dc.caret = caret;
for(i = 0; i < n; i++)
dc.kouho[i] = im.kouho[first + i];
if(dc.pre.n == 0 && n == 0 && !visible)
@@ -147,6 +149,7 @@ reset(void)
search.on = 0;
sclear(&search.raw);
sclear(&search.text);
memset(&caret, 0, sizeof caret);
clearkouho();
show();
}
@@ -734,6 +737,7 @@ init(void)
memset(&im, 0, sizeof(im));
im.l = getlang(LangEN);
memset(&search, 0, sizeof search);
memset(&caret, 0, sizeof caret);
activeowner = 0;
visible = 0;
}
@@ -763,13 +767,21 @@ imhandlekey(Keyreq *kr)
if(kr->owner == activeowner)
reset();
break;
case Keycaret:
if(kr->owner == activeowner){
caret = kr->caret;
show();
}
break;
default:
res.eaten = 0;
if(meaningful(kr)){
if(kr->owner != activeowner){
reset();
activeowner = kr->owner;
}
caret = kr->caret;
}else if(kr->caret.valid)
caret = kr->caret;
res.eaten = keystroke(kr->ks, kr->mod, &res.commit);
}
break;