From 67ed2ef4783427db5ed312c4ba0d8a5dd30d22fe Mon Sep 17 00:00:00 2001 From: Hojun-Cho Date: Sat, 15 Aug 2026 15:07:13 +0900 Subject: [PATCH] fix(engine): redraw only for visible caret changes --- strans.c | 15 ++++++++++++--- tests/engine_test.c | 32 ++++++++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/strans.c b/strans.c index 222f8cd..872c3e9 100644 --- a/strans.c +++ b/strans.c @@ -925,6 +925,13 @@ setactivecap(int cap) return old != (activecap & Cclientpreedit); } +static int +careteq(Caret *a, Caret *b) +{ + return a->valid == b->valid && a->x == b->x && a->y == b->y && + a->h == b->h; +} + static void imhandlekey(Keyreq *kr) { @@ -952,9 +959,10 @@ imhandlekey(Keyreq *kr) } break; case Keycaret: - if(kr->owner == activeowner){ + if(kr->owner == activeowner && !careteq(&caret, &kr->caret)){ caret = kr->caret; - redraw(); + if(visible) + redraw(); } break; case Keycap: @@ -978,7 +986,8 @@ imhandlekey(Keyreq *kr) activecap = kr->cap & Cclientpreedit; caret = kr->caret; changed = 1; - }else if(kr->caret.valid){ + }else if(kr->caret.valid && + !careteq(&caret, &kr->caret)){ caret = kr->caret; changed = 1; } diff --git a/tests/engine_test.c b/tests/engine_test.c index aacc0d9..25f878e 100644 --- a/tests/engine_test.c +++ b/tests/engine_test.c @@ -370,6 +370,7 @@ void engine_active_owner_caret(struct ct *t) { Caret a, moved; + Drawcmd dc; char one, two; memset(&a, 0, sizeof a); @@ -380,14 +381,37 @@ engine_active_owner_caret(struct ct *t) moved = a; moved.x = 80; init(); - im.l = getlang(LangJP); - ownerrequestat(&one, Keypress, 'k', 0, &a); + draindraw(nil); + im.l = getlang(LangEN); + ownerrequestat(&one, Keypress, 'x', 0, &a); CT_CHECK(t, caret.valid); CT_EQ_INT(t, 10, caret.x); - ownerrequestat(&two, Keycaret, 0, 0, &moved); - CT_EQ_INT(t, 10, caret.x); ownerrequestat(&one, Keycaret, 0, 0, &moved); CT_EQ_INT(t, 80, caret.x); + CT_EQ_INT(t, 0, draindraw(nil)); + im.kouho[0] = mkstr("candidate"); + im.nkouho = 1; + im.sel = 0; + redraw(); + if(CT_CHECK(t, draindraw(&dc) > 0)) + CT_EQ_INT(t, 80, dc.caret.x); + moved.x = 90; + ownerrequestat(&two, Keycaret, 0, 0, &moved); + CT_EQ_INT(t, 80, caret.x); + CT_EQ_INT(t, 0, draindraw(nil)); + ownerrequestat(&one, Keycaret, 0, 0, &moved); + CT_EQ_INT(t, 90, caret.x); + if(CT_CHECK(t, draindraw(&dc) > 0)) + CT_EQ_INT(t, 90, dc.caret.x); + ownerrequestat(&one, Keycaret, 0, 0, &moved); + CT_EQ_INT(t, 0, draindraw(nil)); + ownerrequestat(&one, Keypress, 'x', 0, &moved); + CT_EQ_INT(t, 0, draindraw(nil)); + moved.x = 100; + ownerrequestat(&one, Keypress, 'x', 0, &moved); + CT_EQ_INT(t, 100, caret.x); + if(CT_CHECK(t, draindraw(&dc) > 0)) + CT_EQ_INT(t, 100, dc.caret.x); ownerrequest(&two, Keypress, 'n', 0); CT_EQ_PTR(t, &two, activeowner); CT_CHECK(t, !caret.valid);