From daadd320f3a142edfb2ac14074c4be6aab1ef2a9 Mon Sep 17 00:00:00 2001 From: Hojun-Cho Date: Thu, 28 May 2026 17:28:51 +0900 Subject: [PATCH] ibus preedit --- ibus.c | 78 +++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 56 insertions(+), 22 deletions(-) diff --git a/ibus.c b/ibus.c index 51575ea..1469125 100644 --- a/ibus.c +++ b/ibus.c @@ -200,47 +200,54 @@ mget(u32int state) return m; } -static int -sendkey(u32int ks, u32int mod, char *out, int sz, int *eaten) +static void +sendkey(u32int ks, u32int mod, char *com, int csz, char *pre, int psz, + int *eaten) { Keyreq kr; int p[2]; uchar hdr[2]; + uchar pl; int n; *eaten = 0; - out[0] = '\0'; + com[0] = '\0'; + pre[0] = '\0'; if(pipe(p) < 0) - return 0; + return; kr.fd = p[1]; kr.ks = ks; kr.mod = mod; + kr.want = 1; chansend(keyc, &kr); - if(read(p[0], hdr, 2) != 2){ - close(p[0]); - close(p[1]); - return 0; - } + if(read(p[0], hdr, 2) != 2) + goto out; *eaten = hdr[0]; n = hdr[1]; - if(n > 0 && n < sz){ - if(read(p[0], out, n) != n) - n = 0; - }else - n = 0; - out[n] = '\0'; + if(n > 0 && n < csz){ + if(read(p[0], com, n) != n) + goto out; + com[n] = '\0'; + } + if(read(p[0], &pl, 1) != 1) + goto out; + if(pl > 0 && pl < psz){ + if(read(p[0], pre, pl) != pl) + goto out; + pre[pl] = '\0'; + } +out: close(p[0]); close(p[1]); - return n; } static void sendreset(void) { - char buf[64]; + char com[64], pre[256]; int eaten; - sendkey(Kesc, 0, buf, sizeof(buf), &eaten); + sendkey(Kesc, 0, com, sizeof(com), pre, sizeof(pre), &eaten); } static void @@ -284,6 +291,28 @@ emitcommit(DBusConnection *c, const char *path, const char *text) dbus_message_unref(sig); } +static void +emitpreedit(DBusConnection *c, const char *path, const char *text) +{ + DBusMessage *sig; + DBusMessageIter it; + dbus_uint32_t cursor; + dbus_bool_t visible; + + sig = dbus_message_new_signal(path, + "org.freedesktop.IBus.InputContext", "UpdatePreeditText"); + if(sig == nil) + return; + dbus_message_iter_init_append(sig, &it); + appendibustext(&it, text); + cursor = utflen(text); + visible = text[0] != '\0' ? TRUE : FALSE; + dbus_message_iter_append_basic(&it, DBUS_TYPE_UINT32, &cursor); + dbus_message_iter_append_basic(&it, DBUS_TYPE_BOOLEAN, &visible); + dbus_connection_send(c, sig, nil); + dbus_message_unref(sig); +} + static DBusHandlerResult handlehello(DBusConnection *c, DBusMessage *m) { @@ -324,8 +353,8 @@ handlekey(DBusConnection *c, DBusMessage *m) DBusMessage *r; DBusError err; dbus_uint32_t sym, code, state; - char commit[256]; - int eaten, n; + char commit[256], preedit[256]; + int eaten; dbus_bool_t b; u32int ks, mod; @@ -349,9 +378,11 @@ handlekey(DBusConnection *c, DBusMessage *m) } ks = kget(sym); mod = mget(state); - n = sendkey(ks, mod, commit, sizeof(commit), &eaten); - if(n > 0) + sendkey(ks, mod, commit, sizeof(commit), preedit, sizeof(preedit), + &eaten); + if(commit[0] != '\0') emitcommit(c, dbus_message_get_path(m), commit); + emitpreedit(c, dbus_message_get_path(m), preedit); r = dbus_message_new_method_return(m); b = eaten ? TRUE : FALSE; dbus_message_append_args(r, DBUS_TYPE_BOOLEAN, &b, DBUS_TYPE_INVALID); @@ -375,6 +406,7 @@ static DBusHandlerResult handlereset(DBusConnection *c, DBusMessage *m) { sendreset(); + emitpreedit(c, dbus_message_get_path(m), ""); return handlenoop(c, m); } @@ -405,6 +437,8 @@ static const char introspectxml[] = "\n" " \n" " \n" +" " +"\n" " \n" "\n";