diff --git a/strans.c b/strans.c index 394d7c1..8d15ca0 100644 --- a/strans.c +++ b/strans.c @@ -982,6 +982,7 @@ imhandlekey(Keyreq *kr) break; case Keypress: res.eaten = 0; + takelost(kr->owner, &res.commit); if(kr->owner == activeowner) clientpre = kr->clientpre; if(keymeaningful(kr->ks)){ diff --git a/tests/engine_test.c b/tests/engine_test.c index 0f885b4..cba9afa 100644 --- a/tests/engine_test.c +++ b/tests/engine_test.c @@ -258,6 +258,20 @@ engine_active_owner_lifecycle(struct ct *t) res = ownerrequest(&c, Keypress, 'k', 0); CT_EQ_PTR(t, &c, activeowner); checkstr(t, "next owner first key", "k", &res.preedit); + + /* Typing is being heard from, as much as a reset or a release is. */ + init(); + im.l = getlang(LangJP); + ownerrequest(&a, Keypress, 'k', 0); + ownerrequest(&a, Keypress, 'a', 0); + ownerrequest(&b, Keypress, 'n', 0); + CT_EQ_PTR(t, &b, activeowner); + res = ownerrequest(&a, Keypress, 'k', 0); + checkstr(t, "the taken owner types and gets its reading back", "か", + &res.commit); + CT_EQ_PTR(t, &a, activeowner); + res = ownerrequest(&b, Keyreset, 0, 0); + checkstr(t, "the owner it took from keeps its own", "ん", &res.commit); } void diff --git a/tests/ibus_client_smoke.c b/tests/ibus_client_smoke.c index fd72421..673d013 100644 --- a/tests/ibus_client_smoke.c +++ b/tests/ibus_client_smoke.c @@ -21,6 +21,8 @@ struct Log int transfer; int atext; int aclear; + int retake; + int retook; char revent[16]; int rn; int repeat; @@ -161,6 +163,17 @@ commit(IBusInputContext *ctx, IBusText *text, void *arg) g_main_loop_quit(log->loop); return; } + if(log->retake){ + /* Typing again takes back the reading the other context took. */ + if(strcmp(s, "k") == 0) + log->retook = 1; + else + log->invalid = 1; + log->retake = 0; + if(log->loop != NULL && log->waiting != NULL && *log->waiting) + g_main_loop_quit(log->loop); + return; + } if(strcmp(s, "か") != 0 || attrs == NULL || ibus_attr_list_get(attrs, 0) != NULL) log->invalid = 1; @@ -259,8 +272,9 @@ main(int argc, char **argv) ibus_input_context_focus_out(b); } ibus_input_context_focus_in(a); + log.retake = 1; ok = ok && ibus_input_context_process_key_event(a, 's', 0, - IBUS_CONTROL_MASK); + IBUS_CONTROL_MASK) && waitflag(&log, &log.retook); log.repeat = 1; ok = ok && ibus_input_context_process_key_event(a, 'z', 0, 0) && waitflag(&log, &log.rfirst); @@ -272,9 +286,9 @@ main(int argc, char **argv) log.repeat = 3; ibus_input_context_focus_out(a); ok = ok && waitflag(&log, &log.flushed); - if(log.legacy == 0 || log.modern != 0 || log.commit != 3 || + if(log.legacy == 0 || log.modern != 0 || log.commit != 4 || log.invalid || !log.done || !log.atext || !log.aclear || - log.clearctx != a || !log.rdone) + !log.retook || log.clearctx != a || !log.rdone) ok = 0; if(b != NULL) g_object_unref(b); @@ -282,12 +296,12 @@ main(int argc, char **argv) g_object_unref(bus); if(!ok){ fprintf(stderr, - "ibus_client_smoke: legacy=%d modern=%d commit=%d invalid=%d preedit=%d committed=%d transfer-text=%d a-clear=%d repeat=%s flushed=%d\n", + "ibus_client_smoke: legacy=%d modern=%d commit=%d invalid=%d preedit=%d committed=%d transfer-text=%d a-clear=%d retook=%d repeat=%s flushed=%d\n", log.legacy, log.modern, log.commit, log.invalid, log.sawpreedit, log.sawcommit, log.atext, log.aclear, - log.revent, log.flushed); + log.retook, log.revent, log.flushed); return 1; } - printf("official libibus client preedit, commit, owner clear, and focus-out hand-back: ok\n"); + printf("official libibus client preedit, commit, owner clear, take-back and focus-out hand-back: ok\n"); return 0; }