summaryrefslogtreecommitdiff
path: root/sys/src/libdraw
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-12-31 21:09:46 +0100
committercinap_lenrek <cinap_lenrek@gmx.de>2012-12-31 21:09:46 +0100
commit6cadd03bbeace1c256ba875c2e6a877f924877cd (patch)
tree8079ea6f6ccdb1c2cbb2b7813f618837617cb33e /sys/src/libdraw
parent6d99096136278f06f6333f927da34105a8dfe0bf (diff)
fix utf and rune handling in preparation for 32bit runes
Diffstat (limited to 'sys/src/libdraw')
-rw-r--r--sys/src/libdraw/buildfont.c2
-rw-r--r--sys/src/libdraw/event.c16
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