rio: /dev/kbd cleanup

- use free running unsigned indeces for window kbdq
- emalloc() vs malloc() in xfid
This commit is contained in:
cinap_lenrek 2016-04-04 06:47:26 +02:00
parent 84e16f5b5c
commit a74542613d
2 changed files with 30 additions and 38 deletions

View file

@ -159,7 +159,7 @@ showcandidates(Window *, Completion *);
void
winctl(void *arg)
{
Rune *rp, *up;
Rune *rp, *up, r;
uint qh, q0;
int nr, nb, c, wid, i, npart, initial, lastb;
char *s, *t, part[3];
@ -174,7 +174,7 @@ winctl(void *arg)
Wctlmesg wcm;
Completion *cr;
char *kbdq[32], *kbds;
int kbdqr, kbdqw;
uint kbdqr, kbdqw;
w = arg;
threadsetname("winctl-id%d", w->id);
@ -216,7 +216,6 @@ winctl(void *arg)
alts[Wgone].op = CHANNOP;
alts[NWALT].op = CHANEND;
memset(kbdq, 0, sizeof(kbdq));
kbdqr = kbdqw = 0;
npart = 0;
lastb = -1;
@ -258,45 +257,38 @@ winctl(void *arg)
}
switch(alt(alts)){
case WKbd:
if(w->kbdopen){
i = (kbdqw+1) % nelem(kbdq);
if(i != kbdqr)
kbdqw = i;
} else if(*kbds == 'c'){
Rune r;
chartorune(&r, kbds+1);
if(r)
wkeyctl(w, r);
if(kbdqw - kbdqr < nelem(kbdq))
kbdq[kbdqw++ % nelem(kbdq)] = kbds;
else
free(kbds);
if(w->kbdopen)
continue;
while(kbdqr != kbdqw){
kbds = kbdq[kbdqr++ % nelem(kbdq)];
if(*kbds == 'c'){
chartorune(&r, kbds+1);
if(r)
wkeyctl(w, r);
}
free(kbds);
}
free(kbdq[kbdqw]);
kbdq[kbdqw] = kbds;
break;
case WKbdread:
recv(crm.c1, &pair);
nb = pair.ns;
pair.ns = 0;
t = pair.s;
nb = 0;
while(kbdqr != kbdqw){
int m;
i = (kbdqr+1) % nelem(kbdq);
if(kbdq[i] == nil)
kbds = kbdq[kbdqr % nelem(kbdq)];
i = strlen(kbds)+1;
if(nb+i > pair.ns)
break;
m = strlen(kbdq[i])+1;
nb -= m;
if(nb < 0)
break;
memmove(t, kbdq[i], m);
t += m, pair.ns += m;
free(kbdq[i]);
kbdq[i] = nil;
kbdqr = i;
memmove((char*)pair.s + nb, kbds, i);
free(kbds);
nb += i;
kbdqr++;
}
pair.ns = nb;
send(crm.c2, &pair);
continue;
case WMouse:
if(w->mouseopen) {
w->mouse.counter++;
@ -332,8 +324,8 @@ winctl(void *arg)
continue;
case WCtl:
if(wctlmesg(w, wcm.type, wcm.r, wcm.p) == Exited){
for(i=0; i<nelem(kbdq); i++)
free(kbdq[i]);
while(kbdqr != kbdqw)
free(kbdq[kbdqr++ % nelem(kbdq)]);
chanfree(crm.c1);
chanfree(crm.c2);
chanfree(mrm.cm);

View file

@ -630,7 +630,7 @@ xfidread(Xfid *x)
case Qwctl:
if(cnt < 4*12){
filsysrespond(x->fs, x, &fc, Etooshort);
break;
return;
}
alts[Adata].c = w->wctlread;
goto Consmesg;
@ -665,13 +665,13 @@ xfidread(Xfid *x)
}
c1 = crm.c1;
c2 = crm.c2;
t = malloc(cnt+UTFmax+1); /* room to unpack partial rune plus */
t = emalloc(cnt+UTFmax+1); /* room to unpack partial rune plus */
pair.s = t;
pair.ns = cnt;
send(c1, &pair);
recv(c2, &pair);
fc.data = pair.s;
fc.count = pair.ns;
fc.count = min(cnt, pair.ns);
filsysrespond(x->fs, x, &fc, nil);
free(t);
break;