From 35288690ce41267ae9c6341e1d73f74c56726297 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 30 Jan 2008 12:01:43 -0500 Subject: devdraw: add F11 for full-screen toggle --- src/cmd/devdraw/devdraw.c | 13 ++++++++++--- src/cmd/devdraw/x11-inc.h | 3 +++ src/cmd/devdraw/x11-init.c | 20 ++++++++++++++++++-- src/cmd/devdraw/x11-memdraw.h | 3 +++ src/cmd/devdraw/x11-srv.c | 41 ++++++++++++++++++++++++++++++++++++++++- src/cmd/devdraw/x11-wsys.c | 5 ++++- 6 files changed, 78 insertions(+), 7 deletions(-) diff --git a/src/cmd/devdraw/devdraw.c b/src/cmd/devdraw/devdraw.c index 0e2226cd..ac69423a 100644 --- a/src/cmd/devdraw/devdraw.c +++ b/src/cmd/devdraw/devdraw.c @@ -294,11 +294,18 @@ static void drawflush(void) { - if(flushrect.min.x < flushrect.max.x) - _flushmemscreen(flushrect); + _flushmemscreen(flushrect); flushrect = Rect(10000, 10000, -10000, -10000); } +void +xdrawflush(void) +{ + qlock(&sdraw.lk); + drawflush(); + qunlock(&sdraw.lk); +} + static int drawcmp(char *a, char *b, int n) @@ -791,7 +798,7 @@ _drawmsgwrite(void *v, int n) while((n-=m) > 0){ a += m; -/*fprint(2, "msgwrite %d(%d)...", n, *a); */ +/* print("msgwrite %d(%c)...", n, *a); */ switch(*a){ default: /*fprint(2, "bad command %d\n", *a); */ diff --git a/src/cmd/devdraw/x11-inc.h b/src/cmd/devdraw/x11-inc.h index 4baf4b1a..5371eacb 100644 --- a/src/cmd/devdraw/x11-inc.h +++ b/src/cmd/devdraw/x11-inc.h @@ -16,6 +16,9 @@ #include #include #include +#ifdef SHOWEVENT +#include "../rio/showevent/ShowEvent.c" +#endif #undef Colormap #undef Cursor diff --git a/src/cmd/devdraw/x11-init.c b/src/cmd/devdraw/x11-init.c index 9ad6054f..4d907493 100644 --- a/src/cmd/devdraw/x11-init.c +++ b/src/cmd/devdraw/x11-init.c @@ -253,6 +253,8 @@ _xattach(char *label, char *winsize) } havemin = 0; } + screenrect = Rect(0, 0, WidthOfScreen(xscreen), HeightOfScreen(xscreen)); + windowrect = r; memset(&attr, 0, sizeof attr); attr.colormap = _x.cmap; @@ -687,9 +689,25 @@ _xconfigure(XEvent *e) Rectangle r; XConfigureEvent *xe = (XConfigureEvent*)e; + if(!fullscreen){ + // I can't figure this out: apparently window managers + // (e.g., rio, twm) send ConfigureEvents using absolute + // screen coordinates, but X sends events using coordinates + // relative to the parent window. + if(xe->send_event) + windowrect = Rect(xe->x, xe->y, xe->x+xe->width, xe->y+xe->height); + else{ + int rx, ry; + XWindow w; + if(XTranslateCoordinates(_x.display, _x.drawable, DefaultRootWindow(_x.display), xe->x, xe->y, &rx, &ry, &w)) + windowrect = Rect(rx, ry, rx+xe->width, ry+xe->height); + } + } + if(xe->width == Dx(_x.screenr) && xe->height == Dy(_x.screenr)) return 0; r = Rect(0, 0, xe->width, xe->height); + qlock(&_x.screenlock); if(_x.screenpm != _x.nextscreenpm){ XCopyArea(_x.display, _x.screenpm, _x.drawable, _x.gccopy, r.min.x, r.min.y, @@ -709,8 +727,6 @@ _xreplacescreenimage(void) Rectangle r; r = _x.newscreenr; - if(eqrect(_x.screenr, r)) - return 0; pixmap = XCreatePixmap(_x.display, _x.drawable, Dx(r), Dy(r), _x.depth); m = _xallocmemimage(r, _x.chan, pixmap); diff --git a/src/cmd/devdraw/x11-memdraw.h b/src/cmd/devdraw/x11-memdraw.h index eba9e0db..a5b40671 100644 --- a/src/cmd/devdraw/x11-memdraw.h +++ b/src/cmd/devdraw/x11-memdraw.h @@ -111,3 +111,6 @@ extern int _xreplacescreenimage(void); Button2MotionMask|\ Button3MotionMask) +extern Rectangle screenrect; +extern Rectangle windowrect; +extern int fullscreen; diff --git a/src/cmd/devdraw/x11-srv.c b/src/cmd/devdraw/x11-srv.c index 7dd3f39b..071cbc76 100644 --- a/src/cmd/devdraw/x11-srv.c +++ b/src/cmd/devdraw/x11-srv.c @@ -5,10 +5,16 @@ * subtle and quick to anger. */ +// #define SHOWEVENT + #include #include #include +#ifdef SHOWEVENT +#include +#endif #include "x11-inc.h" + #include #include #include @@ -86,11 +92,15 @@ int fdnoblock(int); int chatty; int drawsleep; +int fullscreen; + +Rectangle windowrect; +Rectangle screenrect; void usage(void) { - fprint(2, "usage: devdraw (don't run directly)\n"); + fprint(2, "usage: devdraw (don't run directly)\n"); exits("usage"); } @@ -121,6 +131,9 @@ main(int argc, char **argv) open("/dev/null", OREAD); open("/dev/null", OWRITE); + /* reopens stdout if debugging */ + runxevent(0); + fmtinstall('W', drawfcallfmt); ARGBEGIN{ @@ -271,6 +284,8 @@ replyerror(Wsysmsg *m) replymsg(m); } + + /* * Handle a single wsysmsg. * Might queue for later (kbd, mouse read) @@ -455,8 +470,26 @@ void runxevent(XEvent *xev) { int c; + KeySym k; static Mouse m; +#ifdef SHOWEVENT + static int first = 1; + if(first){ + dup(create("/tmp/devdraw.out", OWRITE, 0666), 1); + setbuf(stdout, 0); + first = 0; + } +#endif + + if(xev == 0) + return; + +#ifdef SHOWEVENT + print("\n"); + ShowEvent(xev); +#endif + switch(xev->type){ case Expose: _xexpose(xev); @@ -500,6 +533,12 @@ runxevent(XEvent *xev) case KeyPress: if(kbd.stall) return; + XLookupString((XKeyEvent*)xev, NULL, 0, &k, NULL); + if(k == XK_F11){ + fullscreen = !fullscreen; + _xresizewindow(fullscreen ? screenrect : windowrect); + return; + } if((c = _xtoplan9kbd(xev)) < 0) return; kbd.r[kbd.wi++] = c; diff --git a/src/cmd/devdraw/x11-wsys.c b/src/cmd/devdraw/x11-wsys.c index fcb40fdf..bba7c350 100644 --- a/src/cmd/devdraw/x11-wsys.c +++ b/src/cmd/devdraw/x11-wsys.c @@ -21,9 +21,12 @@ _xresizewindow(Rectangle r) int value_mask; memset(&e, 0, sizeof e); - value_mask = CWWidth|CWHeight; + value_mask = CWX|CWY|CWWidth|CWHeight; + e.x = r.min.x; + e.y = r.min.y; e.width = Dx(r); e.height = Dy(r); XConfigureWindow(_x.display, _x.drawable, value_mask, &e); XFlush(_x.display); } + -- cgit v1.2.3