summary refs log tree commit diff
diff options
context:
space:
mode:
authorokan <okan>2009-01-16 15:24:14 +0000
committerokan <okan>2009-01-16 15:24:14 +0000
commitec8e6052ba902d2b6afced31008aad015d38f062 (patch)
tree68c77d7e466ced3867647a355e86bb4dc28a0a67
parent5c757cc7f420f58112d3e2af7a6f124994bcbe23 (diff)
downloadcwm-ec8e6052ba902d2b6afced31008aad015d38f062.tar.gz
cwm-ec8e6052ba902d2b6afced31008aad015d38f062.tar.xz
cwm-ec8e6052ba902d2b6afced31008aad015d38f062.zip
remove pwin, bringing us to one client, one window. we no longer have
to push attributes around, so things get a lot simplier, while fixing a
few issues in the meantime; original suggestion by Edd Barrett many many
moons ago.

annoying window placement and race, found in c2k8 by todd, fix by oga!

lots of feedback from todd and oga - thanks!

"commit that bad boy" oga@
-rw-r--r--calmwm.c24
-rw-r--r--calmwm.h17
-rw-r--r--client.c188
-rw-r--r--conf.c4
-rw-r--r--group.c2
-rw-r--r--headers.h1
-rw-r--r--kbfunc.c10
-rw-r--r--mousefunc.c9
-rw-r--r--xevents.c51
9 files changed, 64 insertions, 242 deletions
diff --git a/calmwm.c b/calmwm.c
index 7ba6e04..c332e55 100644
--- a/calmwm.c
+++ b/calmwm.c
@@ -35,16 +35,10 @@ u_int				 Nscreens;
 
 struct client_ctx_q		 Clientq;
 
-int				 Doshape, Shape_ev;
 int				 HasXinerama, HasRandr, Randr_ev;
 int				 Starting;
 struct conf			 Conf;
 
-/* From TWM */
-#define gray_width 2
-#define gray_height 2
-static char gray_bits[] = {0x02, 0x01};
-
 static void	_sigchld_cb(int);
 static void	dpy_init(const char *);
 
@@ -116,8 +110,6 @@ dpy_init(const char *dpyname)
 
 	XSetErrorHandler(x_errorhandler);
 
-	Doshape = XShapeQueryExtension(X_Dpy, &Shape_ev, &i);
-
 	HasRandr = XRRQueryExtension(X_Dpy, &Randr_ev, &i);
 
 	TAILQ_INIT(&Screenq);
@@ -181,7 +173,7 @@ x_setupscreen(struct screen_ctx *sc, u_int which)
 	XAllocNamedColor(X_Dpy, DefaultColormap(X_Dpy, which),
 	    "red", &sc->redcolor, &tmp);
 	XAllocNamedColor(X_Dpy, DefaultColormap(X_Dpy, which),
-	    "#00ccc8", &sc->cyancolor, &tmp);
+	    "#666666", &sc->graycolor, &tmp);
 	XAllocNamedColor(X_Dpy, DefaultColormap(X_Dpy, which),
 	    "white", &sc->whitecolor, &tmp);
 	XAllocNamedColor(X_Dpy, DefaultColormap(X_Dpy, which),
@@ -191,19 +183,7 @@ x_setupscreen(struct screen_ctx *sc, u_int which)
 	sc->whitepixl = WhitePixel(X_Dpy, sc->which);
 	sc->bluepixl = sc->fccolor.pixel;
 	sc->redpixl = sc->redcolor.pixel;
-	sc->cyanpixl = sc->cyancolor.pixel;
-
-	sc->gray = XCreatePixmapFromBitmapData(X_Dpy, sc->rootwin,
-	    gray_bits, gray_width, gray_height,
-	    sc->blackpixl, sc->whitepixl, DefaultDepth(X_Dpy, sc->which));
-
-	sc->blue = XCreatePixmapFromBitmapData(X_Dpy, sc->rootwin,
-	    gray_bits, gray_width, gray_height,
-	    sc->bluepixl, sc->whitepixl, DefaultDepth(X_Dpy, sc->which));
-
-	sc->red = XCreatePixmapFromBitmapData(X_Dpy, sc->rootwin,
-	    gray_bits, gray_width, gray_height,
-	    sc->redpixl, sc->whitepixl, DefaultDepth(X_Dpy, sc->which));
+	sc->graypixl = sc->graycolor.pixel;
 
 	gv.foreground = sc->blackpixl^sc->whitepixl;
 	gv.background = sc->whitepixl;
diff --git a/calmwm.h b/calmwm.h
index 65884c9..5234376 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -45,14 +45,12 @@ struct screen_ctx {
 	Window		 rootwin;
 	Window		 menuwin;
 	Colormap	 colormap;
-	XColor		 bgcolor, fgcolor, fccolor, redcolor, cyancolor,
+	XColor		 bgcolor, fgcolor, fccolor, redcolor, graycolor,
 			 whitecolor, blackcolor;
 	char		*display;
-	unsigned long	 blackpixl, whitepixl, redpixl, bluepixl, cyanpixl;
+	unsigned long	 blackpixl, whitepixl, redpixl, bluepixl, graypixl;
 	GC		 gc;
 
-	Pixmap		 gray, blue, red;
-
 	int		 altpersist;
 
 	int		 xmax;
@@ -81,10 +79,10 @@ TAILQ_HEAD(screen_ctx_q, screen_ctx);
 #define CLIENT_DOVMAXIMIZE	0x10
 #define CLIENT_VMAXIMIZED	0x20
 
+#define CLIENT_BWIDTH		1
 #define CLIENT_HIGHLIGHT_BLUE	1
 #define CLIENT_HIGHLIGHT_RED	2
 
-
 struct winname {
 	TAILQ_ENTRY(winname)	 entry;
 	char			*name;
@@ -104,8 +102,6 @@ struct client_ctx {
 
 	Colormap		 cmap;
 
-	Window			 pwin;
-
 	u_int			 bwidth;
 	struct {
 		int		 x, y, width, height;
@@ -316,7 +312,6 @@ void			 client_setup(void);
 struct client_ctx	*client_new(Window, struct screen_ctx *, int);
 int			 client_delete(struct client_ctx *, int, int);
 void			 client_setactive(struct client_ctx *, int);
-void			 client_gravitate(struct client_ctx *, int);
 void			 client_resize(struct client_ctx *);
 void			 client_lower(struct client_ctx *);
 void			 client_raise(struct client_ctx *);
@@ -336,8 +331,6 @@ void			 client_update(struct client_ctx *);
 void			 client_placecalc(struct client_ctx *);
 void			 client_maximize(struct client_ctx *);
 void			 client_vertmaximize(struct client_ctx *);
-u_long			 client_bg_pixel(struct client_ctx *);
-Pixmap			 client_bg_pixmap(struct client_ctx *);
 void			 client_map(struct client_ctx *);
 void			 client_mtf(struct client_ctx *);
 struct client_ctx	*client_cycle(int);
@@ -345,7 +338,6 @@ struct client_ctx	*client_mrunext(struct client_ctx *);
 struct client_ctx	*client_mruprev(struct client_ctx *);
 void			 client_gethints(struct client_ctx *);
 void			 client_freehints(struct client_ctx *);
-void			 client_do_shape(struct client_ctx *);
 
 struct menu  		*menu_filter(struct menu_q *, char *, char *, int,
 			     void (*)(struct menu_q *, struct menu_q *, char *),
@@ -365,7 +357,6 @@ void			 xev_handle_keypress(struct xevent *, XEvent *);
 void			 xev_handle_keyrelease(struct xevent *, XEvent *);
 void			 xev_handle_expose(struct xevent *, XEvent *);
 void			 xev_handle_clientmessage(struct xevent *, XEvent *);
-void			 xev_handle_shape(struct xevent *, XEvent *);
 void			 xev_handle_randr(struct xevent *, XEvent *);
 void			 xev_handle_mapping(struct xevent *, XEvent *);
 
@@ -512,8 +503,6 @@ extern u_int				 Nscreens;
 
 extern struct client_ctx_q		 Clientq;
 
-extern int				 Doshape, Shape_ev;
-extern int				 Doshape, Shape_ev;
 extern int				 HasXinerama, HasRandr, Randr_ev;
 extern struct conf			 Conf;
 
diff --git a/client.c b/client.c
index 4fac5ae..cf72174 100644
--- a/client.c
+++ b/client.c
@@ -38,7 +38,7 @@ client_find(Window win)
 	struct client_ctx	*cc;
 
 	TAILQ_FOREACH(cc, &Clientq, entry)
-		if (cc->pwin == win || cc->win == win)
+		if (cc->win == win)
 			return (cc);
 
 	return (NULL);
@@ -48,11 +48,10 @@ struct client_ctx *
 client_new(Window win, struct screen_ctx *sc, int mapped)
 {
 	struct client_ctx	*cc;
-	XSetWindowAttributes	 pxattr;
 	XWindowAttributes	 wattr;
 	XWMHints		*wmhints;
 	long			 tmp;
-	int			 x, y, height, width, state;
+	int			 state;
 
 	if (win == None)
 		return (NULL);
@@ -65,6 +64,7 @@ client_new(Window win, struct screen_ctx *sc, int mapped)
 	cc->sc = sc;
 	cc->win = win;
 	cc->size = XAllocSizeHints();
+	XGetWMNormalHints(X_Dpy, cc->win, cc->size, &tmp);
 	if (cc->size->width_inc == 0)
 		cc->size->width_inc = 1;
 	if (cc->size->height_inc == 0)
@@ -78,7 +78,6 @@ client_new(Window win, struct screen_ctx *sc, int mapped)
 	 */
 	conf_client(cc);
 
-	XGetWMNormalHints(X_Dpy, cc->win, cc->size, &tmp);
 	XGetWindowAttributes(X_Dpy, cc->win, &wattr);
 
 	if (cc->size->flags & PBaseSize) {
@@ -93,8 +92,6 @@ client_new(Window win, struct screen_ctx *sc, int mapped)
 	cc->ptr.x = -1;
 	cc->ptr.y = -1;
 
-	client_gravitate(cc, 1);
-
 	cc->geom.x = wattr.x;
 	cc->geom.y = wattr.y;
 	cc->geom.width = wattr.width;
@@ -106,10 +103,12 @@ client_new(Window win, struct screen_ctx *sc, int mapped)
 		if ((wmhints = XGetWMHints(X_Dpy, cc->win)) != NULL) {
 			if (wmhints->flags & StateHint)
 				xu_setstate(cc, wmhints->initial_state);
-
+		
 			XFree(wmhints);
 		}
+		client_move(cc);
 	}
+	client_draw_border(cc);
 
 	if (xu_getstate(cc, &state) < 0)
 		state = NormalState;
@@ -117,41 +116,15 @@ client_new(Window win, struct screen_ctx *sc, int mapped)
 	XSelectInput(X_Dpy, cc->win, ColormapChangeMask | EnterWindowMask |
 	    PropertyChangeMask | KeyReleaseMask);
 
-	x = cc->geom.x - cc->bwidth;
-	y = cc->geom.y - cc->bwidth;
-
-	width = cc->geom.width;
-	height = cc->geom.height;
-	if (cc->bwidth > 1) {
-		width += (cc->bwidth)*2;
-		height += (cc->bwidth)*2;
-	}
-	pxattr.override_redirect = True;
-	pxattr.background_pixel = sc->bgcolor.pixel;
-	pxattr.event_mask = ChildMask | ButtonPressMask | ButtonReleaseMask |
-	    ExposureMask | EnterWindowMask;
-
-	cc->pwin = XCreateWindow(X_Dpy, sc->rootwin, x, y,
-	    width, height, 0,	/* XXX */
-	    DefaultDepth(X_Dpy, sc->which), CopyFromParent,
-	    DefaultVisual(X_Dpy, sc->which),
-	    CWOverrideRedirect | CWBackPixel | CWEventMask, &pxattr);
-
-	cc->active = 0;
-
 	XAddToSaveSet(X_Dpy, cc->win);
-	XSetWindowBorderWidth(X_Dpy, cc->win, 0);
-	XReparentWindow(X_Dpy, cc->win, cc->pwin, cc->bwidth, cc->bwidth);
 
 	/* Notify client of its configuration. */
 	xev_reconfig(cc);
 
 	if (state == IconicState)
 		client_hide(cc);
-	else {
-		XMapRaised(X_Dpy, cc->pwin);
-		XMapWindow(X_Dpy, cc->win);
-	}
+	else
+		client_unhide(cc);
 
 	xu_setstate(cc, cc->state);
 
@@ -170,27 +143,6 @@ client_new(Window win, struct screen_ctx *sc, int mapped)
 	return (cc);
 }
 
-void
-client_do_shape(struct client_ctx *cc)
-{
-	/* Windows not rectangular require more effort */
-	XRectangle	*r;
-	int		 n, tmp;
-
-	if (Doshape) {
-		XShapeSelectInput(X_Dpy, cc->win, ShapeNotifyMask);
-
-		r = XShapeGetRectangles(X_Dpy, cc->win, ShapeBounding,
-		    &n, &tmp);
-
-		if (n > 1)
-			XShapeCombineShape(X_Dpy, cc->pwin, ShapeBounding,
-			    cc->bwidth,	cc->bwidth, cc->win, ShapeBounding,
-			    ShapeSet);
-		XFree(r);
-	}
-}
-
 int
 client_delete(struct client_ctx *cc, int sendevent, int ignorewindow)
 {
@@ -206,15 +158,6 @@ client_delete(struct client_ctx *cc, int sendevent, int ignorewindow)
 	xu_setstate(cc, WithdrawnState);
 	XRemoveFromSaveSet(X_Dpy, cc->win);
 
-	if (!ignorewindow) {
-		client_gravitate(cc, 0);
-		XSetWindowBorderWidth(X_Dpy, cc->win, 1);	/* XXX */
-		XReparentWindow(X_Dpy, cc->win,
-		    sc->rootwin, cc->geom.x, cc->geom.y);
-	}
-	if (cc->pwin)
-		XDestroyWindow(X_Dpy, cc->pwin);
-
 	XSync(X_Dpy, False);
 	XUngrabServer(X_Dpy);
 
@@ -296,28 +239,6 @@ client_current(void)
 }
 
 void
-client_gravitate(struct client_ctx *cc, int yes)
-{
-	int	 dx = 0, dy = 0, mult = yes ? 1 : -1;
-	int	 gravity = (cc->size->flags & PWinGravity) ?
-		     cc->size->win_gravity : NorthWestGravity;
-
-	switch (gravity) {
-	case NorthWestGravity:
-	case SouthWestGravity:
-	case NorthEastGravity:
-	case StaticGravity:
-		dx = cc->bwidth;
-	case NorthGravity:
-		dy = cc->bwidth;
-		break;
-	}
-
-	cc->geom.x += mult * dx;
-	cc->geom.y += mult * dy;
-}
-
-void
 client_maximize(struct client_ctx *cc)
 {
 	struct screen_ctx	*sc = CCTOSC(cc);
@@ -402,18 +323,15 @@ client_resize(struct client_ctx *cc)
 		cc->flags |= CLIENT_VMAXIMIZED;
 	}
 
-	XMoveResizeWindow(X_Dpy, cc->pwin, cc->geom.x - cc->bwidth,
-	    cc->geom.y - cc->bwidth, cc->geom.width + cc->bwidth*2,
-	    cc->geom.height + cc->bwidth*2);
-	XMoveResizeWindow(X_Dpy, cc->win, cc->bwidth, cc->bwidth,
-	    cc->geom.width, cc->geom.height);
+	XMoveResizeWindow(X_Dpy, cc->win, cc->geom.x - cc->bwidth,
+	    cc->geom.y - cc->bwidth, cc->geom.width, cc->geom.height);
 	xev_reconfig(cc);
 }
 
 void
 client_move(struct client_ctx *cc)
 {
-	XMoveWindow(X_Dpy, cc->pwin,
+	XMoveWindow(X_Dpy, cc->win,
 	    cc->geom.x - cc->bwidth, cc->geom.y - cc->bwidth);
 	xev_reconfig(cc);
 }
@@ -421,13 +339,13 @@ client_move(struct client_ctx *cc)
 void
 client_lower(struct client_ctx *cc)
 {
-	XLowerWindow(X_Dpy, cc->pwin);
+	XLowerWindow(X_Dpy, cc->win);
 }
 
 void
 client_raise(struct client_ctx *cc)
 {
-	XRaiseWindow(X_Dpy, cc->pwin);
+	XRaiseWindow(X_Dpy, cc->win);
 }
 
 void
@@ -445,7 +363,7 @@ client_ptrwarp(struct client_ctx *cc)
 	else
 		client_raise(cc);
 
-	xu_ptr_setpos(cc->pwin, x, y);
+	xu_ptr_setpos(cc->win, x, y);
 }
 
 void
@@ -453,7 +371,7 @@ client_ptrsave(struct client_ctx *cc)
 {
 	int	 x, y;
 
-	xu_ptr_getpos(cc->pwin, &x, &y);
+	xu_ptr_getpos(cc->win, &x, &y);
 	if (_client_inbound(cc, x, y)) {
 		cc->ptr.x = x;
 		cc->ptr.y = y;
@@ -464,7 +382,7 @@ void
 client_hide(struct client_ctx *cc)
 {
 	/* XXX - add wm_state stuff */
-	XUnmapWindow(X_Dpy, cc->pwin);
+	XUnmapWindow(X_Dpy, cc->win);
 
 	cc->active = 0;
 	cc->flags |= CLIENT_HIDDEN;
@@ -477,7 +395,7 @@ client_hide(struct client_ctx *cc)
 void
 client_unhide(struct client_ctx *cc)
 {
-	XMapRaised(X_Dpy, cc->pwin);
+	XMapRaised(X_Dpy, cc->win);
 
 	cc->highlight = 0;
 	cc->flags &= ~CLIENT_HIDDEN;
@@ -488,64 +406,24 @@ void
 client_draw_border(struct client_ctx *cc)
 {
 	struct screen_ctx	*sc = CCTOSC(cc);
-
-	if (cc->active) {
-		XSetWindowBackground(X_Dpy, cc->pwin, client_bg_pixel(cc));
-		XClearWindow(X_Dpy, cc->pwin);
-
-		if (!cc->highlight && cc->bwidth > 1)
-			XDrawRectangle(X_Dpy, cc->pwin, sc->gc, 1, 1,
-			    cc->geom.width + cc->bwidth,
-			    cc->geom.height + cc->bwidth);
-	} else {
-		if (cc->bwidth > 1)
-			XSetWindowBackgroundPixmap(X_Dpy,
-			    cc->pwin, client_bg_pixmap(cc));
-
-		XClearWindow(X_Dpy, cc->pwin);
-	}
-}
-
-u_long
-client_bg_pixel(struct client_ctx *cc)
-{
-	struct screen_ctx	*sc = CCTOSC(cc);
 	u_long			 pixl;
 
-	switch (cc->highlight) {
-	case CLIENT_HIGHLIGHT_BLUE:
-		pixl = sc->bluepixl;
-		break;
-	case CLIENT_HIGHLIGHT_RED:
-		pixl = sc->redpixl;
-		break;
-	default:
-		pixl = sc->blackpixl;
-		break;
-	}
-
-	return (pixl);
-}
-
-Pixmap
-client_bg_pixmap(struct client_ctx *cc)
-{
-	struct screen_ctx	*sc = CCTOSC(cc);
-	Pixmap			 pix;
-
-	switch (cc->highlight) {
-	case CLIENT_HIGHLIGHT_BLUE:
-		pix = sc->blue;
-		break;
-	case CLIENT_HIGHLIGHT_RED:
-		pix = sc->red;
-		break;
-	default:
-		pix = sc->gray;
-		break;
-	}
-
-	return (pix);
+	if (cc->active)
+		switch (cc->highlight) {
+		case CLIENT_HIGHLIGHT_BLUE:
+			pixl = sc->bluepixl;
+			break;
+		case CLIENT_HIGHLIGHT_RED:
+			pixl = sc->redpixl;
+			break;
+		default:
+			pixl = sc->whitepixl;
+			break;
+		}
+	else
+		pixl = sc->graypixl;
+	XSetWindowBorderWidth(X_Dpy, cc->win, cc->bwidth);
+	XSetWindowBorder(X_Dpy, cc->win, pixl);
 }
 
 void
diff --git a/conf.c b/conf.c
index d874050..74a07af 100644
--- a/conf.c
+++ b/conf.c
@@ -201,7 +201,7 @@ conf_client(struct client_ctx *cc)
 	} else
 		ignore = 1;
 
-	cc->bwidth = ignore ? 0 : 3;
+	cc->bwidth = ignore ? 0 : CLIENT_BWIDTH;
 	cc->flags |= ignore ? CLIENT_IGNORE : 0;
 }
 
@@ -530,6 +530,6 @@ conf_grab_mouse(struct client_ctx *cc)
 			warnx("strange button in mousebinding\n");
 			continue;
 		}
-		xu_btn_grab(cc->pwin, mb->modmask, button);
+		xu_btn_grab(cc->win, mb->modmask, button);
 	}
 }
diff --git a/group.c b/group.c
index 0a0c2bc..e1dd03e 100644
--- a/group.c
+++ b/group.c
@@ -99,7 +99,7 @@ _group_show(struct group_ctx *gc)
 	 * top-to-bottom.
 	 */
 	TAILQ_FOREACH(cc, &gc->clients, group_entry) {
-		winlist[gc->highstack - cc->stackingorder] = cc->pwin;
+		winlist[gc->highstack - cc->stackingorder] = cc->win;
 		client_unhide(cc);
 	}
 
diff --git a/headers.h b/headers.h
index b973475..f9099dd 100644
--- a/headers.h
+++ b/headers.h
@@ -40,7 +40,6 @@
 #include <ctype.h>
 
 #include <X11/cursorfont.h>
-#include <X11/extensions/shape.h>
 #include <X11/extensions/Xinerama.h>
 #include <X11/extensions/Xrandr.h>
 #include <X11/Xlib.h>
diff --git a/kbfunc.c b/kbfunc.c
index c836f6f..ded95f3 100644
--- a/kbfunc.c
+++ b/kbfunc.c
@@ -90,7 +90,7 @@ kbfunc_moveresize(struct client_ctx *cc, void *arg)
 			cc->geom.x = cc->sc->xmax;
 
 		client_move(cc);
-		xu_ptr_getpos(cc->pwin, &x, &y);
+		xu_ptr_getpos(cc->win, &x, &y);
 		cc->ptr.y = y + my;
 		cc->ptr.x = x + mx;
 		client_ptrwarp(cc);
@@ -103,7 +103,7 @@ kbfunc_moveresize(struct client_ctx *cc, void *arg)
 		client_resize(cc);
 
 		/* Make sure the pointer stays within the window. */
-		xu_ptr_getpos(cc->pwin, &cc->ptr.x, &cc->ptr.y);
+		xu_ptr_getpos(cc->win, &cc->ptr.x, &cc->ptr.y);
 		if (cc->ptr.x > cc->geom.width)
 			cc->ptr.x = cc->geom.width - cc->bwidth;
 		if (cc->ptr.y > cc->geom.height)
@@ -112,8 +112,8 @@ kbfunc_moveresize(struct client_ctx *cc, void *arg)
 		break;
 	case CWM_PTRMOVE:
 		if (cc) {
-			xu_ptr_getpos(cc->pwin, &x, &y);
-			xu_ptr_setpos(cc->pwin, x + mx, y + my);
+			xu_ptr_getpos(cc->win, &x, &y);
+			xu_ptr_setpos(cc->win, x + mx, y + my);
 		} else {
 			xu_ptr_getpos(sc->rootwin, &x, &y);
 			xu_ptr_setpos(sc->rootwin, x + mx, y + my);
@@ -455,7 +455,7 @@ void
 kbfunc_client_grouptoggle(struct client_ctx *cc, void *arg)
 {
 	/* XXX for stupid X apps like xpdf and gvim */
-	XGrabKeyboard(X_Dpy, cc->pwin, True,
+	XGrabKeyboard(X_Dpy, cc->win, True,
 	    GrabModeAsync, GrabModeAsync, CurrentTime);
 
 	group_sticky_toggle_enter(cc);
diff --git a/mousefunc.c b/mousefunc.c
index 78768d3..aa12722 100644
--- a/mousefunc.c
+++ b/mousefunc.c
@@ -117,16 +117,11 @@ mousefunc_window_resize(struct client_ctx *cc, void *arg)
 				/* Recompute window output */
 				_mousefunc_sweep_draw(cc, dx, dy);
 
-			XMoveResizeWindow(X_Dpy, cc->pwin,
+			XMoveResizeWindow(X_Dpy, cc->win,
 			    cc->geom.x - cc->bwidth,
 			    cc->geom.y - cc->bwidth,
 			    cc->geom.width + cc->bwidth * 2,
 			    cc->geom.height + cc->bwidth * 2);
-			XMoveResizeWindow(X_Dpy, cc->win,
-			    cc->bwidth, cc->bwidth,
-			    cc->geom.width, cc->geom.height);
-
-			client_do_shape(cc);
 			break;
 		case ButtonRelease:
 			XUnmapWindow(X_Dpy, sc->menuwin);
@@ -172,7 +167,7 @@ mousefunc_window_move(struct client_ctx *cc, void *arg)
 			cc->geom.x = x + (ev.xmotion.x - mx);
 			cc->geom.y = y + (ev.xmotion.y - my);
 
-			XMoveWindow(X_Dpy, cc->pwin,
+			XMoveWindow(X_Dpy, cc->win,
 			    cc->geom.x - cc->bwidth, cc->geom.y - cc->bwidth);
 
 			break;
diff --git a/xevents.c b/xevents.c
index 3d59d54..91f5e43 100644
--- a/xevents.c
+++ b/xevents.c
@@ -68,7 +68,7 @@ xev_handle_unmapnotify(struct xevent *xev, XEvent *ee)
 	struct client_ctx	*cc;
 
 	if ((cc = client_find(e->window)) != NULL)
-		client_delete(cc, e->send_event, 0);
+		client_hide(cc);
 
 	xev_register(xev);
 }
@@ -96,7 +96,6 @@ xev_handle_configurerequest(struct xevent *xev, XEvent *ee)
 	if ((cc = client_find(e->window)) != NULL) {
 		sc = CCTOSC(cc);
 
-		client_gravitate(cc, 0);
 		if (e->value_mask & CWWidth)
 			cc->geom.width = e->width;
 		if (e->value_mask & CWHeight)
@@ -114,30 +113,26 @@ xev_handle_configurerequest(struct xevent *xev, XEvent *ee)
 		    cc->geom.height >= DisplayHeight(X_Dpy, sc->which))
 			cc->geom.y -= cc->bwidth;
 
-		client_gravitate(cc, 1);
-
 		wc.x = cc->geom.x - cc->bwidth;
 		wc.y = cc->geom.y - cc->bwidth;
 		wc.width = cc->geom.width + cc->bwidth*2;
 		wc.height = cc->geom.height + cc->bwidth*2;
-		wc.border_width = 0;
+		wc.border_width = cc->bwidth;
 
-		/* We need to move the parent window, too. */
-		XConfigureWindow(X_Dpy, cc->pwin, e->value_mask, &wc);
+		XConfigureWindow(X_Dpy, cc->win, e->value_mask, &wc);
 		xev_reconfig(cc);
+	} else {
+		/* let it do what it wants, it'll be ours when we map it. */
+		wc.x = e->x;
+		wc.y = e->y;
+		wc.width = e->width;
+		wc.height = e->height;
+		wc.stack_mode = Above;
+		e->value_mask &= ~CWStackMode;
+
+		XConfigureWindow(X_Dpy, e->window, e->value_mask, &wc);
 	}
 
-	wc.x = cc != NULL ? cc->bwidth : e->x;
-	wc.y = cc != NULL ? cc->bwidth : e->y;
-	wc.width = e->width;
-	wc.height = e->height;
-	wc.stack_mode = Above;
-	wc.border_width = 0;
-	e->value_mask &= ~CWStackMode;
-	e->value_mask |= CWBorderWidth;
-
-	XConfigureWindow(X_Dpy, e->window, e->value_mask, &wc);
-
 	xev_register(xev);
 }
 
@@ -177,7 +172,7 @@ xev_reconfig(struct client_ctx *cc)
 	ce.y = cc->geom.y;
 	ce.width = cc->geom.width;
 	ce.height = cc->geom.height;
-	ce.border_width = 0;
+	ce.border_width = cc->bwidth;
 	ce.above = None;
 	ce.override_redirect = 0;
 
@@ -362,16 +357,6 @@ out:
 }
 
 void
-xev_handle_shape(struct xevent *xev, XEvent *ee)
-{
-	XShapeEvent		*sev = (XShapeEvent *) ee;
-	struct client_ctx	*cc;
-
-	if ((cc = client_find(sev->window)) != NULL)
-		client_do_shape(cc);
-}
-
-void
 xev_handle_randr(struct xevent *xev, XEvent *ee)
 {
 	XRRScreenChangeNotifyEvent	*rev = (XRRScreenChangeNotifyEvent *)ee;
@@ -465,10 +450,8 @@ xev_handle_expose(struct xevent *xev, XEvent *ee)
 	XExposeEvent		*e = &ee->xexpose;
 	struct client_ctx	*cc;
 
-	if ((cc = client_find(e->window)) != NULL && e->count == 0) {
+	if ((cc = client_find(e->window)) != NULL && e->count == 0)
 		client_draw_border(cc);
-		client_do_shape(cc);
-	}
 
 	xev_register(xev);
 }
@@ -535,9 +518,7 @@ xev_loop(void)
 			ASSIGN1(xclient);
 			break;
 		default:
-			if (e.type == Shape_ev)
-				xev_handle_shape(xev, &e);
-			else if (e.type == Randr_ev)
+			if (e.type == Randr_ev)
 				xev_handle_randr(xev, &e);
 			break;
 		}