aboutsummaryrefslogtreecommitdiff
path: root/monsterwm.c
diff options
context:
space:
mode:
authorIvan Kanakarakis <ivan.kanak@gmail.com>2012-01-04 13:45:05 +0200
committerIvan Kanakarakis <ivan.kanak@gmail.com>2012-01-04 13:48:56 +0200
commitb91048246e04bb5c4e66e90d76228d4289ecb483 (patch)
tree11bd67b0e358f9947f0dc2a1bc8270deb750f345 /monsterwm.c
parent6d3d076c870fc26e26518397df4d7eeae421bd81 (diff)
do not tile transient windows
Diffstat (limited to 'monsterwm.c')
-rw-r--r--monsterwm.c42
1 files changed, 25 insertions, 17 deletions
diff --git a/monsterwm.c b/monsterwm.c
index 1315002..5136fcd 100644
--- a/monsterwm.c
+++ b/monsterwm.c
@@ -34,7 +34,7 @@ typedef struct {
typedef struct client {
struct client *next;
- Bool isurgent, isfullscreen;
+ Bool isurgent, istransient, isfullscreen;
Window win;
} client;
@@ -342,11 +342,11 @@ void maprequest(XEvent *e) {
if (wintoclient(ev->window)) return;
Window trans;
- Bool follow = False, winistrans = XGetTransientForHint(dis, ev->window, &trans) && trans;
+ Bool follow = False, istransient = XGetTransientForHint(dis, ev->window, &trans) && trans;
int cd = current_desktop, newdsk = current_desktop;
XClassHint ch = {0, 0};
- if (!winistrans && XGetClassHint(dis, ev->window, &ch))
+ if (!istransient && XGetClassHint(dis, ev->window, &ch))
for (unsigned int i=0; i<LENGTH(rules); i++)
if (!strcmp(ch.res_class, rules[i].class) || !strcmp(ch.res_name, rules[i].class)) {
follow = rules[i].follow;
@@ -360,7 +360,7 @@ void maprequest(XEvent *e) {
add_window(ev->window);
select_desktop(cd);
if (cd == newdsk) {
- if (!winistrans) tile();
+ if (!(current->istransient = istransient)) tile();
XMapWindow(dis, ev->window);
update_current();
} else if (follow) change_desktop(&(Arg){.i = newdsk});
@@ -631,24 +631,32 @@ void tile(void) {
int cx = 0, cy = (TOP_PANEL && showpanel ? PANEL_HEIGHT : 0), cw = 0, ch = 0;
client *c;
- for (n=0, c=head->next; c; c=c->next, ++n); /* count windows on stack */
- if ((mode == TILE || mode == BSTACK) && n > 1) { /* adjust to match screen height/width */
+ for (n=0, c=head->next; c; c=c->next) if (!c->istransient) ++n; /* count windows on stack */
+ if ((mode == TILE || mode == BSTACK) && n > 1) { /* adjust to match screen height/width */
d = (z - growth)%n + growth;
z = (z - growth)/n;
}
- if (!head->next || mode == MONOCLE) {
- for (c=head; c; c=c->next) if (!c->isfullscreen) XMoveResizeWindow(dis, c->win, cx, cy, ww + 2*BORDER_WIDTH, h + 2*BORDER_WIDTH);
+ if (!head->next || head->next->istransient || mode == MONOCLE) {
+ for (c=head; c; c=c->next)
+ if (!c->isfullscreen && !c->istransient)
+ XMoveResizeWindow(dis, c->win, cx, cy, ww + 2*BORDER_WIDTH, h + 2*BORDER_WIDTH);
} else if (mode == TILE) {
- if (!head->isfullscreen) XMoveResizeWindow(dis, head->win, cx, cy, master_size - BORDER_WIDTH, h - BORDER_WIDTH);
- if (!head->next->isfullscreen) XMoveResizeWindow(dis, head->next->win, (cx = master_size + BORDER_WIDTH), cy,
- (cw = ww - master_size - 2*BORDER_WIDTH), (ch = z - BORDER_WIDTH) + d);
- for (cy+=z+d, c=head->next->next; c; c=c->next, cy+=z) if (!c->isfullscreen) XMoveResizeWindow(dis, c->win, cx, cy, cw, ch);
+ if (!head->isfullscreen && !head->istransient)
+ XMoveResizeWindow(dis, head->win, cx, cy, master_size - BORDER_WIDTH, h - BORDER_WIDTH);
+ if (!head->next->isfullscreen && !head->next->istransient)
+ XMoveResizeWindow(dis, head->next->win, (cx = master_size + BORDER_WIDTH), cy,
+ (cw = ww - master_size - 2*BORDER_WIDTH), (ch = z - BORDER_WIDTH) + d);
+ for (cy+=z+d, c=head->next->next; c; c=c->next, cy+=z)
+ if (!c->isfullscreen && !c->istransient) XMoveResizeWindow(dis, c->win, cx, cy, cw, ch);
} else if (mode == BSTACK) {
- if (!head->isfullscreen) XMoveResizeWindow(dis, head->win, cx, cy, ww - BORDER_WIDTH, master_size - BORDER_WIDTH);
- if (!head->next->isfullscreen) XMoveResizeWindow(dis, head->next->win, cx, (cy += master_size + BORDER_WIDTH),
- (cw = z - BORDER_WIDTH) + d, (ch = h - master_size - 2*BORDER_WIDTH));
- for (cx+=z+d, c=head->next->next; c; c=c->next, cx+=z) if (!c->isfullscreen) XMoveResizeWindow(dis, c->win, cx, cy, cw, ch);
+ if (!head->isfullscreen && !head->istransient)
+ XMoveResizeWindow(dis, head->win, cx, cy, ww - BORDER_WIDTH, master_size - BORDER_WIDTH);
+ if (!head->next->isfullscreen && !head->next->istransient)
+ XMoveResizeWindow(dis, head->next->win, cx, (cy += master_size + BORDER_WIDTH),
+ (cw = z - BORDER_WIDTH) + d, (ch = h - master_size - 2*BORDER_WIDTH));
+ for (cx+=z+d, c=head->next->next; c; c=c->next, cx+=z)
+ if (!c->isfullscreen && !c->istransient) XMoveResizeWindow(dis, c->win, cx, cy, cw, ch);
} else if (mode == GRID) {
++n; /* include head on window count */
int cols, rows, cn=0, rn=0, i=0; /* columns, rows, and current column and row number */
@@ -661,7 +669,7 @@ void tile(void) {
ch = h/rows;
cx = 0 + cn*cw;
cy = (TOP_PANEL && showpanel ? PANEL_HEIGHT : 0) + rn*ch;
- if (!c->isfullscreen) XMoveResizeWindow(dis, c->win, cx, cy, cw - 2*BORDER_WIDTH, ch - 2*BORDER_WIDTH);
+ if (!c->isfullscreen && !c->istransient) XMoveResizeWindow(dis, c->win, cx, cy, cw - 2*BORDER_WIDTH, ch - 2*BORDER_WIDTH);
if (++rn >= rows) { rn = 0; cn++; }
}
} else fprintf(stderr, "error: no such layout mode: %d\n", mode);