summary refs log tree commit diff
path: root/client.c
diff options
context:
space:
mode:
authorokan <okan>2019-02-22 14:39:18 +0000
committerokan <okan>2019-02-22 14:39:18 +0000
commit044ef5a8cd71dc8935ba40015d3583d231d0bf27 (patch)
tree6c0a4009c89b0ce07c6d4eb9d94471c6c152061c /client.c
parentc307e37dcb8f280e0c3c51248e71e4292e62631d (diff)
downloadcwm-044ef5a8cd71dc8935ba40015d3583d231d0bf27.tar.gz
cwm-044ef5a8cd71dc8935ba40015d3583d231d0bf27.tar.xz
cwm-044ef5a8cd71dc8935ba40015d3583d231d0bf27.zip
Limit vtile/htile actions to clients fully within the screen of master client.
from Charles A Daniels.
Diffstat (limited to 'client.c')
-rw-r--r--client.c41
1 files changed, 29 insertions, 12 deletions
diff --git a/client.c b/client.c
index ff20290..2819bf2 100644
--- a/client.c
+++ b/client.c
@@ -986,19 +986,23 @@ client_htile(struct client_ctx *cc)
 		return;
 	i = n = 0;
 
+	area = screen_area(sc,
+	    cc->geom.x + cc->geom.w / 2,
+	    cc->geom.y + cc->geom.h / 2, CWM_GAP);
+
 	TAILQ_FOREACH(ci, &gc->clientq, group_entry) {
 		if (ci->flags & CLIENT_HIDDEN ||
-		    ci->flags & CLIENT_IGNORE || (ci == cc))
+		    ci->flags & CLIENT_IGNORE || (ci == cc) ||
+		    ci->geom.x < area.x ||
+		    ci->geom.x > (area.x + area.w) ||
+		    ci->geom.y < area.y ||
+		    ci->geom.y > (area.y + area.h))
 			continue;
 		n++;
 	}
 	if (n == 0)
 		return;
 
-	area = screen_area(sc,
-	    cc->geom.x + cc->geom.w / 2,
-	    cc->geom.y + cc->geom.h / 2, CWM_GAP);
-
 	if (cc->flags & CLIENT_VMAXIMIZED ||
 	    cc->geom.h + (cc->bwidth * 2) >= area.h)
 		return;
@@ -1017,7 +1021,11 @@ client_htile(struct client_ctx *cc)
 	h = area.h - mh;
 	TAILQ_FOREACH(ci, &gc->clientq, group_entry) {
 		if (ci->flags & CLIENT_HIDDEN ||
-		    ci->flags & CLIENT_IGNORE || (ci == cc))
+		    ci->flags & CLIENT_IGNORE || (ci == cc) ||
+		    ci->geom.x < area.x ||
+		    ci->geom.x > (area.x + area.w) ||
+		    ci->geom.y < area.y ||
+		    ci->geom.y > (area.y + area.h))
 			continue;
 		ci->bwidth = Conf.bwidth;
 		ci->geom.x = x;
@@ -1044,21 +1052,26 @@ client_vtile(struct client_ctx *cc)
 
 	if (!gc)
 		return;
+
+	area = screen_area(sc,
+	    cc->geom.x + cc->geom.w / 2,
+	    cc->geom.y + cc->geom.h / 2, CWM_GAP);
+
 	i = n = 0;
 
 	TAILQ_FOREACH(ci, &gc->clientq, group_entry) {
 		if (ci->flags & CLIENT_HIDDEN ||
-		    ci->flags & CLIENT_IGNORE || (ci == cc))
+		    ci->flags & CLIENT_IGNORE || (ci == cc) ||
+		    ci->geom.x < area.x ||
+		    ci->geom.x > (area.x + area.w) ||
+		    ci->geom.y < area.y ||
+		    ci->geom.y > (area.y + area.h))
 			continue;
 		n++;
 	}
 	if (n == 0)
 		return;
 
-	area = screen_area(sc,
-	    cc->geom.x + cc->geom.w / 2,
-	    cc->geom.y + cc->geom.h / 2, CWM_GAP);
-
 	if (cc->flags & CLIENT_HMAXIMIZED ||
 	    cc->geom.w + (cc->bwidth * 2) >= area.w)
 		return;
@@ -1077,7 +1090,11 @@ client_vtile(struct client_ctx *cc)
 	w = area.w - mw;
 	TAILQ_FOREACH(ci, &gc->clientq, group_entry) {
 		if (ci->flags & CLIENT_HIDDEN ||
-		    ci->flags & CLIENT_IGNORE || (ci == cc))
+		    ci->flags & CLIENT_IGNORE || (ci == cc) ||
+		    ci->geom.x < area.x ||
+		    ci->geom.x > (area.x + area.w) ||
+		    ci->geom.y < area.y ||
+		    ci->geom.y > (area.y + area.h))
 			continue;
 		ci->bwidth = Conf.bwidth;
 		ci->geom.x = area.x + mw;