diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | client.c | 61 | ||||
-rw-r--r-- | dwm.h | 22 | ||||
-rw-r--r-- | tag.c | 186 | ||||
-rw-r--r-- | view.c | 253 |
5 files changed, 266 insertions, 258 deletions
diff --git a/Makefile b/Makefile index 066643e..ad8ec08 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ include config.mk -SRC = client.c draw.c event.c main.c tag.c util.c +SRC = client.c draw.c event.c main.c tag.c util.c view.c OBJ = ${SRC:.c=.o} all: options dwm diff --git a/client.c b/client.c index eb23452..af0190f 100644 --- a/client.c +++ b/client.c @@ -89,40 +89,6 @@ focus(Client *c) XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); } -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(); - } -} - Client * getclient(Window w) { @@ -446,30 +412,3 @@ unmanage(Client *c) focus(sel); 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); -} diff --git a/dwm.h b/dwm.h index c4594fc..b96facd 100644 --- a/dwm.h +++ b/dwm.h @@ -84,8 +84,6 @@ extern Window root, barwin; /* client.c */ extern void ban(Client *c); extern void focus(Client *c); -extern void focusnext(Arg *arg); -extern void focusprev(Arg *arg); extern Client *getclient(Window w); extern Client *getctitle(Window w); extern void gravitate(Client *c, Bool invert); @@ -96,7 +94,6 @@ extern void setsize(Client *c); extern void settitle(Client *c); extern void togglemax(Arg *arg); extern void unmanage(Client *c); -extern void zoom(Arg *arg); /* draw.c */ extern void drawall(); @@ -117,22 +114,27 @@ extern void sendevent(Window w, Atom a, long value); extern int xerror(Display *dsply, XErrorEvent *ee); /* tag.c */ -extern void dofloat(Arg *arg); -extern void dotile(Arg *arg); extern void initrregs(); -extern Bool isvisible(Client *c); extern Client *getnext(Client *c); extern Client *getprev(Client *c); -extern void restack(); extern void settags(Client *c); extern void tag(Arg *arg); -extern void togglemode(Arg *arg); extern void toggletag(Arg *arg); -extern void toggleview(Arg *arg); -extern void view(Arg *arg); /* util.c */ extern void *emallocz(unsigned int size); extern void eprint(const char *errstr, ...); extern void *erealloc(void *ptr, unsigned int size); extern void spawn(Arg *arg); + +/* view.c */ +extern void dofloat(Arg *arg); +extern void dotile(Arg *arg); +extern void focusnext(Arg *arg); +extern void focusprev(Arg *arg); +extern Bool isvisible(Client *c); +extern void restack(); +extern void togglemode(Arg *arg); +extern void toggleview(Arg *arg); +extern void view(Arg *arg); +extern void zoom(Arg *arg); diff --git a/tag.c b/tag.c index cdb0f52..bc36f08 100644 --- a/tag.c +++ b/tag.c @@ -30,97 +30,8 @@ RULES static RReg *rreg = NULL; static unsigned int len = 0; -void (*arrange)(Arg *) = DEFMODE; - /* extern */ -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(); -} - Client * getnext(Client *c) { @@ -164,69 +75,6 @@ initrregs() } } -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 settags(Client *c) { @@ -277,16 +125,6 @@ tag(Arg *arg) } void -togglemode(Arg *arg) -{ - arrange = arrange == dofloat ? dotile : dofloat; - if(sel) - arrange(NULL); - else - drawstatus(); -} - -void toggletag(Arg *arg) { unsigned int i; @@ -302,27 +140,3 @@ toggletag(Arg *arg) if(!isvisible(sel)) arrange(NULL); } - - -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); -} diff --git a/view.c b/view.c new file mode 100644 index 0000000..d9aa6e4 --- /dev/null +++ b/view.c @@ -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); +} |