History

devdraw: drawreplacescreenimage

yiyus committed 15 years ago

Commit 46ebecb1 parent 05168c65 files · +58 −29Browse files

Unified · Split

5 files
  1. devwsys/devdraw.c +54 −24
  2. devwsys/fns.h +1 −2
  3. devwsys/x11/alloc.c +1 −1
  4. devwsys/x11/event.c +1 −1
  5. devwsys/x11/window.c +1 −1
devwsys/devdraw.c+54−24
@@ -393,10 +393,14 @@ drawfreedimage(Draw *d, DImage *dimage) · 392 unmodified lines
393393 goto Return;
394394 }
395395 ds = dimage->dscreen;
396+ l = dimage->image;
397+ dimage->dscreen = nil; /* paranoia */
398+ dimage->image = nil;
396399 if(ds){
397− l = dimage->image;
400+ // XXX TODO: this should not happen:
401+ if(l->layer == nil) return;
398402 if(l->data == d->screenimage->data)
399− dstflush(d, l->layer->screen->image, l->layer->screenr);
403+ addflush(d, l->layer->screenr);
400404 if(l->layer->refreshfn == drawrefresh) /* else true owner will clean up */
401405 free(l->layer->refreshptr);
402406 l->layer->refreshptr = nil;
@@ -409,7 +413,7 @@ drawfreedimage(Draw *d, DImage *dimage) · 6 unmodified lines
409413 // XXX TODO
410414 // inferno-os/emu/port/devdraw.c:652
411415 // plan9port/src/cmd/devdraw/devdraw.c:566,569
412− freememimage(dimage->image);
416+ freememimage(l);
413417 }
414418 Return:
415419 free(dimage->fchar);
@@ -1589,32 +1593,58 @@ error: · 1173 unmodified lines
15891593 */
15901594
15911595 void
1592−drawreplacescreenimage(Window *w, Memimage *m)
1596+drawreplacescreenimage(Draw *d, Memimage *m)
15931597 {
1598+ int i;
1599+ DImage *di;
1600+
1601+ if(d->screendimage == nil)
1602+ return;
1603+
15941604 /*
15951605 * Replace the screen image because the screen
1596− * was resized.
1597− *
1598− * In theory there should only be one reference
1599− * to the current screen image, and that's through
1600− * client0's image 0, installed a few lines above.
1601− * Once the client drops the image, the underlying backing
1602− * store freed properly. The client is being notified
1603− * about the resize through external means, so all we
1604− * need to do is this assignment.
1606+ * was resized. Clients still have references to the
1607+ * old screen image, so we can't free it just yet.
16051608 */
1606− Memimage *om;
1607− Memimage *screenimage;
1609+ // drawqlock();
1610+ di = allocdimage(m);
1611+ if(di == nil){
1612+ print("no memory to replace screen image\n");
1613+ freememimage(m);
1614+ // drawqunlock();
1615+ return;
1616+ }
1617+
1618+ /* Replace old screen image in global name lookup. */
1619+ for(i=0; i<ndname; i++){
1620+ if(dname[i].dimage == d->screendimage)
1621+ if(dname[i].client == nil){
1622+ dname[i].dimage = di;
1623+ break;
1624+ }
1625+ }
16081626
1609− screenimage = w->draw.screenimage;
1610− // qlock(&sdraw.lk);
1611− om = screenimage;
1612− w->draw.screenimage = m;
1613− // m->screenref = 1;
1614− // if(om && --om->screenref == 0){
1615− // freememimage(om);
1616− // }
1617− // qunlock(&sdraw.lk);
1627+ drawfreedimage(d, d->screendimage);
1628+ d->screendimage = di;
1629+ d->screenimage = m;
1630+
1631+ /*
1632+ * Every client, when it starts, gets a copy of the
1633+ * screen image as image 0. Clients only use it
1634+ * for drawing if there is no /dev/winname, but
1635+ * this /dev/draw provides a winname (early ones
1636+ * didn't; winname originated in rio), so the
1637+ * image only ends up used to find the screen
1638+ * resolution and pixel format during initialization.
1639+ * Silently remove the now-outdated image 0s.
1640+ */
1641+ for(i=0; i<nclient; i++){
1642+ if(client[i]->draw == d)
1643+ drawuninstall(client[i], 0);
1644+ }
1645+
1646+ // drawqunlock();
1647+ // mouseresize();
16181648 }
16191649
16201650 void
devwsys/fns.h+1−2
@@ -9,7 +9,7 @@ int drawattach(Window*, char*); · 8 unmodified lines
99 int readdrawctl(char*, Client*);
1010 int readrefresh(char*, long, Client*);
1111 int drawmesg(Client*, void*, int);
12−char* drawerr(void);
12+void drawreplacescreenimage(Draw*, Memimage*);
1313
1414 /* Keyboard */
1515 void writekbd(Window*, int);
@@ -27,7 +27,6 @@ void* nextreq(Reqbuf *reqs); · 11 unmodified lines
2727 void deletewin(Window*);
2828 Window* newwin(char*, char*);
2929 int parsewinsize(char*, Rectangle*, int*);
30−void drawreplacescreenimage(Window*, Memimage*);
3130 void setlabel(Window*, char*);
3231
3332 /* Ixp */
devwsys/x11/alloc.c+1−1
@@ -117,5 +117,5 @@ xfreememimage(Memimage *m) · 116 unmodified lines
117117 free(xm);
118118 m->X = nil;
119119 }
120− freememimage(m);
120+ // XXX _freememimage(m);
121121 }
devwsys/x11/event.c+1−1
@@ -89,7 +89,7 @@ configevent(Window *w, XEvent xev) · 88 unmodified lines
8989 w->screenr = Rect(rx, ry, rx+xe->width, ry+xe->height);
9090 }
9191
92− if(xe->width == Dx(w->screenr) && xe->height == Dy(w->screenr))
92+ if(xe->width == Dx(xconn.screenrect) && xe->height == Dy(xconn.screenrect))
9393 return;
9494 r = Rect(0, 0, xe->width, xe->height);
9595
devwsys/x11/window.c+1−1
@@ -74,7 +74,7 @@ xreplacescreenimage(Window *w) · 73 unmodified lines
7474 XFreePixmap(xconn.display, xw->nextscreenpm);
7575 xw->nextscreenpm = pixmap;
7676 w->screenr = r;
77− drawreplacescreenimage(w, m);
77+ drawreplacescreenimage(&w->draw, m);
7878 return 1;
7979 }
8080