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

@ -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);
}