merge
This commit is contained in:
commit
5f54eaddba
3 changed files with 24 additions and 46 deletions
|
@ -38,7 +38,6 @@ typedef struct Mousestate Mousestate;
|
||||||
typedef struct Ref Ref;
|
typedef struct Ref Ref;
|
||||||
typedef struct Timer Timer;
|
typedef struct Timer Timer;
|
||||||
typedef struct Wctlmesg Wctlmesg;
|
typedef struct Wctlmesg Wctlmesg;
|
||||||
typedef struct Wdelmesg Wdelmesg;
|
|
||||||
typedef struct Window Window;
|
typedef struct Window Window;
|
||||||
typedef struct Xfid Xfid;
|
typedef struct Xfid Xfid;
|
||||||
|
|
||||||
|
@ -81,12 +80,6 @@ struct Wctlmesg
|
||||||
void *p;
|
void *p;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Wdelmesg
|
|
||||||
{
|
|
||||||
char *s;
|
|
||||||
Image *i;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Conswritemesg
|
struct Conswritemesg
|
||||||
{
|
{
|
||||||
Channel *cw; /* chan(Stringpair) */
|
Channel *cw; /* chan(Stringpair) */
|
||||||
|
|
|
@ -205,7 +205,7 @@ threadmain(int argc, char *argv[])
|
||||||
|
|
||||||
exitchan = chancreate(sizeof(int), 0);
|
exitchan = chancreate(sizeof(int), 0);
|
||||||
winclosechan = chancreate(sizeof(Window*), 0);
|
winclosechan = chancreate(sizeof(Window*), 0);
|
||||||
deletechan = chancreate(sizeof(Wdelmesg), 0);
|
deletechan = chancreate(sizeof(char*), 0);
|
||||||
|
|
||||||
timerinit();
|
timerinit();
|
||||||
threadcreate(keyboardthread, nil, STACK);
|
threadcreate(keyboardthread, nil, STACK);
|
||||||
|
@ -422,28 +422,30 @@ winclosethread(void*)
|
||||||
void
|
void
|
||||||
deletethread(void*)
|
deletethread(void*)
|
||||||
{
|
{
|
||||||
Wdelmesg m;
|
char *s;
|
||||||
|
Image *i;
|
||||||
|
|
||||||
threadsetname("deletethread");
|
threadsetname("deletethread");
|
||||||
for(;;){
|
for(;;){
|
||||||
recv(deletechan, &m);
|
s = recvp(deletechan);
|
||||||
freeimage(m.i);
|
i = namedimage(display, s);
|
||||||
m.i = namedimage(display, m.s);
|
if(i != nil){
|
||||||
if(m.i != nil){
|
|
||||||
/* move it off-screen to hide it, since client is slow in letting it go */
|
/* move it off-screen to hide it, since client is slow in letting it go */
|
||||||
originwindow(m.i, m.i->r.min, view->r.max);
|
originwindow(i, i->r.min, view->r.max);
|
||||||
}
|
}
|
||||||
freeimage(m.i);
|
freeimage(i);
|
||||||
free(m.s);
|
free(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
deletetimeoutproc(void *v)
|
deletetimeoutproc(void *v)
|
||||||
{
|
{
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
s = v;
|
||||||
sleep(750); /* remove window from screen after 3/4 of a second */
|
sleep(750); /* remove window from screen after 3/4 of a second */
|
||||||
send(deletechan, v);
|
sendp(deletechan, s);
|
||||||
free(v);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -88,35 +88,13 @@ void
|
||||||
wresize(Window *w, Image *i, int move)
|
wresize(Window *w, Image *i, int move)
|
||||||
{
|
{
|
||||||
Rectangle r, or;
|
Rectangle r, or;
|
||||||
Wdelmesg *m;
|
|
||||||
|
|
||||||
or = w->i->r;
|
or = w->i->r;
|
||||||
if(move || (Dx(or)==Dx(i->r) && Dy(or)==Dy(i->r)))
|
if(move || (Dx(or)==Dx(i->r) && Dy(or)==Dy(i->r)))
|
||||||
draw(i, i->r, w->i, nil, w->i->r.min);
|
draw(i, i->r, w->i, nil, w->i->r.min);
|
||||||
|
freeimage(w->i);
|
||||||
m = emalloc(sizeof(Wdelmesg));
|
|
||||||
m->s = estrdup(w->name);
|
|
||||||
m->i = w->i;
|
|
||||||
|
|
||||||
w->i = i;
|
w->i = i;
|
||||||
w->mc.image = i;
|
w->mc.image = i;
|
||||||
|
|
||||||
if(w->mouseopen){
|
|
||||||
/*
|
|
||||||
* do not freeimage() here because the client might be in
|
|
||||||
* the process of attaching that image using winname.
|
|
||||||
* move the old window offscreen unless its completely
|
|
||||||
* hidden by the new window and let deletetimeoutproc
|
|
||||||
* free the image after some delay.
|
|
||||||
*/
|
|
||||||
if(!rectinrect(or, w->screenr))
|
|
||||||
originwindow(m->i, or.min, view->r.max);
|
|
||||||
} else {
|
|
||||||
freeimage(m->i);
|
|
||||||
m->i = nil;
|
|
||||||
}
|
|
||||||
proccreate(deletetimeoutproc, m, 4096);
|
|
||||||
|
|
||||||
r = insetrect(i->r, Selborder+1);
|
r = insetrect(i->r, Selborder+1);
|
||||||
w->scrollr = r;
|
w->scrollr = r;
|
||||||
w->scrollr.max.x = r.min.x+Scrollwid;
|
w->scrollr.max.x = r.min.x+Scrollwid;
|
||||||
|
@ -1092,6 +1070,7 @@ wsendctlmesg(Window *w, int type, Rectangle r, void *p)
|
||||||
int
|
int
|
||||||
wctlmesg(Window *w, int m, Rectangle r, void *p)
|
wctlmesg(Window *w, int m, Rectangle r, void *p)
|
||||||
{
|
{
|
||||||
|
char buf[64];
|
||||||
Image *i = p;
|
Image *i = p;
|
||||||
|
|
||||||
switch(m){
|
switch(m){
|
||||||
|
@ -1109,7 +1088,9 @@ wctlmesg(Window *w, int m, Rectangle r, void *p)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
w->screenr = r;
|
w->screenr = r;
|
||||||
|
strcpy(buf, w->name);
|
||||||
wresize(w, i, m==Moved);
|
wresize(w, i, m==Moved);
|
||||||
|
proccreate(deletetimeoutproc, estrdup(buf), 4096);
|
||||||
flushimage(display, 1);
|
flushimage(display, 1);
|
||||||
if(Dx(r)<=0){ /* window got hidden, if we had the input, drop it */
|
if(Dx(r)<=0){ /* window got hidden, if we had the input, drop it */
|
||||||
if(w==input)
|
if(w==input)
|
||||||
|
@ -1196,6 +1177,7 @@ wctlmesg(Window *w, int m, Rectangle r, void *p)
|
||||||
break;
|
break;
|
||||||
wclunk(w);
|
wclunk(w);
|
||||||
write(w->notefd, "hangup", 6);
|
write(w->notefd, "hangup", 6);
|
||||||
|
proccreate(deletetimeoutproc, estrdup(w->name), 4096);
|
||||||
wclosewin(w);
|
wclosewin(w);
|
||||||
break;
|
break;
|
||||||
case Exited:
|
case Exited:
|
||||||
|
@ -1379,13 +1361,14 @@ wclunk(Window *w)
|
||||||
void
|
void
|
||||||
wclosewin(Window *w)
|
wclosewin(Window *w)
|
||||||
{
|
{
|
||||||
Wdelmesg m;
|
Image *i;
|
||||||
|
|
||||||
m.i = w->i;
|
i = w->i;
|
||||||
if(m.i){
|
if(i){
|
||||||
w->i = nil;
|
w->i = nil;
|
||||||
m.s = estrdup(w->name);
|
/* move it off-screen to hide it, in case client is slow in letting it go */
|
||||||
send(deletechan, &m);
|
MOVEIT originwindow(i, i->r.min, view->r.max);
|
||||||
|
freeimage(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue