commit 2bdefab1da7bc64f433cba5871fc57d5524a06e1 from: rsc date: Wed Jul 05 22:27:26 2006 UTC Fix resize error under KDE (Bart Locanthi) commit - e50b313e64aedca5b2640b92d31bdf9bfccd4b53 commit + 2bdefab1da7bc64f433cba5871fc57d5524a06e1 blob - 6b6dca6e83274c4b3cf227eea002fc78c11e14e3 blob + 0e2226cdf1aafa116be199d138a138f8bc2f2371 --- src/cmd/devdraw/devdraw.c +++ src/cmd/devdraw/devdraw.c @@ -275,7 +275,7 @@ dstflush(int dstid, Memimage *dst, Rectangle r) } /* how can this happen? -rsc, dec 12 2002 */ if(dst == 0){ - print("nil dstflush\n"); + fprint(2, "nil dstflush\n"); return; } l = dst->layer; @@ -430,7 +430,7 @@ drawinstallscreen(Client *client, DScreen *d, int id, c = mallocz(sizeof(CScreen), 1); if(dimage && dimage->image && dimage->image->chan == 0){ - print("bad image %p in drawinstallscreen", dimage->image); + fprint(2, "bad image %p in drawinstallscreen", dimage->image); abort(); } @@ -494,7 +494,7 @@ drawfreedscreen(DScreen *this) this->ref--; if(this->ref < 0) - print("negative ref in drawfreedscreen\n"); + fprint(2, "negative ref in drawfreedscreen\n"); if(this->ref > 0) return; ds = dscreen; @@ -533,7 +533,7 @@ drawfreedimage(DImage *dimage) dimage->ref--; if(dimage->ref < 0) - print("negative ref in drawfreedimage\n"); + fprint(2, "negative ref in drawfreedimage\n"); if(dimage->ref > 0) return; blob - 9820ea2445584353fd58b4047c6c4244c844558f blob + bf1262acb95cb08a255fd37dc71ac08e35291be8 --- src/cmd/devdraw/x11-init.c +++ src/cmd/devdraw/x11-init.c @@ -28,11 +28,18 @@ xerror(XDisplay *d, XErrorEvent *e) return 0; if(e->request_code == 18) /* XChangeProperty */ return 0; + /* + * BadDrawable happens in apps that get resized a LOT, + * e.g. when KDE is configured to resize continuously + * during a window drag. + */ + if(e->error_code == 9) /* BadDrawable */ + return 0; - print("X error: error_code=%d, request_code=%d, minor=%d disp=%p\n", + fprint(2, "X error: error_code=%d, request_code=%d, minor=%d disp=%p\n", e->error_code, e->request_code, e->minor_code, d); XGetErrorText(d, e->error_code, buf, sizeof buf); - print("%s\n", buf); + fprint(2, "%s\n", buf); return 0; } @@ -681,8 +688,6 @@ _xconfigure(XEvent *e) if(xe->width == Dx(_x.screenr) && xe->height == Dy(_x.screenr)) return 0; - if(xe->width==0 || xe->height==0) - fprint(2, "ignoring resize to %dx%d\n", xe->width, xe->height); r = Rect(0, 0, xe->width, xe->height); qlock(&_x.screenlock); if(_x.screenpm != _x.nextscreenpm){ blob - f0b9dc28d5bccfd624caf25ad0bbef9f1f24fd32 blob + 7dd3f39b02a7ce066de0a6035c07ebed94117937 --- src/cmd/devdraw/x11-srv.c +++ src/cmd/devdraw/x11-srv.c @@ -48,10 +48,10 @@ struct Kbdbuf struct Mousebuf { Mouse m[32]; - int resized[32]; int ri; int wi; int stall; + int resized; }; struct Tagbuf @@ -75,7 +75,6 @@ Fdbuf fdin; Fdbuf fdout; Tagbuf kbdtags; Tagbuf mousetags; -Tagbuf resizetags; void fdslide(Fdbuf*); void runmsg(Wsysmsg*); @@ -83,7 +82,6 @@ void replymsg(Wsysmsg*); void runxevent(XEvent*); void matchkbd(void); void matchmouse(void); -void matchresized(void); int fdnoblock(int); int chatty; @@ -112,6 +110,19 @@ main(int argc, char **argv) Wsysmsg m; XEvent event; + /* + * Move the protocol off stdin/stdout so that + * any inadvertent prints don't screw things up. + */ + dup(0, 3); + dup(1, 4); + close(0); + close(1); + open("/dev/null", OREAD); + open("/dev/null", OWRITE); + + fmtinstall('W', drawfcallfmt); + ARGBEGIN{ case 'D': chatty++; @@ -132,8 +143,8 @@ main(int argc, char **argv) fdout.rp = fdout.wp = fdout.buf; fdout.ep = fdout.buf+sizeof fdout.buf; - fdnoblock(0); - fdnoblock(1); + fdnoblock(3); + fdnoblock(4); firstx = 1; _x.fd = -1; @@ -147,12 +158,12 @@ main(int argc, char **argv) * already filled the output buffer too much. */ if(fdout.wp < fdout.buf+MAXWMSG && fdin.wp < fdin.ep) - FD_SET(0, &rd); + FD_SET(3, &rd); if(fdout.wp > fdout.rp) - FD_SET(1, &wr); - FD_SET(0, &xx); - FD_SET(1, &xx); - top = 1; + FD_SET(4, &wr); + FD_SET(3, &xx); + FD_SET(4, &xx); + top = 4; if(_x.fd >= 0){ if(firstx){ firstx = 0; @@ -161,7 +172,8 @@ main(int argc, char **argv) FD_SET(_x.fd, &rd); FD_SET(_x.fd, &xx); XFlush(_x.display); - top = _x.fd; + if(_x.fd > top) + top = _x.fd; } if(chatty) @@ -181,7 +193,7 @@ main(int argc, char **argv) { /* read what we can */ n = 1; - while(fdin.wp < fdin.ep && (n = read(0, fdin.wp, fdin.ep-fdin.wp)) > 0) + while(fdin.wp < fdin.ep && (n = read(3, fdin.wp, fdin.ep-fdin.wp)) > 0) fdin.wp += n; if(n == 0){ if(chatty) @@ -193,6 +205,7 @@ main(int argc, char **argv) /* pick off messages one by one */ while((n = convM2W(fdin.rp, fdin.wp-fdin.rp, &m)) > 0){ + /* fprint(2, "<- %W\n", &m); */ runmsg(&m); fdin.rp += n; } @@ -203,7 +216,7 @@ main(int argc, char **argv) { /* write what we can */ n = 1; - while(fdout.rp < fdout.wp && (n = write(1, fdout.rp, fdout.wp-fdout.rp)) > 0) + while(fdout.rp < fdout.wp && (n = write(4, fdout.rp, fdout.wp-fdout.rp)) > 0) fdout.rp += n; if(n == 0) sysfatal("short write writing wsys"); @@ -283,6 +296,7 @@ runmsg(Wsysmsg *m) mousetags.wi = 0; if(mousetags.wi == mousetags.ri) sysfatal("too many queued mouse reads"); + /* fprint(2, "mouse unstall\n"); */ mouse.stall = 0; matchmouse(); break; @@ -376,6 +390,7 @@ replymsg(Wsysmsg *m) if(m->type%2 == 0) m->type++; + /* fprint(2, "-> %W\n", m); */ /* copy to output buffer */ n = sizeW2M(m); if(fdout.wp+n > fdout.ep) @@ -414,15 +429,18 @@ matchmouse(void) { Wsysmsg m; - if(mouse.stall) - return; while(mouse.ri != mouse.wi && mousetags.ri != mousetags.wi){ m.type = Rrdmouse; m.tag = mousetags.t[mousetags.ri++]; if(mousetags.ri == nelem(mousetags.t)) mousetags.ri = 0; m.mouse = mouse.m[mouse.ri]; - m.resized = mouse.resized[mouse.ri]; + m.resized = mouse.resized; + /* + if(m.resized) + fprint(2, "sending resize\n"); + */ + mouse.resized = 0; mouse.ri++; if(mouse.ri == nelem(mouse.m)) mouse.ri = 0; @@ -451,7 +469,7 @@ runxevent(XEvent *xev) case ConfigureNotify: if(_xconfigure(xev)){ - mouse.resized[mouse.wi] = 1; + mouse.resized = 1; _xreplacescreenimage(); goto addmouse; } @@ -464,14 +482,18 @@ runxevent(XEvent *xev) return; if(_xtoplan9mouse(xev, &m) < 0) return; - mouse.resized[mouse.wi] = 0; addmouse: mouse.m[mouse.wi] = m; mouse.wi++; if(mouse.wi == nelem(mouse.m)) mouse.wi = 0; - if(mouse.wi == mouse.ri) + if(mouse.wi == mouse.ri){ mouse.stall = 1; + mouse.ri = 0; + mouse.wi = 1; + mouse.m[0] = m; + /* fprint(2, "mouse stall\n"); */ + } matchmouse(); break;