fix: assign one active engine owner
This commit is contained in:
52
strans.c
52
strans.c
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user