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
236236 void
237237 drawflush(Draw *d)
238238 {
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);
241239 if(d->flushrect.min.x < d->flushrect.max.x)
242240 xflushmemscreen(d->window, d->flushrect);
243241 d->flushrect = Rect(10000, 10000, -10000, -10000);
@@ -258,13 +256,11 @@ drawlookupname(int n, char *str) · 14 unmodified lines
258256 {
259257 DName *name, *ename;
260258
261− // print("XXX drawlookupname %d %s\n", n, str);
262259 name = dname;
263260 ename = &name[ndname];
264261 for(; name<ename; name++)
265262 if(drawcmp(name->name, str, n) == 0)
266263 return name;
267− // print("XXX drawlookupname: %s not found\n", str);
268264 return 0;
269265 }
270266
@@ -293,7 +289,6 @@ drawlookup(Client *client, int id, int checkname) · 22 unmodified lines
293289 {
294290 DImage *d;
295291
296− // print("XXX drawlookup %d in client %p\n", id, client);
297292 d = client->dimage[id&HASHMASK];
298293 while(d){
299294 if(d->id == id){
@@ -365,7 +360,6 @@ drawinstall(Client *client, int id, Memimage *i, DScreen *dscreen) · 65 unmodified lines
365360 {
366361 DImage *d;
367362
368− // print("XXX drawinstall %d (%p) in window %d\n", id, i, client->draw->window->id);
369363 d = allocdimage(i);
370364 if(d == 0)
371365 return 0;
@@ -383,7 +377,6 @@ drawinstallscreen(Client *client, DScreen *d, int id, DImage *dimage, DImage *df · 11 unmodified lines
383377 Memscreen *s;
384378 CScreen *c;
385379
386− // print("XXX drawinstallscreen %d in window %d\n", id, client->draw->window->id);
387380 c = malloc(sizeof(CScreen));
388381 if(dimage && dimage->image && dimage->image->chan == 0)
389382 fatal("bad image %p in drawinstallscreen", dimage->image);
@@ -435,7 +428,6 @@ drawdelname(DName *name) · 45 unmodified lines
435428 {
436429 int i;
437430
438− // print("XXX drawdelname %s\n", dname->name);
439431 i = name-dname;
440432 memmove(name, name+1, (ndname-(i+1))*sizeof(DName));
441433 ndname--;
@@ -448,7 +440,6 @@ drawfreedscreen(Draw *d, DScreen *this) · 6 unmodified lines
448440 DScreen *ds, *next;
449441
450442 this->ref--;
451− // print("XXX drawfreedscreen %d from window %d (ref %d)\n", this->id, d->window->id, this->ref);
452443 if(this->ref < 0)
453444 fprint(2, "negative ref in drawfreedscreen\n");
454445 if(this->ref > 0)
@@ -468,7 +459,7 @@ drawfreedscreen(Draw *d, DScreen *this) · 13 unmodified lines
468459 /* BUG: error(Enodrawimage); */
469460 return;
470461
471− Found:
462+Found:
472463 if(this->dimage)
473464 drawfreedimage(d, this->dimage);
474465 if(this->dfill)
@@ -486,7 +477,6 @@ drawfreedimage(Draw *d, DImage *dimage) · 11 unmodified lines
486477 DScreen *ds;
487478
488479 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);
490480 if(dimage->ref < 0)
491481 fprint(2, "negative ref in drawfreedimage\n");
492482 if(dimage->ref > 0)
@@ -537,7 +527,6 @@ drawuninstallscreen(Client *client, CScreen *this) · 44 unmodified lines
537527 {
538528 CScreen *cs, *next;
539529
540− // print("XXX drawuninstallscreen %d from window %d\n", this->dscreen->id, client->draw->window->id);
541530 cs = client->cscreen;
542531 if(cs == this){
543532 client->cscreen = this->next;
@@ -567,7 +556,6 @@ drawuninstall(Client *client, int id) · 23 unmodified lines
567556 return -1; /* BUG: error(Enodrawimage); */
568557 if(d->id == id){
569558 client->dimage[id&HASHMASK] = d->next;
570− // print("XXX drawuninstall %d from client %d\n", id, client->draw->window->id);
571559 drawfreedimage(client->draw, d);
572560 return 0;
573561 }
@@ -589,7 +577,6 @@ drawaddname(Client *client, DImage *di, int n, char *str, char **err) · 15 unmodified lines
589577 DName *name, *ename, *new, *t;
590578 char *ns;
591579
592− // print("XXX drawaddname %s\n", str);
593580 name = dname;
594581 ename = &name[ndname];
595582 for(; name<ename; name++)
@@ -671,7 +658,6 @@ drawimage(Client *client, uchar *a) · 75 unmodified lines
671658 {
672659 DImage *d;
673660
674− // print("XXX drawimage %d\n", BGLONG(a));
675661 d = drawlookup(client, BGLONG(a), 1);
676662 if(d == nil)
677663 return nil; /* caller must check! */
@@ -850,7 +836,7 @@ drawread(Client *cl, int type, char *data, int count) · 172 unmodified lines
850836 IOResponse r;
851837
852838 r.data = data;
853− r.count = count;
839+ r.count = 0;
854840 r.err = nil;
855841 switch(type) {
856842 case FsFCtl:
@@ -873,12 +859,14 @@ drawread(Client *cl, int type, char *data, int count) · 16 unmodified lines
873859 if(count == -1) {
874860 free(cl->readdata);
875861 cl->readdata = nil;
862+ cl->nreaddata = 0;
876863 return r;
877864 }
878865 if(count < cl->nreaddata) {
879866 r.err = Eshortread;
880867 return r;
881868 }
869+ r.data = cl->readdata;
882870 r.count = cl->nreaddata;
883871 break;
884872 case FsFColormap:
@@ -1145,6 +1133,9 @@ drawmesg(Client *client, void *av, int n) · 260 unmodified lines
11451133 dst = drawimage(client, a+1);
11461134 src = drawimage(client, a+5);
11471135 mask = drawimage(client, a+9);
1136+ /*
1137+ * TODO: this test fails on rio windows.
1138+ */
11481139 if(!dst || !src || !mask)
11491140 goto Enodrawimage;
11501141 drawrectangle(&r, a+13);
@@ -1800,19 +1791,21 @@ drawwrite(Client *cl, int type, char *data, int count) · 649 unmodified lines
18001791 IOResponse r;
18011792
18021793 r.data = data;
1803− r.count = count;
1794+ r.count = 0;
18041795 r.err = nil;
18051796 switch(type) {
18061797 case FsFData:
18071798 drawmesg(cl,data, count);
1799+ r.count = count;
18081800 // drawwakeall();
18091801 break;
18101802 case FsFCtl:
1811− if(r.count != 4){
1803+ if(count != 4){
18121804 r.err = "unknown draw control request";
18131805 break;
18141806 }
18151807 cl->infoid = BGLONG((uchar*)data);
1808+ r.count = count;
18161809 break;
18171810 case FsFColormap:
18181811 r.count = 0;
@@ -1931,8 +1924,15 @@ drawdettach(Draw *d) · 112 unmodified lines
19311924 freememimage(d->window->screenimage);
19321925 free(d->window->name);
19331926 d->window->name = nil;
1934− drawfreedscreen(d, d->dscreen);
1935− free(d);
1927+ if(d->dscreen)
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);
19361936 }
19371937
19381938 Window*
devwsys/ixp_fsys.c+15−6
@@ -254,6 +254,7 @@ fs_attach(Ixp9Req *r) { · 253 unmodified lines
254254
255255 void
256256 fs_open(Ixp9Req *r) {
257+ const char *err;
257258 IxpFileId *f;
258259 Window *w;
259260 Client *cl;
@@ -282,10 +283,13 @@ fs_open(Ixp9Req *r) { · 22 unmodified lines
282283 f->tab.type = FsFCtl;
283284 }
284285 }
285− if(!iswindow(f->tab.type) || f->tab.type == FsFNew){
286+ if(!iswindow(f->tab.type)){
286287 cl = f->p.client;
287− ixp_respond(r, drawopen(cl, f->tab.type));
288− return;
288+ err = drawopen(cl, f->tab.type);
289+ if(err != nil){
290+ ixp_respond(r, err);
291+ return;
292+ }
289293 }
290294 w = f->p.window;
291295 switch(f->tab.type) {
@@ -370,8 +374,11 @@ fs_read(Ixp9Req *r) { · 78 unmodified lines
370374 ixp_respond(r, rread.err);
371375 return;
372376 }
373− ixp_srv_readbuf(r, rread.data, rread.count);
374− if(f->tab.type = FsFData)
377+ if(f->tab.type == FsFRefresh && rread.count == 0)
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)
375382 drawread(cl, FsFData, nil, -1); /* clear cl->readdata */
376383 ixp_respond(r, nil);
377384 return;
@@ -478,12 +485,14 @@ fs_write(Ixp9Req *r) { · 100 unmodified lines
478485 }
479486
480487 if(!iswindow(f->tab.type)) {
488+ if(f->tab.type == FsFRefresh)
489+ return;
481490 rwrite = drawwrite(cl, f->tab.type, r->ifcall.twrite.data, r->ifcall.io.count);
491+ r->ofcall.rwrite.count = rwrite.count;
482492 if(rwrite.err != nil){
483493 ixp_respond(r, rwrite.err);
484494 return;
485495 }
486− r->ofcall.rwrite.count = rwrite.count;
487496 ixp_respond(r, nil);
488497 return;
489498 }
devwsys/window.c+5−2
@@ -102,7 +102,6 @@ deletewin(Window *w) · 101 unmodified lines
102102 {
103103 int i;
104104
105− // XXX TODO: free draw.
106105 for(i = 0; i < nwindow; i++){
107106 if(window[i] == w)
108107 break;
@@ -111,7 +110,11 @@ deletewin(Window *w) · 2 unmodified lines
111110 return;
112111 xdeletewin(w);
113112 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;
115118 w->x = nil;
116119 w->deleted++;
117120 --nwindow;
devwsys/x11/event.c+1−1
@@ -38,7 +38,7 @@ NextEvent: · 37 unmodified lines
3838 if(xw && xw->drawable == xev.xany.window)
3939 break;
4040 }
41− if(i == nwindow){
41+ if(i == nwindow || window[i]->deleted){
4242 if(XPending(xconn.display))
4343 goto NextEvent;
4444 // 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
361361 {
362362 Xwin *xw;
363363
364− // print("XXX xflushmemscreen\n");
365364 xw = w->x;
366365 if(xw->nextscreenpm != xw->screenpm){
367366 // 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