devdraw: add F11 for full-screen toggle
This commit is contained in:
parent
54dd92bebc
commit
35288690ce
6 changed files with 78 additions and 7 deletions
|
|
@ -294,11 +294,18 @@ static
|
||||||
void
|
void
|
||||||
drawflush(void)
|
drawflush(void)
|
||||||
{
|
{
|
||||||
if(flushrect.min.x < flushrect.max.x)
|
_flushmemscreen(flushrect);
|
||||||
_flushmemscreen(flushrect);
|
|
||||||
flushrect = Rect(10000, 10000, -10000, -10000);
|
flushrect = Rect(10000, 10000, -10000, -10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
xdrawflush(void)
|
||||||
|
{
|
||||||
|
qlock(&sdraw.lk);
|
||||||
|
drawflush();
|
||||||
|
qunlock(&sdraw.lk);
|
||||||
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
int
|
int
|
||||||
drawcmp(char *a, char *b, int n)
|
drawcmp(char *a, char *b, int n)
|
||||||
|
|
@ -791,7 +798,7 @@ _drawmsgwrite(void *v, int n)
|
||||||
|
|
||||||
while((n-=m) > 0){
|
while((n-=m) > 0){
|
||||||
a += m;
|
a += m;
|
||||||
/*fprint(2, "msgwrite %d(%d)...", n, *a); */
|
/* print("msgwrite %d(%c)...", n, *a); */
|
||||||
switch(*a){
|
switch(*a){
|
||||||
default:
|
default:
|
||||||
/*fprint(2, "bad command %d\n", *a); */
|
/*fprint(2, "bad command %d\n", *a); */
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,9 @@
|
||||||
#include <X11/keysym.h>
|
#include <X11/keysym.h>
|
||||||
#include <X11/IntrinsicP.h>
|
#include <X11/IntrinsicP.h>
|
||||||
#include <X11/StringDefs.h>
|
#include <X11/StringDefs.h>
|
||||||
|
#ifdef SHOWEVENT
|
||||||
|
#include "../rio/showevent/ShowEvent.c"
|
||||||
|
#endif
|
||||||
|
|
||||||
#undef Colormap
|
#undef Colormap
|
||||||
#undef Cursor
|
#undef Cursor
|
||||||
|
|
|
||||||
|
|
@ -253,6 +253,8 @@ _xattach(char *label, char *winsize)
|
||||||
}
|
}
|
||||||
havemin = 0;
|
havemin = 0;
|
||||||
}
|
}
|
||||||
|
screenrect = Rect(0, 0, WidthOfScreen(xscreen), HeightOfScreen(xscreen));
|
||||||
|
windowrect = r;
|
||||||
|
|
||||||
memset(&attr, 0, sizeof attr);
|
memset(&attr, 0, sizeof attr);
|
||||||
attr.colormap = _x.cmap;
|
attr.colormap = _x.cmap;
|
||||||
|
|
@ -687,9 +689,25 @@ _xconfigure(XEvent *e)
|
||||||
Rectangle r;
|
Rectangle r;
|
||||||
XConfigureEvent *xe = (XConfigureEvent*)e;
|
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))
|
if(xe->width == Dx(_x.screenr) && xe->height == Dy(_x.screenr))
|
||||||
return 0;
|
return 0;
|
||||||
r = Rect(0, 0, xe->width, xe->height);
|
r = Rect(0, 0, xe->width, xe->height);
|
||||||
|
|
||||||
qlock(&_x.screenlock);
|
qlock(&_x.screenlock);
|
||||||
if(_x.screenpm != _x.nextscreenpm){
|
if(_x.screenpm != _x.nextscreenpm){
|
||||||
XCopyArea(_x.display, _x.screenpm, _x.drawable, _x.gccopy, r.min.x, r.min.y,
|
XCopyArea(_x.display, _x.screenpm, _x.drawable, _x.gccopy, r.min.x, r.min.y,
|
||||||
|
|
@ -709,8 +727,6 @@ _xreplacescreenimage(void)
|
||||||
Rectangle r;
|
Rectangle r;
|
||||||
|
|
||||||
r = _x.newscreenr;
|
r = _x.newscreenr;
|
||||||
if(eqrect(_x.screenr, r))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
pixmap = XCreatePixmap(_x.display, _x.drawable, Dx(r), Dy(r), _x.depth);
|
pixmap = XCreatePixmap(_x.display, _x.drawable, Dx(r), Dy(r), _x.depth);
|
||||||
m = _xallocmemimage(r, _x.chan, pixmap);
|
m = _xallocmemimage(r, _x.chan, pixmap);
|
||||||
|
|
|
||||||
|
|
@ -111,3 +111,6 @@ extern int _xreplacescreenimage(void);
|
||||||
Button2MotionMask|\
|
Button2MotionMask|\
|
||||||
Button3MotionMask)
|
Button3MotionMask)
|
||||||
|
|
||||||
|
extern Rectangle screenrect;
|
||||||
|
extern Rectangle windowrect;
|
||||||
|
extern int fullscreen;
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,16 @@
|
||||||
* subtle and quick to anger.
|
* subtle and quick to anger.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// #define SHOWEVENT
|
||||||
|
|
||||||
#include <u.h>
|
#include <u.h>
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#ifdef SHOWEVENT
|
||||||
|
#include <stdio.h>
|
||||||
|
#endif
|
||||||
#include "x11-inc.h"
|
#include "x11-inc.h"
|
||||||
|
|
||||||
#include <libc.h>
|
#include <libc.h>
|
||||||
#include <draw.h>
|
#include <draw.h>
|
||||||
#include <memdraw.h>
|
#include <memdraw.h>
|
||||||
|
|
@ -86,11 +92,15 @@ int fdnoblock(int);
|
||||||
|
|
||||||
int chatty;
|
int chatty;
|
||||||
int drawsleep;
|
int drawsleep;
|
||||||
|
int fullscreen;
|
||||||
|
|
||||||
|
Rectangle windowrect;
|
||||||
|
Rectangle screenrect;
|
||||||
|
|
||||||
void
|
void
|
||||||
usage(void)
|
usage(void)
|
||||||
{
|
{
|
||||||
fprint(2, "usage: devdraw (don't run directly)\n");
|
fprint(2, "usage: devdraw (don't run directly)\n");
|
||||||
exits("usage");
|
exits("usage");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -121,6 +131,9 @@ main(int argc, char **argv)
|
||||||
open("/dev/null", OREAD);
|
open("/dev/null", OREAD);
|
||||||
open("/dev/null", OWRITE);
|
open("/dev/null", OWRITE);
|
||||||
|
|
||||||
|
/* reopens stdout if debugging */
|
||||||
|
runxevent(0);
|
||||||
|
|
||||||
fmtinstall('W', drawfcallfmt);
|
fmtinstall('W', drawfcallfmt);
|
||||||
|
|
||||||
ARGBEGIN{
|
ARGBEGIN{
|
||||||
|
|
@ -271,6 +284,8 @@ replyerror(Wsysmsg *m)
|
||||||
replymsg(m);
|
replymsg(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Handle a single wsysmsg.
|
* Handle a single wsysmsg.
|
||||||
* Might queue for later (kbd, mouse read)
|
* Might queue for later (kbd, mouse read)
|
||||||
|
|
@ -455,8 +470,26 @@ void
|
||||||
runxevent(XEvent *xev)
|
runxevent(XEvent *xev)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
KeySym k;
|
||||||
static Mouse m;
|
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){
|
switch(xev->type){
|
||||||
case Expose:
|
case Expose:
|
||||||
_xexpose(xev);
|
_xexpose(xev);
|
||||||
|
|
@ -500,6 +533,12 @@ runxevent(XEvent *xev)
|
||||||
case KeyPress:
|
case KeyPress:
|
||||||
if(kbd.stall)
|
if(kbd.stall)
|
||||||
return;
|
return;
|
||||||
|
XLookupString((XKeyEvent*)xev, NULL, 0, &k, NULL);
|
||||||
|
if(k == XK_F11){
|
||||||
|
fullscreen = !fullscreen;
|
||||||
|
_xresizewindow(fullscreen ? screenrect : windowrect);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if((c = _xtoplan9kbd(xev)) < 0)
|
if((c = _xtoplan9kbd(xev)) < 0)
|
||||||
return;
|
return;
|
||||||
kbd.r[kbd.wi++] = c;
|
kbd.r[kbd.wi++] = c;
|
||||||
|
|
|
||||||
|
|
@ -21,9 +21,12 @@ _xresizewindow(Rectangle r)
|
||||||
int value_mask;
|
int value_mask;
|
||||||
|
|
||||||
memset(&e, 0, sizeof e);
|
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.width = Dx(r);
|
||||||
e.height = Dy(r);
|
e.height = Dy(r);
|
||||||
XConfigureWindow(_x.display, _x.drawable, value_mask, &e);
|
XConfigureWindow(_x.display, _x.drawable, value_mask, &e);
|
||||||
XFlush(_x.display);
|
XFlush(_x.display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue