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);
wsetselect(w, w->q0, w->q1);
wscrdraw(w);
wborder(w, Selborder);
+ flushimage(display, 1);
wsetname(w);
w->topped = ++topped;
w->resized = TRUE;
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];
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;
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;
alts[Wgone].op = CHANNOP;
alts[NWALT].op = CHANEND;
- memset(kbdq, 0, sizeof(kbdq));
kbdqr = kbdqw = 0;
npart = 0;
lastb = -1;
}
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++;
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;
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){
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);
}
}
--w->holding;
else
w->holding++;
- wsetcursor(w, 0);
+ wsetcursor(w, FALSE);
wrepaint(w);
if(r == Kesc)
return;
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);
}
wshow(w, i);
}
-int
-winborder(Window *w, Point xy)
-{
- return ptinrect(xy, w->screenr) && !ptinrect(xy, insetrect(w->screenr, Selborder));
-}
-
void
wmousectl(Window *w)
{
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;
if(w->i==nil)
break;
if(w==input)
- wsetcursor(w, 0);
+ wsetcursor(w, FALSE);
wrepaint(w);
flushimage(display, 1);
break;
{
Cursor *p;
+ if(menuing || sweeping)
+ return;
if(w==nil || w->i==nil || Dx(w->screenr)<=0)
p = nil;
else if(wpointto(mouse->xy) == w){
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)
{
w->deleted = TRUE;
if(w == input){
input = nil;
- wsetcursor(w, 0);
+ wsetcursor(w, FALSE);
}
if(w == wkeyboard)
wkeyboard = nil;