History

devdraw bugs

yiyus committed 15 years ago

Commit 650dbbe1 parent 570703e5 files · +41 −30Browse files

Unified · Split

5 files
  1. devwsys/devdraw.c +20 −20
  2. devwsys/ixp_fsys.c +15 −6
  3. devwsys/window.c +5 −2
  4. devwsys/x11/event.c +1 −1
  5. devwsys/x11/window.c +0 −1
devwsys/devdraw.c+20−20
@@ -236,8 +236,6 @@ static · 235 unmodified lines
236void236void
237drawflush(Draw *d)237drawflush(Draw *d)
238{238{
239 // Rectangle r = d->flushrect;
240 // print("XXX drawflush: %d %d %d %d \n", r.min.x, r.min.y, r.max.x, r.max.y);
241 if(d->flushrect.min.x < d->flushrect.max.x)239 if(d->flushrect.min.x < d->flushrect.max.x)
242 xflushmemscreen(d->window, d->flushrect);240 xflushmemscreen(d->window, d->flushrect);
243 d->flushrect = Rect(10000, 10000, -10000, -10000);241 d->flushrect = Rect(10000, 10000, -10000, -10000);
@@ -258,13 +256,11 @@ drawlookupname(int n, char *str) · 14 unmodified lines
258{256{
259 DName *name, *ename;257 DName *name, *ename;
260 258
261 // print("XXX drawlookupname %d %s\n", n, str);
262 name = dname;259 name = dname;
263 ename = &name[ndname];260 ename = &name[ndname];
264 for(; name<ename; name++)261 for(; name<ename; name++)
265 if(drawcmp(name->name, str, n) == 0)262 if(drawcmp(name->name, str, n) == 0)
266 return name;263 return name;
267 // print("XXX drawlookupname: %s not found\n", str);
268 return 0;264 return 0;
269}265}
270 266
@@ -293,7 +289,6 @@ drawlookup(Client *client, int id, int checkname) · 22 unmodified lines
293{289{
294 DImage *d;290 DImage *d;
295 291
296 // print("XXX drawlookup %d in client %p\n", id, client);
297 d = client->dimage[id&HASHMASK];292 d = client->dimage[id&HASHMASK];
298 while(d){293 while(d){
299 if(d->id == id){294 if(d->id == id){
@@ -365,7 +360,6 @@ drawinstall(Client *client, int id, Memimage *i, DScreen *dscreen) · 65 unmodified lines
365{360{
366 DImage *d;361 DImage *d;
367 362
368 // print("XXX drawinstall %d (%p) in window %d\n", id, i, client->draw->window->id);
369 d = allocdimage(i);363 d = allocdimage(i);
370 if(d == 0)364 if(d == 0)
371 return 0;365 return 0;
@@ -383,7 +377,6 @@ drawinstallscreen(Client *client, DScreen *d, int id, DImage *dimage, DImage *df · 11 unmodified lines
383 Memscreen *s;377 Memscreen *s;
384 CScreen *c;378 CScreen *c;
385 379
386 // print("XXX drawinstallscreen %d in window %d\n", id, client->draw->window->id);
387 c = malloc(sizeof(CScreen));380 c = malloc(sizeof(CScreen));
388 if(dimage && dimage->image && dimage->image->chan == 0)381 if(dimage && dimage->image && dimage->image->chan == 0)
389 fatal("bad image %p in drawinstallscreen", dimage->image);382 fatal("bad image %p in drawinstallscreen", dimage->image);
@@ -435,7 +428,6 @@ drawdelname(DName *name) · 45 unmodified lines
435{428{
436 int i;429 int i;
437 430
438 // print("XXX drawdelname %s\n", dname->name);
439 i = name-dname;431 i = name-dname;
440 memmove(name, name+1, (ndname-(i+1))*sizeof(DName));432 memmove(name, name+1, (ndname-(i+1))*sizeof(DName));
441 ndname--;433 ndname--;
@@ -448,7 +440,6 @@ drawfreedscreen(Draw *d, DScreen *this) · 6 unmodified lines
448 DScreen *ds, *next;440 DScreen *ds, *next;
449 441
450 this->ref--;442 this->ref--;
451 // print("XXX drawfreedscreen %d from window %d (ref %d)\n", this->id, d->window->id, this->ref);
452 if(this->ref < 0)443 if(this->ref < 0)
453 fprint(2, "negative ref in drawfreedscreen\n");444 fprint(2, "negative ref in drawfreedscreen\n");
454 if(this->ref > 0)445 if(this->ref > 0)
@@ -468,7 +459,7 @@ drawfreedscreen(Draw *d, DScreen *this) · 13 unmodified lines
468 /* BUG: error(Enodrawimage); */459 /* BUG: error(Enodrawimage); */
469 return;460 return;
470 461
471 Found:462Found:
472 if(this->dimage)463 if(this->dimage)
473 drawfreedimage(d, this->dimage);464 drawfreedimage(d, this->dimage);
474 if(this->dfill)465 if(this->dfill)
@@ -486,7 +477,6 @@ drawfreedimage(Draw *d, DImage *dimage) · 11 unmodified lines
486 DScreen *ds;477 DScreen *ds;
487 478
488 dimage->ref--;479 dimage->ref--;
489 // print("XXX drawfreedimage %d (%p) from window %d (ref %d) with image (%p)\n", dimage->id, dimage, d->window->id, dimage->ref, dimage->image);
490 if(dimage->ref < 0)480 if(dimage->ref < 0)
491 fprint(2, "negative ref in drawfreedimage\n");481 fprint(2, "negative ref in drawfreedimage\n");
492 if(dimage->ref > 0)482 if(dimage->ref > 0)
@@ -537,7 +527,6 @@ drawuninstallscreen(Client *client, CScreen *this) · 44 unmodified lines
537{527{
538 CScreen *cs, *next;528 CScreen *cs, *next;
539 529
540 // print("XXX drawuninstallscreen %d from window %d\n", this->dscreen->id, client->draw->window->id);
541 cs = client->cscreen;530 cs = client->cscreen;
542 if(cs == this){531 if(cs == this){
543 client->cscreen = this->next;532 client->cscreen = this->next;
@@ -567,7 +556,6 @@ drawuninstall(Client *client, int id) · 23 unmodified lines
567 return -1; /* BUG: error(Enodrawimage); */556 return -1; /* BUG: error(Enodrawimage); */
568 if(d->id == id){557 if(d->id == id){
569 client->dimage[id&HASHMASK] = d->next;558 client->dimage[id&HASHMASK] = d->next;
570 // print("XXX drawuninstall %d from client %d\n", id, client->draw->window->id);
571 drawfreedimage(client->draw, d);559 drawfreedimage(client->draw, d);
572 return 0;560 return 0;
573 }561 }
@@ -589,7 +577,6 @@ drawaddname(Client *client, DImage *di, int n, char *str, char **err) · 15 unmodified lines
589 DName *name, *ename, *new, *t;577 DName *name, *ename, *new, *t;
590 char *ns;578 char *ns;
591 579
592 // print("XXX drawaddname %s\n", str);
593 name = dname;580 name = dname;
594 ename = &name[ndname];581 ename = &name[ndname];
595 for(; name<ename; name++)582 for(; name<ename; name++)
@@ -671,7 +658,6 @@ drawimage(Client *client, uchar *a) · 75 unmodified lines
671{658{
672 DImage *d;659 DImage *d;
673 660
674 // print("XXX drawimage %d\n", BGLONG(a));
675 d = drawlookup(client, BGLONG(a), 1);661 d = drawlookup(client, BGLONG(a), 1);
676 if(d == nil)662 if(d == nil)
677 return nil; /* caller must check! */663 return nil; /* caller must check! */
@@ -850,7 +836,7 @@ drawread(Client *cl, int type, char *data, int count) · 172 unmodified lines
850 IOResponse r;836 IOResponse r;
851 837
852 r.data = data;838 r.data = data;
853 r.count = count;839 r.count = 0;
854 r.err = nil;840 r.err = nil;
855 switch(type) {841 switch(type) {
856 case FsFCtl:842 case FsFCtl:
@@ -873,12 +859,14 @@ drawread(Client *cl, int type, char *data, int count) · 16 unmodified lines
873 if(count == -1) {859 if(count == -1) {
874 free(cl->readdata);860 free(cl->readdata);
875 cl->readdata = nil;861 cl->readdata = nil;
862 cl->nreaddata = 0;
876 return r;863 return r;
877 }864 }
878 if(count < cl->nreaddata) {865 if(count < cl->nreaddata) {
879 r.err = Eshortread;866 r.err = Eshortread;
880 return r;867 return r;
881 }868 }
869 r.data = cl->readdata;
882 r.count = cl->nreaddata;870 r.count = cl->nreaddata;
883 break;871 break;
884 case FsFColormap:872 case FsFColormap:
@@ -1145,6 +1133,9 @@ drawmesg(Client *client, void *av, int n) · 260 unmodified lines
1145 dst = drawimage(client, a+1);1133 dst = drawimage(client, a+1);
1146 src = drawimage(client, a+5);1134 src = drawimage(client, a+5);
1147 mask = drawimage(client, a+9);1135 mask = drawimage(client, a+9);
1136 /*
1137 * TODO: this test fails on rio windows.
1138 */
1148 if(!dst || !src || !mask)1139 if(!dst || !src || !mask)
1149 goto Enodrawimage;1140 goto Enodrawimage;
1150 drawrectangle(&r, a+13);1141 drawrectangle(&r, a+13);
@@ -1800,19 +1791,21 @@ drawwrite(Client *cl, int type, char *data, int count) · 649 unmodified lines
1800 IOResponse r;1791 IOResponse r;
1801 1792
1802 r.data = data;1793 r.data = data;
1803 r.count = count;1794 r.count = 0;
1804 r.err = nil;1795 r.err = nil;
1805 switch(type) {1796 switch(type) {
1806 case FsFData:1797 case FsFData:
1807 drawmesg(cl,data, count);1798 drawmesg(cl,data, count);
1799 r.count = count;
1808 // drawwakeall();1800 // drawwakeall();
1809 break;1801 break;
1810 case FsFCtl:1802 case FsFCtl:
1811 if(r.count != 4){1803 if(count != 4){
1812 r.err = "unknown draw control request";1804 r.err = "unknown draw control request";
1813 break;1805 break;
1814 }1806 }
1815 cl->infoid = BGLONG((uchar*)data);1807 cl->infoid = BGLONG((uchar*)data);
1808 r.count = count;
1816 break;1809 break;
1817 case FsFColormap:1810 case FsFColormap:
1818 r.count = 0;1811 r.count = 0;
@@ -1931,8 +1924,15 @@ drawdettach(Draw *d) · 112 unmodified lines
1931 freememimage(d->window->screenimage);1924 freememimage(d->window->screenimage);
1932 free(d->window->name);1925 free(d->window->name);
1933 d->window->name = nil;1926 d->window->name = nil;
1934 drawfreedscreen(d, d->dscreen);1927 if(d->dscreen)
1935 free(d);1928 drawfreedscreen(d, d->dscreen);
1929 /*
1930 * TODO: we cannot free d because it is needed
1931 * to get the window from a client, and the structures
1932 * of the drawing device will be freed after the
1933 * window has been deleted.
1934 */
1935 // free(d);
1936}1936}
1937 1937
1938Window*1938Window*
devwsys/ixp_fsys.c+15−6
@@ -254,6 +254,7 @@ fs_attach(Ixp9Req *r) { · 253 unmodified lines
254 254
255void255void
256fs_open(Ixp9Req *r) {256fs_open(Ixp9Req *r) {
257 const char *err;
257 IxpFileId *f;258 IxpFileId *f;
258 Window *w;259 Window *w;
259 Client *cl;260 Client *cl;
@@ -282,10 +283,13 @@ fs_open(Ixp9Req *r) { · 22 unmodified lines
282 f->tab.type = FsFCtl;283 f->tab.type = FsFCtl;
283 }284 }
284 }285 }
285 if(!iswindow(f->tab.type) || f->tab.type == FsFNew){286 if(!iswindow(f->tab.type)){
286 cl = f->p.client;287 cl = f->p.client;
287 ixp_respond(r, drawopen(cl, f->tab.type));288 err = drawopen(cl, f->tab.type);
288 return;289 if(err != nil){
290 ixp_respond(r, err);
291 return;
292 }
289 }293 }
290 w = f->p.window;294 w = f->p.window;
291 switch(f->tab.type) {295 switch(f->tab.type) {
@@ -370,8 +374,11 @@ fs_read(Ixp9Req *r) { · 78 unmodified lines
370 ixp_respond(r, rread.err);374 ixp_respond(r, rread.err);
371 return;375 return;
372 }376 }
373 ixp_srv_readbuf(r, rread.data, rread.count);377 if(f->tab.type == FsFRefresh && rread.count == 0)
374 if(f->tab.type = FsFData)378 return;
379 if(f->tab.type == FsFCtl || f->tab.type == FsFData || f->tab.type == FsFRefresh)
380 ixp_srv_readbuf(r, rread.data, rread.count);
381 if(f->tab.type == FsFData)
375 drawread(cl, FsFData, nil, -1); /* clear cl->readdata */382 drawread(cl, FsFData, nil, -1); /* clear cl->readdata */
376 ixp_respond(r, nil);383 ixp_respond(r, nil);
377 return;384 return;
@@ -478,12 +485,14 @@ fs_write(Ixp9Req *r) { · 100 unmodified lines
478 }485 }
479 486
480 if(!iswindow(f->tab.type)) {487 if(!iswindow(f->tab.type)) {
488 if(f->tab.type == FsFRefresh)
489 return;
481 rwrite = drawwrite(cl, f->tab.type, r->ifcall.twrite.data, r->ifcall.io.count);490 rwrite = drawwrite(cl, f->tab.type, r->ifcall.twrite.data, r->ifcall.io.count);
491 r->ofcall.rwrite.count = rwrite.count;
482 if(rwrite.err != nil){492 if(rwrite.err != nil){
483 ixp_respond(r, rwrite.err);493 ixp_respond(r, rwrite.err);
484 return;494 return;
485 }495 }
486 r->ofcall.rwrite.count = rwrite.count;
487 ixp_respond(r, nil);496 ixp_respond(r, nil);
488 return;497 return;
489 }498 }
devwsys/window.c+5−2
@@ -102,7 +102,6 @@ deletewin(Window *w) · 101 unmodified lines
102{102{
103 int i;103 int i;
104 104
105 // XXX TODO: free draw.
106 for(i = 0; i < nwindow; i++){105 for(i = 0; i < nwindow; i++){
107 if(window[i] == w)106 if(window[i] == w)
108 break;107 break;
@@ -111,7 +110,11 @@ deletewin(Window *w) · 2 unmodified lines
111 return;110 return;
112 xdeletewin(w);111 xdeletewin(w);
113 drawdettach(w->draw);112 drawdettach(w->draw);
114 w->draw = nil;113 /*
114 * TODO
115 * Do not free w->draw (see devdraw.c:1927)
116 */
117 // w->draw = nil;
115 w->x = nil;118 w->x = nil;
116 w->deleted++;119 w->deleted++;
117 --nwindow;120 --nwindow;
devwsys/x11/event.c+1−1
@@ -38,7 +38,7 @@ NextEvent: · 37 unmodified lines
38 if(xw && xw->drawable == xev.xany.window)38 if(xw && xw->drawable == xev.xany.window)
39 break;39 break;
40 }40 }
41 if(i == nwindow){41 if(i == nwindow || window[i]->deleted){
42 if(XPending(xconn.display))42 if(XPending(xconn.display))
43 goto NextEvent;43 goto NextEvent;
44 // print("XXX event received in wrong window\n");44 // print("XXX event received in wrong window\n");
devwsys/x11/window.c+0−1
@@ -361,7 +361,6 @@ xflushmemscreen(Window *w, Rectangle r) · 360 unmodified lines
361{361{
362 Xwin *xw;362 Xwin *xw;
363 363
364 // print("XXX xflushmemscreen\n");
365 xw = w->x;364 xw = w->x;
366 if(xw->nextscreenpm != xw->screenpm){365 if(xw->nextscreenpm != xw->screenpm){
367 // qlock(&xw->screenlock);366 // qlock(&xw->screenlock);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t