aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@swtch.com>2008-01-30 12:01:43 -0500
committerRuss Cox <rsc@swtch.com>2008-01-30 12:01:43 -0500
commit35288690ce41267ae9c6341e1d73f74c56726297 (patch)
tree0697bc06f214ab334f48d709bca2b80503995e61
parent54dd92bebc97da7efb955f703c20cac8f4cbbb9f (diff)
downloadplan9port-35288690ce41267ae9c6341e1d73f74c56726297.tar.gz
plan9port-35288690ce41267ae9c6341e1d73f74c56726297.tar.bz2
plan9port-35288690ce41267ae9c6341e1d73f74c56726297.zip
devdraw: add F11 for full-screen toggle
-rw-r--r--src/cmd/devdraw/devdraw.c13
-rw-r--r--src/cmd/devdraw/x11-inc.h3
-rw-r--r--src/cmd/devdraw/x11-init.c20
-rw-r--r--src/cmd/devdraw/x11-memdraw.h3
-rw-r--r--src/cmd/devdraw/x11-srv.c41
-rw-r--r--src/cmd/devdraw/x11-wsys.c5
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 <X11/keysym.h>
#include <X11/IntrinsicP.h>
#include <X11/StringDefs.h>
+#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 <u.h>
#include <sys/select.h>
#include <errno.h>
+#ifdef SHOWEVENT
+#include <stdio.h>
+#endif
#include "x11-inc.h"
+
#include <libc.h>
#include <draw.h>
#include <memdraw.h>
@@ -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);
}
+