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
393 goto Return;393 goto Return;
394 }394 }
395 ds = dimage->dscreen;395 ds = dimage->dscreen;
396 l = dimage->image;
397 dimage->dscreen = nil; /* paranoia */
398 dimage->image = nil;
396 if(ds){399 if(ds){
397 l = dimage->image;400 // XXX TODO: this should not happen:
401 if(l->layer == nil) return;
398 if(l->data == d->screenimage->data)402 if(l->data == d->screenimage->data)
399 dstflush(d, l->layer->screen->image, l->layer->screenr);403 addflush(d, l->layer->screenr);
400 if(l->layer->refreshfn == drawrefresh) /* else true owner will clean up */404 if(l->layer->refreshfn == drawrefresh) /* else true owner will clean up */
401 free(l->layer->refreshptr);405 free(l->layer->refreshptr);
402 l->layer->refreshptr = nil;406 l->layer->refreshptr = nil;
@@ -409,7 +413,7 @@ drawfreedimage(Draw *d, DImage *dimage) · 6 unmodified lines
409 // XXX TODO413 // XXX TODO
410 // inferno-os/emu/port/devdraw.c:652414 // inferno-os/emu/port/devdraw.c:652
411 // plan9port/src/cmd/devdraw/devdraw.c:566,569415 // plan9port/src/cmd/devdraw/devdraw.c:566,569
412 freememimage(dimage->image);416 freememimage(l);
413 }417 }
414 Return:418 Return:
415 free(dimage->fchar);419 free(dimage->fchar);
@@ -1589,32 +1593,58 @@ error: · 1173 unmodified lines
1589 */1593 */
1590 1594
1591void1595void
1592drawreplacescreenimage(Window *w, Memimage *m)1596drawreplacescreenimage(Draw *d, Memimage *m)
1593{1597{
1598 int i;
1599 DImage *di;
1600
1601 if(d->screendimage == nil)
1602 return;
1603
1594 /*1604 /*
1595 * Replace the screen image because the screen1605 * Replace the screen image because the screen
1596 * was resized.1606 * was resized. Clients still have references to the
1597 * 1607 * old screen image, so we can't free it just yet.
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.
1605 */1608 */
1606 Memimage *om;1609 // drawqlock();
1607 Memimage *screenimage;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 }
1608 1626
1609 screenimage = w->draw.screenimage;1627 drawfreedimage(d, d->screendimage);
1610 // qlock(&sdraw.lk);1628 d->screendimage = di;
1611 om = screenimage;1629 d->screenimage = m;
1612 w->draw.screenimage = m;1630
1613 // m->screenref = 1;1631 /*
1614 // if(om && --om->screenref == 0){1632 * Every client, when it starts, gets a copy of the
1615 // freememimage(om);1633 * screen image as image 0. Clients only use it
1616 // }1634 * for drawing if there is no /dev/winname, but
1617 // qunlock(&sdraw.lk);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();
1618}1648}
1619 1649
1620void1650void
devwsys/fns.h+1−2
@@ -9,7 +9,7 @@ int drawattach(Window*, char*); · 8 unmodified lines
9int readdrawctl(char*, Client*);9int readdrawctl(char*, Client*);
10int readrefresh(char*, long, Client*);10int readrefresh(char*, long, Client*);
11int drawmesg(Client*, void*, int);11int drawmesg(Client*, void*, int);
12char* drawerr(void);12void drawreplacescreenimage(Draw*, Memimage*);
13 13
14/* Keyboard */14/* Keyboard */
15void writekbd(Window*, int);15void writekbd(Window*, int);
@@ -27,7 +27,6 @@ void* nextreq(Reqbuf *reqs); · 11 unmodified lines
27void deletewin(Window*);27void deletewin(Window*);
28Window* newwin(char*, char*);28Window* newwin(char*, char*);
29int parsewinsize(char*, Rectangle*, int*);29int parsewinsize(char*, Rectangle*, int*);
30void drawreplacescreenimage(Window*, Memimage*);
31void setlabel(Window*, char*);30void setlabel(Window*, char*);
32 31
33/* Ixp */32/* Ixp */
devwsys/x11/alloc.c+1−1
@@ -117,5 +117,5 @@ xfreememimage(Memimage *m) · 116 unmodified lines
117 free(xm);117 free(xm);
118 m->X = nil;118 m->X = nil;
119 }119 }
120 freememimage(m);120 // XXX _freememimage(m);
121}121}
devwsys/x11/event.c+1−1
@@ -89,7 +89,7 @@ configevent(Window *w, XEvent xev) · 88 unmodified lines
89 w->screenr = Rect(rx, ry, rx+xe->width, ry+xe->height);89 w->screenr = Rect(rx, ry, rx+xe->width, ry+xe->height);
90 }90 }
91 91
92 if(xe->width == Dx(w->screenr) && xe->height == Dy(w->screenr))92 if(xe->width == Dx(xconn.screenrect) && xe->height == Dy(xconn.screenrect))
93 return;93 return;
94 r = Rect(0, 0, xe->width, xe->height);94 r = Rect(0, 0, xe->width, xe->height);
95 95
devwsys/x11/window.c+1−1
@@ -74,7 +74,7 @@ xreplacescreenimage(Window *w) · 73 unmodified lines
74 XFreePixmap(xconn.display, xw->nextscreenpm);74 XFreePixmap(xconn.display, xw->nextscreenpm);
75 xw->nextscreenpm = pixmap;75 xw->nextscreenpm = pixmap;
76 w->screenr = r;76 w->screenr = r;
77 drawreplacescreenimage(w, m);77 drawreplacescreenimage(&w->draw, m);
78 return 1;78 return 1;
79}79}
80 80