History

do not use ixppending

yiyus committed 15 years agolibixp

Commit f369d001 parent 4e2aafb9 files · +267 −73Browse files

Unified · Split

9 files
  1. devwsys/dat.h +29 −6
  2. devwsys/fns.h +7 −1
  3. devwsys/ixp_fsys.c +47 −43
  4. devwsys/keyboard.c +67 −6
  5. devwsys/mkfile +1 −0
  6. devwsys/mouse.c +87 −15
  7. devwsys/reqbuf.c +27 −0
  8. devwsys/wctl.c +1 −1
  9. devwsys/x11/event.c +1 −1
devwsys/dat.h+29−6
@@ -34,11 +34,18 @@ typedef struct Client Client; /* Defined in devdraw.c: */ · 33 unmodified lines
3434 typedef struct Kbdbuf Kbdbuf;
3535 typedef struct Cursor Cursor;
3636 typedef struct Clip Clip;
37+typedef struct Mousebuf Mousebuf;
38+typedef struct Reqbuf Reqbuf;
3739 typedef struct Window Window;
3840
39−/* Used by kbdputc */
41+/* Keyboard */
4042 struct Kbdbuf
4143 {
44+ Rune r[32];
45+ int ri;
46+ int wi;
47+ int stall;
48+ /* Used by kbdputc */
4249 uchar k[5*UTFmax];
4350 int alting, nk;
4451 };
@@ -51,6 +58,23 @@ struct Mouse · 6 unmodified lines
5158 ulong msec;
5259 };
5360
61+struct Mousebuf
62+{
63+ int open;
64+ Mouse m[32];
65+ int ri;
66+ int wi;
67+ int stall;
68+ int resized;
69+};
70+
71+struct Reqbuf
72+{
73+ void *r[32];
74+ int ri;
75+ int wi;
76+};
77+
5478 struct Cursor {
5579 int hotx;
5680 int hoty;
@@ -72,8 +96,6 @@ struct Window · 15 unmodified lines
7296 int id;
7397 int fullscreen;
7498 int deleted;
75− int mouseopen;
76− int mousebuttons;
7799 int pid;
78100 int resized;
79101 int visible;
@@ -81,10 +103,11 @@ struct Window · 1 unmodified line
81103 char *name;
82104 Draw *draw;
83105 void *screenimage;
84− Kbdbuf kbd;
85− void *kbdp;
86106 void *killr;
87− void *mousep;
107+ Kbdbuf kbd;
108+ Mousebuf mouse;
109+ Reqbuf kbdreqs;
110+ Reqbuf mousereqs;
88111 Cursor cursor;
89112 Point orig;
90113 Rectangle screenr;
devwsys/fns.h+7−1
@@ -8,11 +8,17 @@ void drawreplacescreenimage(Window*); · 7 unmodified lines
88
99 /* Keyboard */
1010 void writekbd(Window*, int);
11+void readkbd(Window*, void*);
1112
1213 /* Mouse */
14+void readmouse(Window*, void*);
1315 void writemouse(Window*, Mouse, int);
1416 int cursorwrite(Window*, char*, int);
1517
18+/* Reqbuf */
19+void addreq(Reqbuf*, void*);
20+void* nextreq(Reqbuf *reqs);
21+
1622 /* Window */
1723 Window* newwin(char*);
1824 void deletewin(Window*);
@@ -22,7 +28,7 @@ void setlabel(Window*, char*); · 3 unmodified lines
2228 int wctlmesg(Window*, char*, int, char*);
2329
2430 /* Ixp */
25−void ixppwrite(void*, char*);
31+void ixprread(void*, char*);
2632 int ixpserve(char*);
2733 void killrespond(Window*);
2834
devwsys/ixp_fsys.c+47−43
@@ -31,7 +31,7 @@ const char · 30 unmodified lines
3131 *Eshortwrite = "draw write too short";
3232
3333 /* Macros */
34−#define debug9p(...) if(0) debug(__VA_ARGS__)
34+#define debug9p(...) if(1) debug(__VA_ARGS__)
3535 #define QID(t, i) (((vlong)((t)&0xFF)<<32)|((i)&0xFFFFFFFF))
3636
3737 /* Global Vars */
@@ -238,14 +238,6 @@ fs_attach(Ixp9Req *r) { · 200 unmodified lines
238238 ixp_respond(r, Enomem);
239239 return;
240240 }
241− if(!(w->kbdp = mallocz(sizeof(IxpPending), 1))){
242− ixp_respond(r, Enomem);
243− return;
244− }
245− if(!(w->mousep = mallocz(sizeof(IxpPending), 1))){
246− ixp_respond(r, Enomem);
247− return;
248− }
249241 f->p.window = w;
250242 ixp_respond(r, nil);
251243 }
@@ -292,16 +284,12 @@ fs_open(Ixp9Req *r) { · 40 unmodified lines
292284 switch(f->tab.type) {
293285 case FsFNew:
294286 break;
295− case FsFCons:
296− ixp_pending_pushfid(w->kbdp, r->fid);
297− break;
298287 case FsFMouse:
299− if(w->mouseopen){
288+ if(w->mouse.open){
300289 ixp_respond(r, Einuse);
301290 return;
302291 }
303− w->mouseopen = 1;
304− ixp_pending_pushfid(w->mousep, r->fid);
292+ w->mouse.open = 1;
305293 break;
306294 case FsFSnarf:
307295 if((r->ifcall.topen.mode&3) == ORDWR){
@@ -352,10 +340,6 @@ fs_read(Ixp9Req *r) { · 44 unmodified lines
352340 ixp_srv_readdir(r, lookup_file, dostat);
353341 return;
354342 }
355− if(f->pending) {
356− ixp_pending_respond(r);
357− return;
358− }
359343 cl = f->p.client;
360344 w = f->p.window;
361345 if(!iswindow(f->tab.type))
@@ -380,6 +364,9 @@ fs_read(Ixp9Req *r) { · 18 unmodified lines
380364 return;
381365 }
382366 switch(f->tab.type) {
367+ case FsFCons:
368+ readkbd(w, r);
369+ return;
383370 case FsFKill:
384371 w->killr = r;
385372 if(w->deleted){
@@ -393,6 +380,9 @@ fs_read(Ixp9Req *r) { · 7 unmodified lines
393380 ixp_srv_readbuf(r, w->label, strlen(w->label));
394381 ixp_respond(r, nil);
395382 return;
383+ case FsFMouse:
384+ readmouse(w, r);
385+ return;
396386 case FsFSnarf:
397387 s= xgetsnarf(w);
398388 ixp_srv_readbuf(r, s, strlen(s));
@@ -522,13 +512,13 @@ fs_write(Ixp9Req *r) { · 123 unmodified lines
522512 setlabel(w, label);
523513 break;
524514 case FsFMouse:
525− /*
526− * TODO: as we are using ixp_pending to read,
527− * there is no way to get the aux field to write.
528− */
529− break;
530515 r->ofcall.io.count = r->ifcall.io.count;
531− pt.x = strtoul(r->ifcall.twrite.data, &p, 0);
516+ if(r->ifcall.io.count == 0){
517+ ixp_respond(r, Eshortwrite);
518+ return;
519+ }
520+ p = &r->ifcall.twrite.data[1];
521+ pt.x = strtoul(p, &p, 0);
532522 if(p == 0){
533523 ixp_respond(r, Eshortwrite);
534524 return;
@@ -590,17 +580,18 @@ fs_clunk(Ixp9Req *r) { · 55 unmodified lines
590580 w = f->p.window;
591581 if(!iswindow(f->tab.type))
592582 w = drawwindow(cl);
593− if(f->pending) {
594− /* Should probably be in freefid */
595− if(ixp_pending_clunk(r)) {
596− if(f->tab.type == FsFMouse)
597− w->mouseopen = 0;
598− }
599− return;
600− }
601583
602584 // TODO: ../../inferno-os/emu/port/devdraw.c:971
603585 switch(f->tab.type){
586+ case FsFCons:
587+ w->kbd.wi = w->kbd.ri;
588+ w->kbdreqs.wi = w->kbdreqs.ri;
589+ break;
590+ case FsFMouse:
591+ w->mouse.open = 0;
592+ w->mouse.wi = w->mouse.ri;
593+ w->mousereqs.wi = w->mousereqs.ri;
594+ break;
604595 case FsFSnarf:
605596 if(r->fid->omode == OWRITE){
606597 if(snarfbuf)
@@ -624,9 +615,6 @@ fs_flush(Ixp9Req *r) { · 17 unmodified lines
624615
625616 or = r->oldreq;
626617 f = or->fid->aux;
627− if(f->pending)
628− ixp_pending_flush(r);
629− /* else die() ? */
630618 ixp_respond(r->oldreq, Einterrupted);
631619 ixp_respond(r, nil);
632620 }
@@ -678,17 +666,33 @@ Ixp9Srv p9srv = { · 45 unmodified lines
678666 };
679667
680668 void
681−ixppwrite(void *v, char *buf)
669+killrespond(Window *w)
682670 {
683− IxpPending *p;
684−
685− p = v;
686− ixp_pending_write(p, buf, strlen(buf));
671+ fs_read(w->killr);
687672 }
688673
674+/* Reply a read request */
689675 void
690−killrespond(Window *w)
676+ixprread(void *v, char *buf)
691677 {
692− fs_read(w->killr);
678+ Ixp9Req *r;
679+ IxpFileId *f;
680+ Client *cl;
681+ Window *w;
682+
683+ r = v;
684+ f = r->fid->aux;
685+ // print("XXX ixprread %s\n", f->tab.name);
686+ cl = f->p.client;
687+ w = f->p.window;
688+ if(!iswindow(f->tab.type))
689+ w = drawwindow(cl);
690+ if(w->deleted){
691+ ixp_respond(r, Edeleted);
692+ return;
693+ }
694+ r->ifcall.rread.offset = 0;
695+ ixp_srv_readbuf(r, buf, strlen(buf));
696+ ixp_respond(r, nil);
693697 }
694698
devwsys/keyboard.c+67−6
@@ -4,24 +4,85 @@ · 3 unmodified lines
44 #include "dat.h"
55 #include "fns.h"
66
7−int kbdputc(Kbdbuf*, int);
7+static void addkbd(Kbdbuf*, int);
8+static void matchkbd(Kbdbuf*, Reqbuf*);
9+static void replykbd(Kbdbuf*, void*);
10+static int kbdputc(Kbdbuf*, int);
811 long latin1(uchar*, int);
912
13+void
14+readkbd(Window *w, void* r)
15+{
16+ Kbdbuf *kbd;
17+ Reqbuf *kbdreqs;
18+
19+ kbd = &w->kbd;
20+ kbdreqs = &w->kbdreqs;
21+
22+ addreq(kbdreqs, r);
23+ // fprint(2, "kbd unstall\n");
24+ kbd->stall = 0;
25+ matchkbd(kbd, kbdreqs);
26+}
27+
1028 void
1129 writekbd(Window *w, int ch)
1230 {
13− char buf[5];
14− Rune r;
1531 Kbdbuf *kbd;
32+ Reqbuf *kbdreqs;
1633
1734 kbd = &w->kbd;
18− if((ch = kbdputc(kbd, ch)) == -1)
35+ kbdreqs = &w->kbdreqs;
36+
37+ addkbd(kbd, ch);
38+ matchkbd(kbd, kbdreqs);
39+}
40+
41+static
42+void
43+addkbd(Kbdbuf *kbd, int ch)
44+{
45+ Rune r;
46+
47+ ch = kbdputc(kbd, ch);
48+ if(kbd->stall || ch == -1)
1949 return;
2050 r = ch;
21− sprint(buf, "%C", r);
22− ixppwrite(w->kbdp, buf);
51+
52+ kbd->r[kbd->wi++] = r;
53+ if(kbd->wi == nelem(kbd->r))
54+ kbd->wi = 0;
55+ if(kbd->ri == kbd->wi){
56+ kbd->stall = 1;
57+ /* fprint(2, "kbd stall\n"); */
58+ }
59+}
60+
61+static
62+void
63+matchkbd(Kbdbuf *kbd, Reqbuf *kbdreqs)
64+{
65+ while(kbd->ri != kbd->wi && kbdreqs->ri != kbdreqs->wi){
66+ replykbd(kbd, nextreq(kbdreqs));
67+ kbd->ri++;
68+ if(kbd->ri == nelem(kbd->r))
69+ kbd->ri = 0;
70+ }
71+}
72+
73+static
74+void
75+replykbd(Kbdbuf *kbd, void *r)
76+{
77+ char buf[5];
78+ Rune rune;
79+
80+ rune = kbd->r[kbd->ri];
81+ sprint(buf, "%C", rune);
82+ ixprread(r, buf);
2383 }
2484
85+static
2586 int
2687 kbdputc(Kbdbuf *kbd, int ch)
2788 {
devwsys/mkfile+1−0
@@ -26,6 +26,7 @@ OFILES=\ · 25 unmodified lines
2626 latin1.$O\
2727 main.$O\
2828 mouse.$O\
29+ reqbuf.$O\
2930 wctl.$O\
3031 window.$O\
3132 $SYSHOST-$OBJTYPE.$O\
devwsys/mouse.c+87−15
@@ -4,25 +4,96 @@ · 3 unmodified lines
44 #include "dat.h"
55 #include "fns.h"
66
7+static void addmouse(Mousebuf*, Mouse, int);
8+static void matchmouse(Mousebuf*, Reqbuf*);
9+static void replymouse(Mousebuf*, void*);
10+
11+void
12+readmouse(Window *w, void* r)
13+{
14+ Mousebuf *mouse;
15+ Reqbuf *mousereqs;
16+
17+ mouse = &w->mouse;
18+ mousereqs = &w->mousereqs;
19+
20+ addreq(mousereqs, r);
21+ // fprint(2, "mouse unstall\n");
22+ mouse->stall = 0;
23+ matchmouse(mouse, mousereqs);
24+}
25+
726 void
827 writemouse(Window *w, Mouse m, int resized)
928 {
10− char buf[50], c;
29+ Mousebuf *mouse;
30+ Reqbuf *mousereqs;
1131
12− /*
13− * TODO:
14− * Continuous resizes will cause too many redraws.
15− * The solution is to not queue resize events and instead
16− * change the response, but IxpPending is too opaque
17− * to do that.
18− */
19− c = 'm';
20− if(w->resized)
21− c = 'r';
22− sprint(buf, "%c%11d %11d %11d %11ld ", c, m.xy.x, m.xy.y, m.buttons, m.msec);
23− w->mousebuttons = m.buttons;
24− w->resized = 0;
25− ixppwrite(w->mousep, buf);
32+ mouse = &w->mouse;
33+ mousereqs = &w->mousereqs;
34+
35+ addmouse(mouse, m, resized);
36+ matchmouse(mouse, mousereqs);
37+}
38+
39+static
40+void
41+addmouse(Mousebuf *mouse, Mouse m, int resized)
42+{
43+ int p;
44+
45+ if(!mouse->open || mouse->stall)
46+ return;
47+
48+ mouse->m[mouse->wi] = m;
49+ if(resized){
50+ p = mouse->wi - 1;
51+ if(p < 0)
52+ p = nelem(mouse->m) - 1;
53+ mouse->m[mouse->wi] = mouse->m[p];
54+ mouse->resized = 1;
55+ }
56+ mouse->wi++;
57+ if(mouse->wi == nelem(mouse->m))
58+ mouse->wi = 0;
59+ if(mouse->wi == mouse->ri){
60+ mouse->stall = 1;
61+ mouse->ri = 0;
62+ mouse->wi = 1;
63+ mouse->m[0] = m;
64+ /* fprint(2, "mouse stall\n"); */
65+ }
66+}
67+
68+static
69+void
70+replymouse(Mousebuf *mouse, void *r)
71+{
72+ int n, resized;
73+ char buf[50], c;
74+ Mouse m;
75+
76+ m = mouse->m[mouse->ri];
77+ resized = mouse->resized;
78+ c = 'm';
79+ if(mouse->resized)
80+ c = 'r';
81+ n = sprint(buf, "%c%11d %11d %11d %11ld ", c, m.xy.x, m.xy.y, m.buttons, m.msec);
82+ buf[n] = '\0';
83+ ixprread(r, buf);
84+ mouse->resized = 0;
85+}
86+
87+static
88+void
89+matchmouse(Mousebuf *mouse, Reqbuf *mousereqs)
90+{
91+ while(mouse->ri != mouse->wi && mousereqs->ri != mousereqs->wi){
92+ replymouse(mouse, nextreq(mousereqs));
93+ mouse->ri++;
94+ if(mouse->ri == nelem(mouse->m))
95+ mouse->ri = 0;
96+ }
2697 }
2798
2899 static int
@@ -145,3 +216,4 @@ cursorwrite(Window *w, char *buf, int n) · 116 unmodified lines
145216 }
146217 return 0;
147218 }
219+
devwsys/reqbuf.c+27−0
@@ -0,0 +1,27 @@
1+#include <lib9.h>
2+#include <draw.h>
3+#include "dat.h"
4+#include "fns.h"
5+
6+void
7+addreq(Reqbuf *reqs, void* r)
8+{
9+ reqs->r[reqs->wi] = r;
10+ reqs->wi++;
11+ if(reqs->wi == nelem(reqs->r))
12+ reqs->wi = 0;
13+ if(reqs->wi == reqs->ri)
14+ sysfatal("too many queued reads");
15+}
16+
17+void*
18+nextreq(Reqbuf *reqs)
19+{
20+ void *r;
21+
22+ r = reqs->r[reqs->ri];
23+ reqs->ri++;
24+ if(reqs->ri == nelem(reqs->r))
25+ reqs->ri = 0;
26+ return r;
27+}
devwsys/wctl.c+1−1
@@ -255,7 +255,7 @@ wctlmesg(Window *w, char *a, int n, char *err) · 254 unmodified lines
255255 cnt = n;
256256 a[cnt] = '\0';
257257 id = pid = 0;
258− buttons = w->mousebuttons;
258+ buttons = w->mouse.m[w->mouse.ri].buttons;
259259
260260 // print(" XXX wctlmesg: a = %s\n", a);
261261 rect = rectaddpt(w->screenr, w->orig);
devwsys/x11/event.c+1−1
@@ -135,7 +135,7 @@ configevent(Window *w, XEvent xev) · 134 unmodified lines
135135 * the window has already been resized, but
136136 * IxpPending does not let us to do that.
137137 */
138− // writemouse(w, m, 1);
138+ writemouse(w, m, 1);
139139 }
140140
141141 void