summary refs log tree commit diff
diff options
context:
space:
mode:
authorokan <okan>2018-11-08 15:49:42 +0000
committerokan <okan>2018-11-08 15:49:42 +0000
commita63b87e31561b68c0daad5ffaa0ff47cb84ab402 (patch)
tree35cd8577e6a0eb9d3c2e750ca8fb6fc66276ae44
parent9999c3e6e0191c91d36674e5968000b58610ed14 (diff)
downloadcwm-a63b87e31561b68c0daad5ffaa0ff47cb84ab402.tar.gz
cwm-a63b87e31561b68c0daad5ffaa0ff47cb84ab402.tar.xz
cwm-a63b87e31561b68c0daad5ffaa0ff47cb84ab402.zip
Use the original client border width to adjust initial placement of clients
containing {P,US}Position requests where they are explicitly set to 'ignore' in
cwmrc(5); clients are unaware that their border will be altered (removed in
this case) when calcuating position and thus end up a factor of their original
border width off once mapped by cwm(1). cwm(1) will essentially shift the
client to the edge if the original request's position and border match.

Window offset noticed by at least Andre Stoebe via bugs@, and others since
(and likely before). Thanks!
-rw-r--r--calmwm.h1
-rw-r--r--client.c7
2 files changed, 8 insertions, 0 deletions
diff --git a/calmwm.h b/calmwm.h
index 4984417..f007a04 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -130,6 +130,7 @@ struct client_ctx {
 	Window			 win;
 	Colormap		 colormap;
 	int			 bwidth; /* border width */
+	int			 obwidth; /* original border width */
 	struct geom		 geom, savegeom, fullgeom;
 	struct {
 		long		 flags;	/* defined hints */
diff --git a/client.c b/client.c
index 45412f3..1fa74b9 100644
--- a/client.c
+++ b/client.c
@@ -96,6 +96,7 @@ client_init(Window win, struct screen_ctx *sc, int active)
 	cc->ptr.y = cc->geom.h / 2;
 
 	cc->colormap = wattr.colormap;
+	cc->obwidth = wattr.border_width;
 
 	if (wattr.map_state != IsViewable) {
 		client_placecalc(cc);
@@ -760,6 +761,12 @@ client_placecalc(struct client_ctx *cc)
 			cc->geom.x = sc->view.h - cc->bwidth - 1;
 		if (cc->geom.y + cc->geom.h + cc->bwidth <= 0)
 			cc->geom.y = -(cc->geom.h + cc->bwidth - 1);
+		if (cc->flags & CLIENT_IGNORE) {
+			if (((cc->obwidth * 2) + cc->geom.x + cc->geom.w) == sc->view.w)
+				cc->geom.x += cc->obwidth * 2;
+			if (((cc->obwidth * 2) + cc->geom.y + cc->geom.h) == sc->view.h)
+				cc->geom.y += cc->obwidth * 2;
+		}
 	} else {
 		struct geom		 area;
 		int			 xmouse, ymouse;