diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-12-31 21:09:46 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-12-31 21:09:46 +0100 |
commit | 6cadd03bbeace1c256ba875c2e6a877f924877cd (patch) | |
tree | 8079ea6f6ccdb1c2cbb2b7813f618837617cb33e /sys/src/libdraw | |
parent | 6d99096136278f06f6333f927da34105a8dfe0bf (diff) |
fix utf and rune handling in preparation for 32bit runes
Diffstat (limited to 'sys/src/libdraw')
-rw-r--r-- | sys/src/libdraw/buildfont.c | 2 | ||||
-rw-r--r-- | sys/src/libdraw/event.c | 16 |
2 files changed, 8 insertions, 10 deletions
diff --git a/sys/src/libdraw/buildfont.c b/sys/src/libdraw/buildfont.c index ba32e775b..ca13d55d6 100644 --- a/sys/src/libdraw/buildfont.c +++ b/sys/src/libdraw/buildfont.c @@ -70,7 +70,7 @@ buildfont(Display *d, char *buf, char *name) } max = strtol(s, &s, 0); s = skip(s); - if(*s==0 || min>=65536 || max>=65536 || min>max){ + if(*s==0 || min>Runemax || max>Runemax || min>max){ werrstr("illegal subfont range"); Err3: freefont(fnt); diff --git a/sys/src/libdraw/event.c b/sys/src/libdraw/event.c index 1cf223c36..5f99199dd 100644 --- a/sys/src/libdraw/event.c +++ b/sys/src/libdraw/event.c @@ -199,7 +199,7 @@ static void ekeyslave(int fd) { Rune r; - char t[3], k[10]; + char t[1+UTFmax], k[10]; int kr, kn, w; if(eforkslave(Ekeyboard) < MAXSLAVE) @@ -215,10 +215,9 @@ ekeyslave(int fd) } w = chartorune(&r, k); kn -= w; + memmove(t+1, k, w); memmove(k, &k[w], kn); - t[1] = r; - t[2] = r>>8; - if(write(epipe[1], t, 3) != 3) + if(write(epipe[1], t, sizeof(t)) != sizeof(t)) break; } breakout:; @@ -302,7 +301,7 @@ loop: s->head = (Ebuf *)1; return; } - if(i == Skeyboard && n != 3) + if(i == Skeyboard && n != (1+UTFmax)) drawerror(display, "events: protocol error: keyboard"); if(i == Smouse){ if(n < 1+1+2*12) @@ -418,14 +417,13 @@ int ekbd(void) { Ebuf *eb; - int c; + Rune r; if(Skeyboard < 0) drawerror(display, "events: keyboard not initialzed"); eb = ebread(&eslave[Skeyboard]); - c = eb->buf[0] + (eb->buf[1]<<8); - free(eb); - return c; + chartorune(&r, (char*)eb->buf); + return r; } void |