diff --git a/gtk/main.c b/gtk/main.c index 0b8367d..5e1cfed 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -12,6 +12,8 @@ struct Im { GtkIMContext parent; int fd; + char pre[256]; + int prelen; }; typedef struct ImClass ImClass; @@ -44,8 +46,8 @@ srvconnect(Im *im) static int readresp(Im *im, char *buf, int bufsz) { - unsigned char hdr[2]; - int n; + unsigned char hdr[2], pl; + int n, was; if(read(im->fd, hdr, 2) != 2) return -1; @@ -56,6 +58,21 @@ readresp(Im *im, char *buf, int bufsz) return -1; buf[n] = '\0'; } + if(read(im->fd, &pl, 1) != 1) + return -1; + if(pl >= sizeof(im->pre)) + return -1; + was = im->prelen; + if(pl > 0 && read(im->fd, im->pre, pl) != pl) + return -1; + im->pre[pl] = '\0'; + im->prelen = pl; + if(was == 0 && pl > 0) + g_signal_emit_by_name(im, "preedit-start"); + if(was != 0 || pl != 0) + g_signal_emit_by_name(im, "preedit-changed"); + if(was > 0 && pl == 0) + g_signal_emit_by_name(im, "preedit-end"); return hdr[0]; } @@ -92,7 +109,7 @@ sendreset(Im *im) if(im->fd < 0) return; - buf[0] = 0; + buf[0] = 1; buf[1] = 0; buf[2] = Kesc & 0xff; buf[3] = Kesc >> 8; @@ -119,7 +136,7 @@ kpress(GtkIMContext *ctx, GdkEventKey *ev) if(key == 0) return FALSE; mod = mget(ev->state); - buf[0] = 0; + buf[0] = 1; buf[1] = mod; buf[2] = key & 0xff; buf[3] = key >> 8; @@ -133,6 +150,25 @@ kpress(GtkIMContext *ctx, GdkEventKey *ev) return r != 0; } +static void +getpreedit(GtkIMContext *ctx, gchar **str, PangoAttrList **attrs, + gint *cursor_pos) +{ + Im *im; + PangoAttribute *u; + + im = (Im*)ctx; + *str = g_strdup(im->pre); + *attrs = pango_attr_list_new(); + if(im->prelen > 0){ + u = pango_attr_underline_new(PANGO_UNDERLINE_SINGLE); + u->start_index = 0; + u->end_index = im->prelen; + pango_attr_list_insert(*attrs, u); + } + *cursor_pos = g_utf8_strlen(im->pre, -1); +} + static void reset(GtkIMContext *ctx) { @@ -171,6 +207,7 @@ classinit(ImClass *klass) ic = GTK_IM_CONTEXT_CLASS(klass); oc = G_OBJECT_CLASS(klass); ic->filter_keypress = kpress; + ic->get_preedit_string = getpreedit; ic->reset = reset; ic->focus_out = focusout; oc->finalize = finalize; diff --git a/srv.c b/srv.c index d1f3892..7fc0793 100644 --- a/srv.c +++ b/srv.c @@ -4,14 +4,14 @@ static char adir[40]; static void -sendkey(int fd, u32int ks, u32int mod) +sendkey(int fd, u32int ks, u32int mod, int want) { Keyreq kr; kr.fd = fd; kr.ks = ks; kr.mod = mod; - kr.want = 0; + kr.want = want; chansend(keyc, &kr); } @@ -24,7 +24,7 @@ clientthread(void *arg) fd = (int)(uintptr)arg; threadsetname("client %d", fd); while(read(fd, req, 4) == 4) - sendkey(fd, req[2] | (req[3] << 8), req[1]); + sendkey(fd, req[2] | (req[3] << 8), req[1], req[0]); close(fd); }