]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/rio/wind.c
rio: second attempt...
[plan9front.git] / sys / src / cmd / rio / wind.c
index 6bf3fe90b69613dd8828c26bc5f7b14c12ee6249..f29fb6a431c451ce48eeaca62ae8aa34ba5ed01e 100644 (file)
@@ -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);
@@ -109,6 +109,7 @@ wresize(Window *w, Image *i)
        wsetselect(w, w->q0, w->q1);
        wscrdraw(w);
        wborder(w, Selborder);
+       flushimage(display, 1);
        wsetname(w);
        w->topped = ++topped;
        w->resized = TRUE;
@@ -158,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];
@@ -166,33 +167,28 @@ 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;
        char *kbdq[32], *kbds;
-       int kbdqr, kbdqw;
+       uint kbdqr, kbdqw;
 
        w = 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;
@@ -210,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;
@@ -220,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;
@@ -262,32 +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:
-                       i = (kbdqr+1) % nelem(kbdq);
-                       if(kbdqr != kbdqw)
-                               kbdqr = i;
-                       if(kbdq[i]){
-                               sendp(krm.ck, kbdq[i]);
-                               kbdq[i] = nil;
-                       }else
-                               sendp(krm.ck, strdup("K"));
+                       recv(crm.c1, &pair);
+                       nb = 0;
+                       while(kbdqr != kbdqw){
+                               kbds = kbdq[kbdqr % nelem(kbdq)];
+                               i = strlen(kbds)+1;
+                               if(nb+i > pair.ns)
+                                       break;
+                               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++;
@@ -323,15 +324,12 @@ 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);
-                               chanfree(krm.ck);
                                chanfree(cwm.cw);
-                               chanfree(cwrm.c1);
-                               chanfree(cwrm.c2);
                                threadexits(nil);
                        }
                        continue;
@@ -405,14 +403,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){
@@ -432,7 +430,7 @@ winctl(void *arg)
                        freecompletion(cr);
                        break;
                }
-               if(w->i!=nil && Dx(w->screenr) > 0)
+               if(w->i!=nil && Dx(w->screenr) > 0 && display->bufp > display->buf)
                        flushimage(display, 1);
        }
 }
@@ -689,7 +687,7 @@ wkeyctl(Window *w, Rune r)
                        --w->holding;
                else
                        w->holding++;
-               wsetcursor(w, 0);
+               wsetcursor(w, FALSE);
                wrepaint(w);
                if(r == Kesc)
                        return;
@@ -873,9 +871,9 @@ wplumb(Window *w)
        m->data = runetobyte(w->r+p0, p1-p0, &m->ndata);
        if(plumbsend(fd, m) < 0){
                c = lastcursor;
-               riosetcursor(&query, 1);
+               riosetcursor(&query);
                sleep(300);
-               riosetcursor(c, 1);
+               riosetcursor(c);
        }
        plumbfree(m);
 }
@@ -905,12 +903,6 @@ wlook(Window *w)
        wshow(w, i);
 }
 
-int
-winborder(Window *w, Point xy)
-{
-       return ptinrect(xy, w->screenr) && !ptinrect(xy, insetrect(w->screenr, Selborder));
-}
-
 void
 wmousectl(Window *w)
 {
@@ -1127,7 +1119,6 @@ wctlmesg(Window *w, int m, Rectangle r, void *p)
                strcpy(buf, w->name);
                wresize(w, i);
                proccreate(deletetimeoutproc, estrdup(buf), 4096);
-               flushimage(display, 1);
                if(Dx(r)<=0){   /* window got hidden, if we had the input, drop it */
                        if(w==input)
                                input = nil;
@@ -1202,7 +1193,7 @@ wctlmesg(Window *w, int m, Rectangle r, void *p)
                if(w->i==nil)
                        break;
                if(w==input)
-                       wsetcursor(w, 0);
+                       wsetcursor(w, FALSE);
                wrepaint(w);
                flushimage(display, 1);
                break;
@@ -1302,6 +1293,8 @@ wsetcursor(Window *w, int force)
 {
        Cursor *p;
 
+       if(menuing || sweeping)
+               return;
        if(w==nil || w->i==nil || Dx(w->screenr)<=0)
                p = nil;
        else if(wpointto(mouse->xy) == w){
@@ -1310,20 +1303,20 @@ wsetcursor(Window *w, int force)
                        p = &whitearrow;
        }else
                p = nil;
-       if(!menuing)
-               riosetcursor(p, force && !menuing);
+       if(force)       /* force cursor reload */
+               lastcursor = (void*)~0;
+       riosetcursor(p);
 }
 
 void
-riosetcursor(Cursor *p, int force)
+riosetcursor(Cursor *p)
 {
-       if(!force && p==lastcursor)
+       if(p==lastcursor)
                return;
        setcursor(mousectl, p);
        lastcursor = p;
 }
 
-
 void
 wtopme(Window *w)
 {
@@ -1380,7 +1373,7 @@ wclunk(Window *w)
        w->deleted = TRUE;
        if(w == input){
                input = nil;
-               wsetcursor(w, 0);
+               wsetcursor(w, FALSE);
        }
        if(w == wkeyboard)
                wkeyboard = nil;