parent
595028614b
commit
aa13727067
5 changed files with 266 additions and 258 deletions
@ -0,0 +1,253 @@ |
|||||||
|
/*
|
||||||
|
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> |
||||||
|
* See LICENSE file for license details. |
||||||
|
*/ |
||||||
|
#include "dwm.h" |
||||||
|
|
||||||
|
/* extern */ |
||||||
|
|
||||||
|
void (*arrange)(Arg *) = DEFMODE; |
||||||
|
|
||||||
|
void |
||||||
|
dofloat(Arg *arg) |
||||||
|
{ |
||||||
|
Client *c; |
||||||
|
|
||||||
|
for(c = clients; c; c = c->next) { |
||||||
|
c->ismax = False; |
||||||
|
if(isvisible(c)) { |
||||||
|
resize(c, True, TopLeft); |
||||||
|
} |
||||||
|
else |
||||||
|
ban(c); |
||||||
|
} |
||||||
|
if(!sel || !isvisible(sel)) |
||||||
|
sel = getnext(clients); |
||||||
|
if(sel) |
||||||
|
focus(sel); |
||||||
|
else |
||||||
|
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); |
||||||
|
restack(); |
||||||
|
} |
||||||
|
|
||||||
|
void |
||||||
|
dotile(Arg *arg) |
||||||
|
{ |
||||||
|
int h, i, n, w; |
||||||
|
Client *c; |
||||||
|
|
||||||
|
w = sw - mw; |
||||||
|
for(n = 0, c = clients; c; c = c->next) |
||||||
|
if(isvisible(c) && !c->isfloat) |
||||||
|
n++; |
||||||
|
|
||||||
|
if(n > 1) |
||||||
|
h = (sh - bh) / (n - 1); |
||||||
|
else |
||||||
|
h = sh - bh; |
||||||
|
|
||||||
|
for(i = 0, c = clients; c; c = c->next) { |
||||||
|
c->ismax = False; |
||||||
|
if(isvisible(c)) { |
||||||
|
if(c->isfloat) { |
||||||
|
resize(c, True, TopLeft); |
||||||
|
continue; |
||||||
|
} |
||||||
|
if(n == 1) { |
||||||
|
c->x = sx; |
||||||
|
c->y = sy + bh; |
||||||
|
c->w = sw - 2; |
||||||
|
c->h = sh - 2 - bh; |
||||||
|
} |
||||||
|
else if(i == 0) { |
||||||
|
c->x = sx; |
||||||
|
c->y = sy + bh; |
||||||
|
c->w = mw - 2; |
||||||
|
c->h = sh - 2 - bh; |
||||||
|
} |
||||||
|
else if(h > bh) { |
||||||
|
c->x = sx + mw; |
||||||
|
c->y = sy + (i - 1) * h + bh; |
||||||
|
c->w = w - 2; |
||||||
|
if(i + 1 == n) |
||||||
|
c->h = sh - c->y - 2; |
||||||
|
else |
||||||
|
c->h = h - 2; |
||||||
|
} |
||||||
|
else { /* fallback if h < bh */ |
||||||
|
c->x = sx + mw; |
||||||
|
c->y = sy + bh; |
||||||
|
c->w = w - 2; |
||||||
|
c->h = sh - 2 - bh; |
||||||
|
} |
||||||
|
resize(c, False, TopLeft); |
||||||
|
i++; |
||||||
|
} |
||||||
|
else |
||||||
|
ban(c); |
||||||
|
} |
||||||
|
if(!sel || !isvisible(sel)) |
||||||
|
sel = getnext(clients); |
||||||
|
if(sel) |
||||||
|
focus(sel); |
||||||
|
else |
||||||
|
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); |
||||||
|
restack(); |
||||||
|
} |
||||||
|
|
||||||
|
void |
||||||
|
focusnext(Arg *arg) |
||||||
|
{ |
||||||
|
Client *c; |
||||||
|
|
||||||
|
if(!sel) |
||||||
|
return; |
||||||
|
|
||||||
|
if(!(c = getnext(sel->next))) |
||||||
|
c = getnext(clients); |
||||||
|
if(c) { |
||||||
|
focus(c); |
||||||
|
restack(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void |
||||||
|
focusprev(Arg *arg) |
||||||
|
{ |
||||||
|
Client *c; |
||||||
|
|
||||||
|
if(!sel) |
||||||
|
return; |
||||||
|
|
||||||
|
if(!(c = getprev(sel->prev))) { |
||||||
|
for(c = clients; c && c->next; c = c->next); |
||||||
|
c = getprev(c); |
||||||
|
} |
||||||
|
if(c) { |
||||||
|
focus(c); |
||||||
|
restack(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
Bool |
||||||
|
isvisible(Client *c) |
||||||
|
{ |
||||||
|
unsigned int i; |
||||||
|
|
||||||
|
for(i = 0; i < ntags; i++) |
||||||
|
if(c->tags[i] && seltag[i]) |
||||||
|
return True; |
||||||
|
return False; |
||||||
|
} |
||||||
|
|
||||||
|
void |
||||||
|
restack() |
||||||
|
{ |
||||||
|
static unsigned int nwins = 0; |
||||||
|
static Window *wins = NULL; |
||||||
|
unsigned int f, fi, m, mi, n; |
||||||
|
Client *c; |
||||||
|
XEvent ev; |
||||||
|
|
||||||
|
for(f = 0, m = 0, c = clients; c; c = c->next) |
||||||
|
if(isvisible(c)) { |
||||||
|
if(c->isfloat || arrange == dofloat) |
||||||
|
f++; |
||||||
|
else |
||||||
|
m++; |
||||||
|
} |
||||||
|
if(!(n = 2 * (f + m))) { |
||||||
|
drawstatus(); |
||||||
|
return; |
||||||
|
} |
||||||
|
if(nwins < n) { |
||||||
|
nwins = n; |
||||||
|
wins = erealloc(wins, nwins * sizeof(Window)); |
||||||
|
} |
||||||
|
|
||||||
|
fi = 0; |
||||||
|
mi = 2 * f; |
||||||
|
if(sel->isfloat || arrange == dofloat) { |
||||||
|
wins[fi++] = sel->title; |
||||||
|
wins[fi++] = sel->win; |
||||||
|
} |
||||||
|
else { |
||||||
|
wins[mi++] = sel->title; |
||||||
|
wins[mi++] = sel->win; |
||||||
|
} |
||||||
|
for(c = clients; c; c = c->next) |
||||||
|
if(isvisible(c) && c != sel) { |
||||||
|
if(c->isfloat || arrange == dofloat) { |
||||||
|
wins[fi++] = c->title; |
||||||
|
wins[fi++] = c->win; |
||||||
|
} |
||||||
|
else { |
||||||
|
wins[mi++] = c->title; |
||||||
|
wins[mi++] = c->win; |
||||||
|
} |
||||||
|
} |
||||||
|
XRestackWindows(dpy, wins, n); |
||||||
|
drawall(); |
||||||
|
XSync(dpy, False); |
||||||
|
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); |
||||||
|
} |
||||||
|
|
||||||
|
void |
||||||
|
togglemode(Arg *arg) |
||||||
|
{ |
||||||
|
arrange = arrange == dofloat ? dotile : dofloat; |
||||||
|
if(sel) |
||||||
|
arrange(NULL); |
||||||
|
else |
||||||
|
drawstatus(); |
||||||
|
} |
||||||
|
|
||||||
|
void |
||||||
|
toggleview(Arg *arg) |
||||||
|
{ |
||||||
|
unsigned int i; |
||||||
|
|
||||||
|
seltag[arg->i] = !seltag[arg->i]; |
||||||
|
for(i = 0; i < ntags && !seltag[i]; i++); |
||||||
|
if(i == ntags) |
||||||
|
seltag[arg->i] = True; /* cannot toggle last view */ |
||||||
|
arrange(NULL); |
||||||
|
} |
||||||
|
|
||||||
|
void |
||||||
|
view(Arg *arg) |
||||||
|
{ |
||||||
|
unsigned int i; |
||||||
|
|
||||||
|
for(i = 0; i < ntags; i++) |
||||||
|
seltag[i] = False; |
||||||
|
seltag[arg->i] = True; |
||||||
|
arrange(NULL); |
||||||
|
} |
||||||
|
|
||||||
|
void |
||||||
|
zoom(Arg *arg) |
||||||
|
{ |
||||||
|
Client *c; |
||||||
|
|
||||||
|
if(!sel || (arrange != dotile) || sel->isfloat || sel->ismax) |
||||||
|
return; |
||||||
|
|
||||||
|
if(sel == getnext(clients)) { |
||||||
|
if((c = getnext(sel->next))) |
||||||
|
sel = c; |
||||||
|
else |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
/* pop */ |
||||||
|
sel->prev->next = sel->next; |
||||||
|
if(sel->next) |
||||||
|
sel->next->prev = sel->prev; |
||||||
|
sel->prev = NULL; |
||||||
|
clients->prev = sel; |
||||||
|
sel->next = clients; |
||||||
|
clients = sel; |
||||||
|
focus(sel); |
||||||
|
arrange(NULL); |
||||||
|
} |
Loading…
Reference in new issue