mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-12 11:10:07 +00:00
grey out 9term when it loses focus.
This commit is contained in:
parent
c005568a7f
commit
4f30f3b444
7 changed files with 112 additions and 26 deletions
8
CHANGES
8
CHANGES
|
@ -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
|
March 26, 2004
|
||||||
|
|
||||||
Fix 9term chording paste bug reported by Sam.
|
Fix 9term chording paste bug reported by Sam.
|
||||||
|
|
|
@ -48,6 +48,9 @@ extern void drawgetrect(Rectangle, int);
|
||||||
extern Rectangle getrect(int, Mousectl*);
|
extern Rectangle getrect(int, Mousectl*);
|
||||||
extern int menuhit(int, Mousectl*, Menu*, Screen*);
|
extern int menuhit(int, Mousectl*, Menu*, Screen*);
|
||||||
|
|
||||||
|
extern void bouncemouse(Mouse*);
|
||||||
|
extern int _windowhasfocus; /* XXX do better */
|
||||||
|
extern int _wantfocuschanges;
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
|
|
|
@ -152,6 +152,9 @@ char *menu2str[] = {
|
||||||
|
|
||||||
Image* cols[NCOL];
|
Image* cols[NCOL];
|
||||||
Image* hcols[NCOL];
|
Image* hcols[NCOL];
|
||||||
|
Image* palegrey;
|
||||||
|
Image* paleblue;
|
||||||
|
Image* blue;
|
||||||
Image *plumbcolor;
|
Image *plumbcolor;
|
||||||
Image *execcolor;
|
Image *execcolor;
|
||||||
|
|
||||||
|
@ -187,6 +190,7 @@ threadmain(int argc, char *argv[])
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
rfork(RFNOTEG);
|
rfork(RFNOTEG);
|
||||||
|
_wantfocuschanges = 1;
|
||||||
mainpid = getpid();
|
mainpid = getpid();
|
||||||
ARGBEGIN{
|
ARGBEGIN{
|
||||||
default:
|
default:
|
||||||
|
@ -236,16 +240,22 @@ threadmain(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
cols[TEXT] = display->black;
|
cols[TEXT] = display->black;
|
||||||
cols[HTEXT] = display->black;
|
cols[HTEXT] = display->black;
|
||||||
|
palegrey = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x666666FF);
|
||||||
|
|
||||||
hcols[BACK] = cols[BACK];
|
hcols[BACK] = cols[BACK];
|
||||||
hcols[HIGH] = cols[HIGH];
|
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[TEXT] = hcols[BORD];
|
||||||
hcols[HTEXT] = hcols[TEXT];
|
hcols[HTEXT] = hcols[TEXT];
|
||||||
|
|
||||||
plumbcolor = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x006600FF);
|
plumbcolor = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x006600FF);
|
||||||
execcolor = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xAA0000FF);
|
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);
|
draw(screen, screen->r, cols[BACK], nil, ZP);
|
||||||
geom();
|
geom();
|
||||||
loop();
|
loop();
|
||||||
|
@ -365,6 +375,16 @@ geom(void)
|
||||||
Point p;
|
Point p;
|
||||||
Rectangle r;
|
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 = screen->r;
|
||||||
r.min.y++;
|
r.min.y++;
|
||||||
r.max.y--;
|
r.max.y--;
|
||||||
|
|
|
@ -572,7 +572,7 @@ sendtype(int fd0)
|
||||||
while(ntypebreak){
|
while(ntypebreak){
|
||||||
for(i=0; i<ntypeb; i++)
|
for(i=0; i<ntypeb; i++)
|
||||||
if(typing[i]=='\n' || typing[i]==0x04){
|
if(typing[i]=='\n' || typing[i]==0x04){
|
||||||
n = i + (typing[i] == '\n');
|
n = i+1;
|
||||||
i++;
|
i++;
|
||||||
if(write(fd0, typing, n) != n)
|
if(write(fd0, typing, n) != n)
|
||||||
error("sending to program");
|
error("sending to program");
|
||||||
|
|
|
@ -188,6 +188,7 @@ xattach(char *label)
|
||||||
XWindow xrootwin;
|
XWindow xrootwin;
|
||||||
XWindowAttributes wattr;
|
XWindowAttributes wattr;
|
||||||
XWMHints hint;
|
XWMHints hint;
|
||||||
|
Atom atoms[2];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if(XInitThreads() == 0){
|
if(XInitThreads() == 0){
|
||||||
|
@ -335,14 +336,6 @@ xattach(char *label)
|
||||||
&attr /* attributes (the above aren't?!) */
|
&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.
|
* Label and other properties required by ICCCCM.
|
||||||
*/
|
*/
|
||||||
|
@ -384,6 +377,40 @@ xattach(char *label)
|
||||||
);
|
);
|
||||||
XFlush(_x.display);
|
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.
|
* Allocate our local backing store.
|
||||||
*/
|
*/
|
||||||
|
@ -409,21 +436,6 @@ xattach(char *label)
|
||||||
_x.gcreplsrc0 = xgc(pmid, FillTiled, -1);
|
_x.gcreplsrc0 = xgc(pmid, FillTiled, -1);
|
||||||
XFreePixmap(_x.display, pmid);
|
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.
|
* Lots of display connections for various procs.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -69,6 +69,9 @@ struct Xprivate {
|
||||||
Atom targets;
|
Atom targets;
|
||||||
Atom text;
|
Atom text;
|
||||||
Atom compoundtext;
|
Atom compoundtext;
|
||||||
|
Atom takefocus;
|
||||||
|
Atom losefocus;
|
||||||
|
Atom wmprotos;
|
||||||
uint putsnarf;
|
uint putsnarf;
|
||||||
uint assertsnarf;
|
uint assertsnarf;
|
||||||
int destroyed;
|
int destroyed;
|
||||||
|
|
|
@ -8,6 +8,9 @@
|
||||||
#include <memdraw.h>
|
#include <memdraw.h>
|
||||||
#include "x11-memdraw.h"
|
#include "x11-memdraw.h"
|
||||||
|
|
||||||
|
int _windowhasfocus = 1;
|
||||||
|
int _wantfocuschanges;
|
||||||
|
|
||||||
void
|
void
|
||||||
moveto(Mousectl *m, Point pt)
|
moveto(Mousectl *m, Point pt)
|
||||||
{
|
{
|
||||||
|
@ -48,6 +51,7 @@ void
|
||||||
_ioproc(void *arg)
|
_ioproc(void *arg)
|
||||||
{
|
{
|
||||||
int fd, one;
|
int fd, one;
|
||||||
|
Atom a;
|
||||||
ulong mask;
|
ulong mask;
|
||||||
Mouse m;
|
Mouse m;
|
||||||
Mousectl *mc;
|
Mousectl *mc;
|
||||||
|
@ -99,6 +103,20 @@ _ioproc(void *arg)
|
||||||
*/
|
*/
|
||||||
mc->m = m;
|
mc->m = m;
|
||||||
break;
|
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);
|
_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);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue