diff options
author | Leah Neukirchen <leah@vuxu.org> | 2019-02-25 19:45:12 +0100 |
---|---|---|
committer | Leah Neukirchen <leah@vuxu.org> | 2019-02-25 19:45:12 +0100 |
commit | f4286ad453f01d79c9825b1b75c629901fb11732 (patch) | |
tree | 0302f500094bd667b9a2a4c3a59279badc32e429 /client.c | |
parent | 544b4da339347c75f56ca2229ffddb4bdcf86fa0 (diff) | |
parent | a5ba9aa9da9567244d1c3d1d8ccacfdb51b044de (diff) | |
download | cwm-f4286ad453f01d79c9825b1b75c629901fb11732.tar.gz cwm-f4286ad453f01d79c9825b1b75c629901fb11732.tar.xz cwm-f4286ad453f01d79c9825b1b75c629901fb11732.zip |
cvsimport
* refs/heads/master: Add 'group-close-[n]' action to close all windows within specified group. simplify screen 'area' usage for initial client placement restore order from before r1.248 (vtile/vtile containment changes). Rename internal functions to delinate between client remove, delete and xproto delete; 'window-close' is now the proper action, but 'window-delete' as an alias will remain until more interesting changes require breaking configs. Limit vtile/htile actions to clients fully within the screen of master client. fix missing includes
Diffstat (limited to 'client.c')
-rw-r--r-- | client.c | 65 |
1 files changed, 38 insertions, 27 deletions
diff --git a/client.c b/client.c index 8794f28..d7d34c4 100644 --- a/client.c +++ b/client.c @@ -170,7 +170,7 @@ client_find(Window win) } void -client_delete(struct client_ctx *cc) +client_remove(struct client_ctx *cc) { struct screen_ctx *sc = cc->sc; struct winname *wn; @@ -636,7 +636,7 @@ client_msg(struct client_ctx *cc, Atom proto, Time ts) } void -client_send_delete(struct client_ctx *cc) +client_close(struct client_ctx *cc) { if (cc->flags & CLIENT_WM_DELETE_WINDOW) client_msg(cc, cwmh[WM_DELETE_WINDOW], CurrentTime); @@ -754,7 +754,6 @@ static void client_placecalc(struct client_ctx *cc) { struct screen_ctx *sc = cc->sc; - int xslack, yslack; if (cc->hint.flags & (USPosition | PPosition)) { if (cc->geom.x >= sc->view.w) @@ -772,33 +771,29 @@ client_placecalc(struct client_ctx *cc) cc->geom.y += cc->obwidth * 2; } } else { - struct geom area; - int xmouse, ymouse; + struct geom area; + int xmouse, ymouse, xslack, yslack; xu_ptr_getpos(sc->rootwin, &xmouse, &ymouse); area = screen_area(sc, xmouse, ymouse, CWM_GAP); - area.w += area.x; - area.h += area.y; - xmouse = MAX(xmouse, area.x) - cc->geom.w / 2; - ymouse = MAX(ymouse, area.y) - cc->geom.h / 2; - xmouse = MAX(xmouse, area.x); - ymouse = MAX(ymouse, area.y); + xmouse = MAX(MAX(xmouse, area.x) - cc->geom.w / 2, area.x); + ymouse = MAX(MAX(ymouse, area.y) - cc->geom.h / 2, area.y); - xslack = area.w - cc->geom.w - cc->bwidth * 2; - yslack = area.h - cc->geom.h - cc->bwidth * 2; + xslack = area.x + area.w - cc->geom.w - cc->bwidth * 2; + yslack = area.y + area.h - cc->geom.h - cc->bwidth * 2; if (xslack >= area.x) { cc->geom.x = MAX(MIN(xmouse, xslack), area.x); } else { cc->geom.x = area.x; - cc->geom.w = area.w; + cc->geom.w = area.x + area.w; } if (yslack >= area.y) { cc->geom.y = MAX(MIN(ymouse, yslack), area.y); } else { cc->geom.y = area.y; - cc->geom.h = area.h; + cc->geom.h = area.y + area.h; } } } @@ -986,19 +981,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 +1016,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; @@ -1046,19 +1049,23 @@ client_vtile(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_HMAXIMIZED || cc->geom.w + (cc->bwidth * 2) >= area.w) return; @@ -1077,7 +1084,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; |