fix: assign one active engine owner

This commit is contained in:
2026-08-12 15:41:46 +09:00
parent 9c244d1dd1
commit 5ba5cf209c
14 changed files with 212 additions and 13 deletions

View File

@@ -4,6 +4,9 @@
static Im im;
static int popup = 0;
static int visible = 0;
static Lock ownerlock;
static uvlong ownerctr;
static uvlong activeowner;
static void dictqmap(Im*);
static void dictqjp(Im*);
static void backjp(Im*);
@@ -18,6 +21,19 @@ struct Search
};
static Search search;
uvlong
ownernew(void)
{
uvlong n;
lock(&ownerlock);
n = ++ownerctr;
if(n == 0)
n = ++ownerctr;
unlock(&ownerlock);
return n;
}
Lang langs[] = {
{LangEN, nil, nil, nil, nil, nil, nil, nil},
{LangJP, "hira", "kanji", transmap, backjp, dictqjp, nil, nil},
@@ -128,6 +144,9 @@ reset(void)
{
sclear(&im.pre);
sclear(&im.raw);
search.on = 0;
sclear(&search.raw);
sclear(&search.text);
clearkouho();
show();
}
@@ -715,9 +734,16 @@ init(void)
memset(&im, 0, sizeof(im));
im.l = getlang(LangEN);
memset(&search, 0, sizeof search);
activeowner = 0;
visible = 0;
}
static int
meaningful(Keyreq *kr)
{
return kr->ks != 0 && !ismodkey(kr->ks);
}
static void
imhandlekey(Keyreq *kr)
{
@@ -725,8 +751,30 @@ imhandlekey(Keyreq *kr)
sclear(&res.commit);
sclear(&res.preedit);
res.eaten = keystroke(kr->ks, kr->mod, &res.commit);
if(kr->want){
res.eaten = 1;
switch(kr->op){
case Keyrelease:
if(kr->owner == activeowner){
reset();
activeowner = 0;
}
break;
case Keyreset:
if(kr->owner == activeowner)
reset();
break;
default:
res.eaten = 0;
if(meaningful(kr)){
if(kr->owner != activeowner){
reset();
activeowner = kr->owner;
}
res.eaten = keystroke(kr->ks, kr->mod, &res.commit);
}
break;
}
if(kr->want && kr->owner == activeowner){
if(search.on)
res.preedit = search.text;
else