grey out 9term when it loses focus.

This commit is contained in:
rsc 2004-03-30 05:03:29 +00:00
parent c005568a7f
commit 4f30f3b444
7 changed files with 112 additions and 26 deletions

View file

@ -1,3 +1,11 @@
March 29, 2004
Add window resizing by dragging borders to rio.
Code from Axel Belinfante.
Added code to make 9term fade itself when it loses
focus running under rio.
March 26, 2004
Fix 9term chording paste bug reported by Sam.

View file

@ -48,6 +48,9 @@ extern void drawgetrect(Rectangle, int);
extern Rectangle getrect(int, Mousectl*);
extern int menuhit(int, Mousectl*, Menu*, Screen*);
extern void bouncemouse(Mouse*);
extern int _windowhasfocus; /* XXX do better */
extern int _wantfocuschanges;
#if defined(__cplusplus)
}

View file

@ -152,6 +152,9 @@ char *menu2str[] = {
Image* cols[NCOL];
Image* hcols[NCOL];
Image* palegrey;
Image* paleblue;
Image* blue;
Image *plumbcolor;
Image *execcolor;
@ -187,6 +190,7 @@ threadmain(int argc, char *argv[])
char *p;
rfork(RFNOTEG);
_wantfocuschanges = 1;
mainpid = getpid();
ARGBEGIN{
default:
@ -236,16 +240,22 @@ threadmain(int argc, char *argv[])
}
cols[TEXT] = display->black;
cols[HTEXT] = display->black;
palegrey = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x666666FF);
hcols[BACK] = cols[BACK];
hcols[HIGH] = cols[HIGH];
hcols[BORD] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DMedblue);
blue = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DMedblue);
paleblue = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DGreyblue);
hcols[BORD] = blue;
hcols[TEXT] = hcols[BORD];
hcols[HTEXT] = hcols[TEXT];
plumbcolor = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x006600FF);
execcolor = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xAA0000FF);
if(!blue || !palegrey || !paleblue || !plumbcolor || !execcolor)
sysfatal("alloc colors: %r");
draw(screen, screen->r, cols[BACK], nil, ZP);
geom();
loop();
@ -365,6 +375,16 @@ geom(void)
Point p;
Rectangle r;
if(!acmecolors){
if(_windowhasfocus){
cols[TEXT] = cols[HTEXT] = display->black;
hcols[TEXT] = hcols[HTEXT] = blue;
}else{
cols[TEXT] = cols[HTEXT] = palegrey;
hcols[TEXT] = hcols[HTEXT] = paleblue;
}
}
r = screen->r;
r.min.y++;
r.max.y--;
@ -1535,7 +1555,7 @@ scrdraw(void)
{
Rectangle r, r1, r2;
static Image *scrx;
r = scrollr;
r.min.x += 1; /* border between margin and bar */
r1 = r;

View file

@ -572,7 +572,7 @@ sendtype(int fd0)
while(ntypebreak){
for(i=0; i<ntypeb; i++)
if(typing[i]=='\n' || typing[i]==0x04){
n = i + (typing[i] == '\n');
n = i+1;
i++;
if(write(fd0, typing, n) != n)
error("sending to program");

View file

@ -188,6 +188,7 @@ xattach(char *label)
XWindow xrootwin;
XWindowAttributes wattr;
XWMHints hint;
Atom atoms[2];
/*
if(XInitThreads() == 0){
@ -335,14 +336,6 @@ xattach(char *label)
&attr /* attributes (the above aren't?!) */
);
if(!XGetWindowAttributes(_x.display, _x.drawable, &wattr))
fprint(2, "XGetWindowAttributes failed\n");
else if(wattr.width && wattr.height){
r.max.x = wattr.width;
r.max.y = wattr.height;
if(0) fprint(2, "new rect %dx%d\n", r.max.x, r.max.y);
}
/*
* Label and other properties required by ICCCCM.
*/
@ -384,6 +377,40 @@ xattach(char *label)
);
XFlush(_x.display);
/*
* Look up clipboard atom.
*/
_x.clipboard = XInternAtom(_x.display, "CLIPBOARD", False);
_x.utf8string = XInternAtom(_x.display, "UTF8_STRING", False);
_x.targets = XInternAtom(_x.display, "TARGETS", False);
_x.text = XInternAtom(_x.display, "TEXT", False);
_x.compoundtext = XInternAtom(_x.display, "COMPOUND_TEXT", False);
_x.takefocus = XInternAtom(_x.display, "WM_TAKE_FOCUS", False);
_x.losefocus = XInternAtom(_x.display, "_9WM_LOSE_FOCUS", False);
_x.wmprotos = XInternAtom(_x.display, "WM_PROTOCOLS", False);
atoms[0] = _x.takefocus;
atoms[1] = _x.losefocus;
XChangeProperty(_x.display, _x.drawable, _x.wmprotos, XA_ATOM, 32,
PropModeReplace, (uchar*)atoms, 2);
/*
* Put the window on the screen, check to see what size we actually got.
*/
XMapWindow(_x.display, _x.drawable);
XSync(_x.display, False);
if(!XGetWindowAttributes(_x.display, _x.drawable, &wattr))
fprint(2, "XGetWindowAttributes failed\n");
else if(wattr.width && wattr.height){
if(wattr.width != Dx(r) || wattr.height != Dy(r)){
r.max.x = wattr.width;
r.max.y = wattr.height;
}
fprint(2, "new rect %dx%d\n", r.max.x, r.max.y);
}else
fprint(2, "bad attrs\n");
/*
* Allocate our local backing store.
*/
@ -409,21 +436,6 @@ xattach(char *label)
_x.gcreplsrc0 = xgc(pmid, FillTiled, -1);
XFreePixmap(_x.display, pmid);
/*
* Put the window on the screen.
*/
XMapWindow(_x.display, _x.drawable);
XFlush(_x.display);
/*
* Look up clipboard atom.
*/
_x.clipboard = XInternAtom(_x.display, "CLIPBOARD", False);
_x.utf8string = XInternAtom(_x.display, "UTF8_STRING", False);
_x.targets = XInternAtom(_x.display, "TARGETS", False);
_x.text = XInternAtom(_x.display, "TEXT", False);
_x.compoundtext = XInternAtom(_x.display, "COMPOUND_TEXT", False);
/*
* Lots of display connections for various procs.
*/

View file

@ -69,6 +69,9 @@ struct Xprivate {
Atom targets;
Atom text;
Atom compoundtext;
Atom takefocus;
Atom losefocus;
Atom wmprotos;
uint putsnarf;
uint assertsnarf;
int destroyed;

View file

@ -8,6 +8,9 @@
#include <memdraw.h>
#include "x11-memdraw.h"
int _windowhasfocus = 1;
int _wantfocuschanges;
void
moveto(Mousectl *m, Point pt)
{
@ -48,6 +51,7 @@ void
_ioproc(void *arg)
{
int fd, one;
Atom a;
ulong mask;
Mouse m;
Mousectl *mc;
@ -99,6 +103,20 @@ _ioproc(void *arg)
*/
mc->m = m;
break;
case ClientMessage:
if(xevent.xclient.message_type == _x.wmprotos){
a = xevent.xclient.data.l[0];
if(_wantfocuschanges && a == _x.takefocus){
_windowhasfocus = 1;
_x.newscreenr = _x.screenr;
nbsend(mc->resizec, &one);
}else if(_wantfocuschanges && a == _x.losefocus){
_windowhasfocus = 0;
_x.newscreenr = _x.screenr;
nbsend(mc->resizec, &one);
}
}
break;
}
}
}
@ -124,3 +142,25 @@ setcursor(Mousectl *mc, Cursor *c)
_xsetcursor(c);
}
void
bouncemouse(Mouse *m)
{
XButtonEvent e;
e.type = ButtonPress;
e.window = DefaultRootWindow(_x.display);
e.state = 0;
e.button = 0;
if(m->buttons&1)
e.button = 1;
else if(m->buttons&2)
e.button = 2;
else if(m->buttons&4)
e.button = 3;
e.x = m->xy.x;
e.y = m->xy.y;
#undef time
e.time = CurrentTime;
XSendEvent(_x.display, e.window, True, ButtonPressMask, (XEvent*)&e);
XFlush(_x.display);
}