aboutsummaryrefslogtreecommitdiff
path: root/src/libdraw
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-03-30 05:03:29 +0000
committerrsc <devnull@localhost>2004-03-30 05:03:29 +0000
commit4f30f3b44464f9b89512224095474200390b03e9 (patch)
tree4d746a629308be850eec37e088fb361c0bc49f75 /src/libdraw
parentc005568a7fe03010dcd1b2df311e3cd7f7459448 (diff)
downloadplan9port-4f30f3b44464f9b89512224095474200390b03e9.tar.gz
plan9port-4f30f3b44464f9b89512224095474200390b03e9.tar.bz2
plan9port-4f30f3b44464f9b89512224095474200390b03e9.zip
grey out 9term when it loses focus.
Diffstat (limited to 'src/libdraw')
-rw-r--r--src/libdraw/x11-init.c58
-rw-r--r--src/libdraw/x11-memdraw.h3
-rw-r--r--src/libdraw/x11-mouse.c40
3 files changed, 78 insertions, 23 deletions
diff --git a/src/libdraw/x11-init.c b/src/libdraw/x11-init.c
index 41800b3f..8d4f61c6 100644
--- a/src/libdraw/x11-init.c
+++ b/src/libdraw/x11-init.c
@@ -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.
*/
@@ -385,6 +378,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.
*/
_x.screenr = r;
@@ -410,21 +437,6 @@ xattach(char *label)
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.
*/
_x.kbdcon = XOpenDisplay(NULL);
diff --git a/src/libdraw/x11-memdraw.h b/src/libdraw/x11-memdraw.h
index 1e84b926..efd8dd7d 100644
--- a/src/libdraw/x11-memdraw.h
+++ b/src/libdraw/x11-memdraw.h
@@ -69,6 +69,9 @@ struct Xprivate {
Atom targets;
Atom text;
Atom compoundtext;
+ Atom takefocus;
+ Atom losefocus;
+ Atom wmprotos;
uint putsnarf;
uint assertsnarf;
int destroyed;
diff --git a/src/libdraw/x11-mouse.c b/src/libdraw/x11-mouse.c
index 93f7ecf4..d2d0126b 100644
--- a/src/libdraw/x11-mouse.c
+++ b/src/libdraw/x11-mouse.c
@@ -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);
+}