Hi all,

I'm new around here, so apologies in advance if I miss something
obvious.

I have written a patch to cwm so that the htile/vtile functionality
only affect windows within the same monitor as the active window. For
single monitor setups, this will have no effect. For multi-monitor
setups, this will allow multiple different monitors to have windows
tiled independently from one another (within the same group).

This is implemented by modifying the relevant checks to ignore any
clients (ci) where the client is outside of the area of the current
display as returned by screen_area() (ci->geom not within area).

Testing and feedback are welcome and appreciated!

Regards, 

~ Charles

P.S. I would be curious to heard about others' development workflows
for window managers. I've been compiling cwm, copying it to
/usr/X11R6/bin, logging out, and logging back in. This is really un-
ergonomic, and I'd like to have a better setup, but I've never
developed a window manager before so I'm unsure how to improve.

diff --git a/client.c.orig b/client.c
index 27658e6..05e18ab 100644
--- a/client.c.orig
+++ 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;

Reply via email to