summaryrefslogtreecommitdiff
path: root/sys/src/cmd/rio/wind.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2016-04-03 22:54:22 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2016-04-03 22:54:22 +0200
commitce84082205f8367c1a4676c4810d92b30ae87f49 (patch)
tree1f33dee7fb1674e0c18dcafb5cb56b7ee92aa395 /sys/src/cmd/rio/wind.c
parentcd9cddf3dd64b01e7e54ba3a3371a8d0a5c70748 (diff)
change /dev/kbd to return multiple messages per read
Diffstat (limited to 'sys/src/cmd/rio/wind.c')
-rw-r--r--sys/src/cmd/rio/wind.c49
1 files changed, 27 insertions, 22 deletions
diff --git a/sys/src/cmd/rio/wind.c b/sys/src/cmd/rio/wind.c
index 53365576f..e833422d4 100644
--- a/sys/src/cmd/rio/wind.c
+++ b/sys/src/cmd/rio/wind.c
@@ -41,7 +41,7 @@ wmk(Image *i, Mousectl *mc, Channel *ck, Channel *cctl, int scrolling)
w->cursorp = nil;
w->conswrite = chancreate(sizeof(Conswritemesg), 0);
w->consread = chancreate(sizeof(Consreadmesg), 0);
- w->kbdread = chancreate(sizeof(Kbdreadmesg), 0);
+ w->kbdread = chancreate(sizeof(Consreadmesg), 0);
w->mouseread = chancreate(sizeof(Mousereadmesg), 0);
w->wctlread = chancreate(sizeof(Consreadmesg), 0);
w->complete = chancreate(sizeof(Completion*), 0);
@@ -167,11 +167,9 @@ winctl(void *arg)
Mousestate *mp, m;
enum { WKbd, WKbdread, WMouse, WMouseread, WCtl, WCwrite, WCread, WWread, WComplete, Wgone, NWALT };
Alt alts[NWALT+1];
+ Consreadmesg crm;
Mousereadmesg mrm;
- Kbdreadmesg krm;
Conswritemesg cwm;
- Consreadmesg crm;
- Consreadmesg cwrm;
Stringpair pair;
Wctlmesg wcm;
Completion *cr;
@@ -182,18 +180,15 @@ winctl(void *arg)
threadsetname("winctl-id%d", w->id);
mrm.cm = chancreate(sizeof(Mouse), 0);
- krm.ck = chancreate(sizeof(char*), 0);
- cwm.cw = chancreate(sizeof(Stringpair), 0);
crm.c1 = chancreate(sizeof(Stringpair), 0);
crm.c2 = chancreate(sizeof(Stringpair), 0);
- cwrm.c1 = chancreate(sizeof(Stringpair), 0);
- cwrm.c2 = chancreate(sizeof(Stringpair), 0);
+ cwm.cw = chancreate(sizeof(Stringpair), 0);
alts[WKbd].c = w->ck;
alts[WKbd].v = &kbds;
alts[WKbd].op = CHANRCV;
alts[WKbdread].c = w->kbdread;
- alts[WKbdread].v = &krm;
+ alts[WKbdread].v = &crm;
alts[WKbdread].op = CHANSND;
alts[WMouse].c = w->mc.c;
alts[WMouse].v = &w->mc.Mouse;
@@ -211,7 +206,7 @@ winctl(void *arg)
alts[WCread].v = &crm;
alts[WCread].op = CHANSND;
alts[WWread].c = w->wctlread;
- alts[WWread].v = &cwrm;
+ alts[WWread].v = &crm;
alts[WWread].op = CHANSND;
alts[WComplete].c = w->complete;
alts[WComplete].v = &cr;
@@ -279,14 +274,27 @@ winctl(void *arg)
break;
case WKbdread:
- i = (kbdqr+1) % nelem(kbdq);
- if(kbdqr != kbdqw)
- kbdqr = i;
- if(kbdq[i]){
- sendp(krm.ck, kbdq[i]);
+ recv(crm.c1, &pair);
+ nb = pair.ns;
+ pair.ns = 0;
+ t = pair.s;
+ while(kbdqr != kbdqw){
+ int m;
+
+ i = (kbdqr+1) % nelem(kbdq);
+ if(kbdq[i] == nil)
+ 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;
- }else
- sendp(krm.ck, strdup("K"));
+ kbdqr = i;
+ }
+ send(crm.c2, &pair);
continue;
case WMouse:
@@ -329,10 +337,7 @@ winctl(void *arg)
chanfree(crm.c1);
chanfree(crm.c2);
chanfree(mrm.cm);
- chanfree(krm.ck);
chanfree(cwm.cw);
- chanfree(cwrm.c1);
- chanfree(cwrm.c2);
threadexits(nil);
}
continue;
@@ -406,14 +411,14 @@ winctl(void *arg)
continue;
case WWread:
w->wctlready = 0;
- recv(cwrm.c1, &pair);
+ recv(crm.c1, &pair);
s = Dx(w->screenr) > 0 ? "visible" : "hidden";
t = "notcurrent";
if(w == input)
t = "current";
pair.ns = snprint(pair.s, pair.ns, "%11d %11d %11d %11d %s %s ",
w->i->r.min.x, w->i->r.min.y, w->i->r.max.x, w->i->r.max.y, t, s);
- send(cwrm.c2, &pair);
+ send(crm.c2, &pair);
continue;
case WComplete:
if(w->i!=nil){