tmerged tag.c, view.c and tile.c to manage.c - dwm - [fork] customized build of… | |
git clone git://src.adamsgaard.dk/dwm | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 4cdbd523e5f02f7cf392dda8690f95ce6eaff9dd | |
parent b3d7e07f18f0f69f8c3b3542615da62dfc4c6175 | |
Author: Anselm R. Garbe <[email protected]> | |
Date: Mon, 19 Feb 2007 14:44:05 +0100 | |
merged tag.c, view.c and tile.c to manage.c | |
Diffstat: | |
M Makefile | 2 +- | |
M dwm.h | 36 +++++++++++++----------------… | |
A manage.c | 418 +++++++++++++++++++++++++++++… | |
D tag.c | 121 -----------------------------… | |
D tile.c | 131 -----------------------------… | |
D view.c | 184 -----------------------------… | |
6 files changed, 434 insertions(+), 458 deletions(-) | |
--- | |
diff --git a/Makefile b/Makefile | |
t@@ -3,7 +3,7 @@ | |
include config.mk | |
-SRC = client.c draw.c event.c main.c tile.c tag.c util.c view.c | |
+SRC = client.c draw.c event.c main.c manage.c util.c | |
OBJ = ${SRC:.c=.o} | |
all: options dwm | |
diff --git a/dwm.h b/dwm.h | |
t@@ -101,7 +101,6 @@ extern Window root, barwin; | |
/* client.c */ | |
extern void configure(Client *c); /* send synthetic configure e… | |
extern void focus(Client *c); /* focus c, c may be NULL… | |
-extern Bool isprotodel(Client *c); /* returns True if c->win su… | |
extern void killclient(Arg *arg); /* kill c nicely */ | |
extern void manage(Window w, XWindowAttributes *wa); /* manage new clie… | |
extern void resize(Client *c, int x, int y, | |
t@@ -125,36 +124,31 @@ extern void quit(Arg *arg); /* qu… | |
extern void sendevent(Window w, Atom a, long value); /* send synthetic … | |
extern int xerror(Display *dsply, XErrorEvent *ee); /* dwm's X error ha… | |
-/* tag.c */ | |
-extern void compileregexps(void); /* initialize regexps of rule… | |
-extern void settags(Client *c, Client *trans); /* sets tags of c */ | |
-extern void tag(Arg *arg); /* tags c with arg's index */ | |
-extern void toggletag(Arg *arg); /* toggles c tags with arg's i… | |
- | |
-/* tile.c */ | |
-extern void dotile(void); /* arranges all windows tiled… | |
-extern void incnmaster(Arg *arg); /* increments nmaster with ar… | |
-extern void resizemaster(Arg *arg); /* resizes the master perce… | |
-extern void zoom(Arg *arg); /* zooms the focused client… | |
- | |
-/* util.c */ | |
-extern void *emallocz(unsigned int size); /* allocates zero-initialized… | |
-extern void eprint(const char *errstr, ...); /* prints errstr and exits… | |
-extern void spawn(Arg *arg); /* forks a new subprocess … | |
- | |
-/* view.c */ | |
+/* manage.c */ | |
extern void attach(Client *c); /* attaches c to global … | |
extern void attachstack(Client *c); /* attaches client to stack… | |
-extern void dofloat(void); /* arranges all windows floa… | |
+extern void compileregexps(void); /* initialize regexps of rule… | |
extern void detach(Client *c); /* detaches c from globa… | |
extern void detachstack(Client *c); /* detaches client from sta… | |
+extern void dofloat(void); /* arranges all windows floa… | |
+extern void dotile(void); /* arranges all windows tiled… | |
extern void focusnext(Arg *arg); /* focuses next visible client… | |
extern void focusprev(Arg *arg); /* focuses previous visible cl… | |
extern Client *getclient(Window w); /* return client of w */ | |
+extern void incnmaster(Arg *arg); /* increments nmaster with ar… | |
extern Bool isvisible(Client *c); /* returns True if client is … | |
-extern Client *nextmanaged(Client *c); /* returns managed succe… | |
+extern void resizemaster(Arg *arg); /* resizes the master perce… | |
extern void restack(void); /* restores z layers of all … | |
+extern void settags(Client *c, Client *trans); /* sets tags of c */ | |
+extern void tag(Arg *arg); /* tags c with arg's index */ | |
extern void togglefloat(Arg *arg); /* toggles focusesd client b… | |
extern void togglemode(Arg *arg); /* toggles global arrange fun… | |
+extern void toggletag(Arg *arg); /* toggles c tags with arg's i… | |
extern void toggleview(Arg *arg); /* toggles the tag with arg's… | |
extern void view(Arg *arg); /* views the tag with arg's… | |
+extern void zoom(Arg *arg); /* zooms the focused client… | |
+ | |
+/* util.c */ | |
+extern void *emallocz(unsigned int size); /* allocates zero-initialized… | |
+extern void eprint(const char *errstr, ...); /* prints errstr and exits… | |
+extern void spawn(Arg *arg); /* forks a new subprocess … | |
diff --git a/manage.c b/manage.c | |
t@@ -0,0 +1,418 @@ | |
+/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com> | |
+ * See LICENSE file for license details. | |
+ */ | |
+#include "dwm.h" | |
+#include <regex.h> | |
+#include <stdio.h> | |
+#include <stdlib.h> | |
+#include <string.h> | |
+#include <sys/types.h> | |
+#include <X11/Xutil.h> | |
+ | |
+void (*arrange)(void) = DEFMODE; | |
+unsigned int master = MASTER; | |
+unsigned int nmaster = NMASTER; | |
+ | |
+/* static */ | |
+ | |
+typedef struct { | |
+ const char *clpattern; | |
+ const char *tpattern; | |
+ Bool isfloat; | |
+} Rule; | |
+ | |
+typedef struct { | |
+ regex_t *clregex; | |
+ regex_t *tregex; | |
+} RReg; | |
+ | |
+TAGS | |
+RULES | |
+ | |
+static RReg *rreg = NULL; | |
+static unsigned int len = 0; | |
+ | |
+static Client * | |
+nextmanaged(Client *c) { | |
+ for(; c && (c->isfloat || !isvisible(c)); c = c->next); | |
+ return c; | |
+} | |
+ | |
+static void | |
+togglemax(Client *c) { | |
+ XEvent ev; | |
+ | |
+ if(c->isfixed) | |
+ return; | |
+ if((c->ismax = !c->ismax)) { | |
+ c->rx = c->x; | |
+ c->ry = c->y; | |
+ c->rw = c->w; | |
+ c->rh = c->h; | |
+ resize(c, wax, way, waw - 2 * BORDERPX, wah - 2 * BORDERPX, Tr… | |
+ } | |
+ else | |
+ resize(c, c->rx, c->ry, c->rw, c->rh, True); | |
+ while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | |
+} | |
+ | |
+/* extern */ | |
+ | |
+void | |
+attach(Client *c) { | |
+ if(clients) | |
+ clients->prev = c; | |
+ c->next = clients; | |
+ clients = c; | |
+} | |
+ | |
+void | |
+attachstack(Client *c) { | |
+ c->snext = stack; | |
+ stack = c; | |
+} | |
+ | |
+void | |
+compileregexps(void) { | |
+ unsigned int i; | |
+ regex_t *reg; | |
+ | |
+ if(rreg) | |
+ return; | |
+ len = sizeof rule / sizeof rule[0]; | |
+ rreg = emallocz(len * sizeof(RReg)); | |
+ for(i = 0; i < len; i++) { | |
+ if(rule[i].clpattern) { | |
+ reg = emallocz(sizeof(regex_t)); | |
+ if(regcomp(reg, rule[i].clpattern, REG_EXTENDED)) | |
+ free(reg); | |
+ else | |
+ rreg[i].clregex = reg; | |
+ } | |
+ if(rule[i].tpattern) { | |
+ reg = emallocz(sizeof(regex_t)); | |
+ if(regcomp(reg, rule[i].tpattern, REG_EXTENDED)) | |
+ free(reg); | |
+ else | |
+ rreg[i].tregex = reg; | |
+ } | |
+ } | |
+} | |
+ | |
+void | |
+detach(Client *c) { | |
+ if(c->prev) | |
+ c->prev->next = c->next; | |
+ if(c->next) | |
+ c->next->prev = c->prev; | |
+ if(c == clients) | |
+ clients = c->next; | |
+ c->next = c->prev = NULL; | |
+} | |
+ | |
+void | |
+detachstack(Client *c) { | |
+ Client **tc; | |
+ for(tc=&stack; *tc && *tc != c; tc=&(*tc)->snext); | |
+ *tc = c->snext; | |
+} | |
+ | |
+void | |
+dofloat(void) { | |
+ Client *c; | |
+ | |
+ for(c = clients; c; c = c->next) { | |
+ if(isvisible(c)) { | |
+ if(c->isbanned) | |
+ XMoveWindow(dpy, c->win, c->x, c->y); | |
+ c->isbanned = False; | |
+ resize(c, c->x, c->y, c->w, c->h, True); | |
+ } | |
+ else { | |
+ c->isbanned = True; | |
+ XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); | |
+ } | |
+ } | |
+ if(!sel || !isvisible(sel)) { | |
+ for(c = stack; c && !isvisible(c); c = c->snext); | |
+ focus(c); | |
+ } | |
+ restack(); | |
+} | |
+void | |
+dotile(void) { | |
+ unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th; | |
+ Client *c; | |
+ | |
+ for(n = 0, c = nextmanaged(clients); c; c = nextmanaged(c->next)) | |
+ n++; | |
+ /* window geoms */ | |
+ mh = (n > nmaster) ? wah / nmaster : wah / (n > 0 ? n : 1); | |
+ mw = (n > nmaster) ? (waw * master) / 1000 : waw; | |
+ th = (n > nmaster) ? wah / (n - nmaster) : 0; | |
+ tw = waw - mw; | |
+ | |
+ for(i = 0, c = clients; c; c = c->next) | |
+ if(isvisible(c)) { | |
+ if(c->isbanned) | |
+ XMoveWindow(dpy, c->win, c->x, c->y); | |
+ c->isbanned = False; | |
+ if(c->isfloat) | |
+ continue; | |
+ c->ismax = False; | |
+ nx = wax; | |
+ ny = way; | |
+ if(i < nmaster) { | |
+ ny += i * mh; | |
+ nw = mw - 2 * BORDERPX; | |
+ nh = mh - 2 * BORDERPX; | |
+ } | |
+ else { /* tile window */ | |
+ nx += mw; | |
+ nw = tw - 2 * BORDERPX; | |
+ if(th > 2 * BORDERPX) { | |
+ ny += (i - nmaster) * th; | |
+ nh = th - 2 * BORDERPX; | |
+ } | |
+ else /* fallback if th <= 2 * BORDERPX */ | |
+ nh = wah - 2 * BORDERPX; | |
+ } | |
+ resize(c, nx, ny, nw, nh, False); | |
+ i++; | |
+ } | |
+ else { | |
+ c->isbanned = True; | |
+ XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); | |
+ } | |
+ if(!sel || !isvisible(sel)) { | |
+ for(c = stack; c && !isvisible(c); c = c->snext); | |
+ focus(c); | |
+ } | |
+ restack(); | |
+} | |
+ | |
+void | |
+focusnext(Arg *arg) { | |
+ Client *c; | |
+ | |
+ if(!sel) | |
+ return; | |
+ for(c = sel->next; c && !isvisible(c); c = c->next); | |
+ if(!c) | |
+ for(c = clients; c && !isvisible(c); c = c->next); | |
+ if(c) { | |
+ focus(c); | |
+ restack(); | |
+ } | |
+} | |
+ | |
+void | |
+focusprev(Arg *arg) { | |
+ Client *c; | |
+ | |
+ if(!sel) | |
+ return; | |
+ for(c = sel->prev; c && !isvisible(c); c = c->prev); | |
+ if(!c) { | |
+ for(c = clients; c && c->next; c = c->next); | |
+ for(; c && !isvisible(c); c = c->prev); | |
+ } | |
+ if(c) { | |
+ focus(c); | |
+ restack(); | |
+ } | |
+} | |
+ | |
+Client * | |
+getclient(Window w) { | |
+ Client *c; | |
+ | |
+ for(c = clients; c; c = c->next) | |
+ if(c->win == w) | |
+ return c; | |
+ return NULL; | |
+} | |
+ | |
+void | |
+incnmaster(Arg *arg) { | |
+ if((arrange == dofloat) || (nmaster + arg->i < 1) | |
+ || (wah / (nmaster + arg->i) <= 2 * BORDERPX)) | |
+ return; | |
+ nmaster += arg->i; | |
+ if(sel) | |
+ arrange(); | |
+ else | |
+ drawstatus(); | |
+} | |
+ | |
+Bool | |
+isvisible(Client *c) { | |
+ unsigned int i; | |
+ | |
+ for(i = 0; i < ntags; i++) | |
+ if(c->tags[i] && seltag[i]) | |
+ return True; | |
+ return False; | |
+} | |
+ | |
+void | |
+resizemaster(Arg *arg) { | |
+ if(arrange != dotile) | |
+ return; | |
+ if(arg->i == 0) | |
+ master = MASTER; | |
+ else { | |
+ if(waw * (master + arg->i) / 1000 >= waw - 2 * BORDERPX | |
+ || waw * (master + arg->i) / 1000 <= 2 * BORDERPX) | |
+ return; | |
+ master += arg->i; | |
+ } | |
+ arrange(); | |
+} | |
+ | |
+void | |
+restack(void) { | |
+ Client *c; | |
+ XEvent ev; | |
+ | |
+ drawstatus(); | |
+ if(!sel) | |
+ return; | |
+ if(sel->isfloat || arrange == dofloat) | |
+ XRaiseWindow(dpy, sel->win); | |
+ if(arrange != dofloat) { | |
+ if(!sel->isfloat) | |
+ XLowerWindow(dpy, sel->win); | |
+ for(c = nextmanaged(clients); c; c = nextmanaged(c->next)) { | |
+ if(c == sel) | |
+ continue; | |
+ XLowerWindow(dpy, c->win); | |
+ } | |
+ } | |
+ XSync(dpy, False); | |
+ while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | |
+} | |
+ | |
+void | |
+settags(Client *c, Client *trans) { | |
+ char prop[512]; | |
+ unsigned int i, j; | |
+ regmatch_t tmp; | |
+ Bool matched = trans != NULL; | |
+ XClassHint ch = { 0 }; | |
+ | |
+ if(matched) | |
+ for(i = 0; i < ntags; i++) | |
+ c->tags[i] = trans->tags[i]; | |
+ else { | |
+ XGetClassHint(dpy, c->win, &ch); | |
+ snprintf(prop, sizeof prop, "%s:%s:%s", | |
+ ch.res_class ? ch.res_class : "", | |
+ ch.res_name ? ch.res_name : "", c->name); | |
+ for(i = 0; i < len; i++) | |
+ if(rreg[i].clregex && !regexec(rreg[i].clregex, prop, … | |
+ c->isfloat = rule[i].isfloat; | |
+ for(j = 0; rreg[i].tregex && j < ntags; j++) { | |
+ if(!regexec(rreg[i].tregex, tags[j], 1… | |
+ matched = True; | |
+ c->tags[j] = True; | |
+ } | |
+ } | |
+ } | |
+ if(ch.res_class) | |
+ XFree(ch.res_class); | |
+ if(ch.res_name) | |
+ XFree(ch.res_name); | |
+ } | |
+ if(!matched) | |
+ for(i = 0; i < ntags; i++) | |
+ c->tags[i] = seltag[i]; | |
+} | |
+ | |
+void | |
+tag(Arg *arg) { | |
+ unsigned int i; | |
+ | |
+ if(!sel) | |
+ return; | |
+ for(i = 0; i < ntags; i++) | |
+ sel->tags[i] = (arg->i == -1) ? True : False; | |
+ if(arg->i >= 0 && arg->i < ntags) | |
+ sel->tags[arg->i] = True; | |
+ arrange(); | |
+} | |
+ | |
+void | |
+togglefloat(Arg *arg) { | |
+ if(!sel || arrange == dofloat) | |
+ return; | |
+ sel->isfloat = !sel->isfloat; | |
+ arrange(); | |
+} | |
+ | |
+void | |
+toggletag(Arg *arg) { | |
+ unsigned int i; | |
+ | |
+ if(!sel) | |
+ return; | |
+ sel->tags[arg->i] = !sel->tags[arg->i]; | |
+ for(i = 0; i < ntags && !sel->tags[i]; i++); | |
+ if(i == ntags) | |
+ sel->tags[arg->i] = True; | |
+ arrange(); | |
+} | |
+ | |
+void | |
+togglemode(Arg *arg) { | |
+ arrange = (arrange == dofloat) ? dotile : dofloat; | |
+ if(sel) | |
+ arrange(); | |
+ 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(); | |
+} | |
+ | |
+void | |
+view(Arg *arg) { | |
+ unsigned int i; | |
+ | |
+ for(i = 0; i < ntags; i++) | |
+ seltag[i] = (arg->i == -1) ? True : False; | |
+ if(arg->i >= 0 && arg->i < ntags) | |
+ seltag[arg->i] = True; | |
+ arrange(); | |
+} | |
+ | |
+void | |
+zoom(Arg *arg) { | |
+ unsigned int n; | |
+ Client *c; | |
+ | |
+ if(!sel) | |
+ return; | |
+ if(sel->isfloat || (arrange == dofloat)) { | |
+ togglemax(sel); | |
+ return; | |
+ } | |
+ for(n = 0, c = nextmanaged(clients); c; c = nextmanaged(c->next)) | |
+ n++; | |
+ | |
+ if((c = sel) == nextmanaged(clients)) | |
+ if(!(c = nextmanaged(c->next))) | |
+ return; | |
+ detach(c); | |
+ attach(c); | |
+ focus(c); | |
+ arrange(); | |
+} | |
diff --git a/tag.c b/tag.c | |
t@@ -1,121 +0,0 @@ | |
-/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com> | |
- * See LICENSE file for license details. | |
- */ | |
-#include "dwm.h" | |
-#include <regex.h> | |
-#include <stdio.h> | |
-#include <stdlib.h> | |
-#include <string.h> | |
-#include <sys/types.h> | |
-#include <X11/Xutil.h> | |
- | |
- | |
-typedef struct { | |
- const char *clpattern; | |
- const char *tpattern; | |
- Bool isfloat; | |
-} Rule; | |
- | |
-typedef struct { | |
- regex_t *clregex; | |
- regex_t *tregex; | |
-} RReg; | |
- | |
-/* static */ | |
- | |
-TAGS | |
-RULES | |
- | |
-static RReg *rreg = NULL; | |
-static unsigned int len = 0; | |
- | |
-/* extern */ | |
- | |
-void | |
-compileregexps(void) { | |
- unsigned int i; | |
- regex_t *reg; | |
- | |
- if(rreg) | |
- return; | |
- len = sizeof rule / sizeof rule[0]; | |
- rreg = emallocz(len * sizeof(RReg)); | |
- for(i = 0; i < len; i++) { | |
- if(rule[i].clpattern) { | |
- reg = emallocz(sizeof(regex_t)); | |
- if(regcomp(reg, rule[i].clpattern, REG_EXTENDED)) | |
- free(reg); | |
- else | |
- rreg[i].clregex = reg; | |
- } | |
- if(rule[i].tpattern) { | |
- reg = emallocz(sizeof(regex_t)); | |
- if(regcomp(reg, rule[i].tpattern, REG_EXTENDED)) | |
- free(reg); | |
- else | |
- rreg[i].tregex = reg; | |
- } | |
- } | |
-} | |
- | |
-void | |
-settags(Client *c, Client *trans) { | |
- char prop[512]; | |
- unsigned int i, j; | |
- regmatch_t tmp; | |
- Bool matched = trans != NULL; | |
- XClassHint ch = { 0 }; | |
- | |
- if(matched) | |
- for(i = 0; i < ntags; i++) | |
- c->tags[i] = trans->tags[i]; | |
- else { | |
- XGetClassHint(dpy, c->win, &ch); | |
- snprintf(prop, sizeof prop, "%s:%s:%s", | |
- ch.res_class ? ch.res_class : "", | |
- ch.res_name ? ch.res_name : "", c->name); | |
- for(i = 0; i < len; i++) | |
- if(rreg[i].clregex && !regexec(rreg[i].clregex, prop, … | |
- c->isfloat = rule[i].isfloat; | |
- for(j = 0; rreg[i].tregex && j < ntags; j++) { | |
- if(!regexec(rreg[i].tregex, tags[j], 1… | |
- matched = True; | |
- c->tags[j] = True; | |
- } | |
- } | |
- } | |
- if(ch.res_class) | |
- XFree(ch.res_class); | |
- if(ch.res_name) | |
- XFree(ch.res_name); | |
- } | |
- if(!matched) | |
- for(i = 0; i < ntags; i++) | |
- c->tags[i] = seltag[i]; | |
-} | |
- | |
-void | |
-tag(Arg *arg) { | |
- unsigned int i; | |
- | |
- if(!sel) | |
- return; | |
- for(i = 0; i < ntags; i++) | |
- sel->tags[i] = (arg->i == -1) ? True : False; | |
- if(arg->i >= 0 && arg->i < ntags) | |
- sel->tags[arg->i] = True; | |
- arrange(); | |
-} | |
- | |
-void | |
-toggletag(Arg *arg) { | |
- unsigned int i; | |
- | |
- if(!sel) | |
- return; | |
- sel->tags[arg->i] = !sel->tags[arg->i]; | |
- for(i = 0; i < ntags && !sel->tags[i]; i++); | |
- if(i == ntags) | |
- sel->tags[arg->i] = True; | |
- arrange(); | |
-} | |
diff --git a/tile.c b/tile.c | |
t@@ -1,131 +0,0 @@ | |
-/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com> | |
- * See LICENSE file for license details. | |
- */ | |
-#include "dwm.h" | |
- | |
-unsigned int master = MASTER; | |
-unsigned int nmaster = NMASTER; | |
- | |
-/* static */ | |
- | |
-static void | |
-togglemax(Client *c) { | |
- XEvent ev; | |
- | |
- if(c->isfixed) | |
- return; | |
- if((c->ismax = !c->ismax)) { | |
- c->rx = c->x; | |
- c->ry = c->y; | |
- c->rw = c->w; | |
- c->rh = c->h; | |
- resize(c, wax, way, waw - 2 * BORDERPX, wah - 2 * BORDERPX, Tr… | |
- } | |
- else | |
- resize(c, c->rx, c->ry, c->rw, c->rh, True); | |
- while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | |
-} | |
- | |
-/* extern */ | |
- | |
-void | |
-dotile(void) { | |
- unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th; | |
- Client *c; | |
- | |
- for(n = 0, c = nextmanaged(clients); c; c = nextmanaged(c->next)) | |
- n++; | |
- /* window geoms */ | |
- mh = (n > nmaster) ? wah / nmaster : wah / (n > 0 ? n : 1); | |
- mw = (n > nmaster) ? (waw * master) / 1000 : waw; | |
- th = (n > nmaster) ? wah / (n - nmaster) : 0; | |
- tw = waw - mw; | |
- | |
- for(i = 0, c = clients; c; c = c->next) | |
- if(isvisible(c)) { | |
- if(c->isbanned) | |
- XMoveWindow(dpy, c->win, c->x, c->y); | |
- c->isbanned = False; | |
- if(c->isfloat) | |
- continue; | |
- c->ismax = False; | |
- nx = wax; | |
- ny = way; | |
- if(i < nmaster) { | |
- ny += i * mh; | |
- nw = mw - 2 * BORDERPX; | |
- nh = mh - 2 * BORDERPX; | |
- } | |
- else { /* tile window */ | |
- nx += mw; | |
- nw = tw - 2 * BORDERPX; | |
- if(th > 2 * BORDERPX) { | |
- ny += (i - nmaster) * th; | |
- nh = th - 2 * BORDERPX; | |
- } | |
- else /* fallback if th <= 2 * BORDERPX */ | |
- nh = wah - 2 * BORDERPX; | |
- } | |
- resize(c, nx, ny, nw, nh, False); | |
- i++; | |
- } | |
- else { | |
- c->isbanned = True; | |
- XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); | |
- } | |
- if(!sel || !isvisible(sel)) { | |
- for(c = stack; c && !isvisible(c); c = c->snext); | |
- focus(c); | |
- } | |
- restack(); | |
-} | |
- | |
-void | |
-incnmaster(Arg *arg) { | |
- if((arrange == dofloat) || (nmaster + arg->i < 1) | |
- || (wah / (nmaster + arg->i) <= 2 * BORDERPX)) | |
- return; | |
- nmaster += arg->i; | |
- if(sel) | |
- arrange(); | |
- else | |
- drawstatus(); | |
-} | |
- | |
-void | |
-resizemaster(Arg *arg) { | |
- if(arrange != dotile) | |
- return; | |
- if(arg->i == 0) | |
- master = MASTER; | |
- else { | |
- if(waw * (master + arg->i) / 1000 >= waw - 2 * BORDERPX | |
- || waw * (master + arg->i) / 1000 <= 2 * BORDERPX) | |
- return; | |
- master += arg->i; | |
- } | |
- arrange(); | |
-} | |
- | |
-void | |
-zoom(Arg *arg) { | |
- unsigned int n; | |
- Client *c; | |
- | |
- if(!sel) | |
- return; | |
- if(sel->isfloat || (arrange == dofloat)) { | |
- togglemax(sel); | |
- return; | |
- } | |
- for(n = 0, c = nextmanaged(clients); c; c = nextmanaged(c->next)) | |
- n++; | |
- | |
- if((c = sel) == nextmanaged(clients)) | |
- if(!(c = nextmanaged(c->next))) | |
- return; | |
- detach(c); | |
- attach(c); | |
- focus(c); | |
- arrange(); | |
-} | |
diff --git a/view.c b/view.c | |
t@@ -1,184 +0,0 @@ | |
-/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com> | |
- * See LICENSE file for license details. | |
- */ | |
-#include "dwm.h" | |
- | |
-/* extern */ | |
- | |
-void (*arrange)(void) = DEFMODE; | |
- | |
-void | |
-attach(Client *c) { | |
- if(clients) | |
- clients->prev = c; | |
- c->next = clients; | |
- clients = c; | |
-} | |
- | |
-void | |
-attachstack(Client *c) { | |
- c->snext = stack; | |
- stack = c; | |
-} | |
- | |
-void | |
-dofloat(void) { | |
- Client *c; | |
- | |
- for(c = clients; c; c = c->next) { | |
- if(isvisible(c)) { | |
- if(c->isbanned) | |
- XMoveWindow(dpy, c->win, c->x, c->y); | |
- c->isbanned = False; | |
- resize(c, c->x, c->y, c->w, c->h, True); | |
- } | |
- else { | |
- c->isbanned = True; | |
- XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); | |
- } | |
- } | |
- if(!sel || !isvisible(sel)) { | |
- for(c = stack; c && !isvisible(c); c = c->snext); | |
- focus(c); | |
- } | |
- restack(); | |
-} | |
- | |
-void | |
-detach(Client *c) { | |
- if(c->prev) | |
- c->prev->next = c->next; | |
- if(c->next) | |
- c->next->prev = c->prev; | |
- if(c == clients) | |
- clients = c->next; | |
- c->next = c->prev = NULL; | |
-} | |
- | |
-void | |
-detachstack(Client *c) { | |
- Client **tc; | |
- for(tc=&stack; *tc && *tc != c; tc=&(*tc)->snext); | |
- *tc = c->snext; | |
-} | |
- | |
-void | |
-focusnext(Arg *arg) { | |
- Client *c; | |
- | |
- if(!sel) | |
- return; | |
- for(c = sel->next; c && !isvisible(c); c = c->next); | |
- if(!c) | |
- for(c = clients; c && !isvisible(c); c = c->next); | |
- if(c) { | |
- focus(c); | |
- restack(); | |
- } | |
-} | |
- | |
-void | |
-focusprev(Arg *arg) { | |
- Client *c; | |
- | |
- if(!sel) | |
- return; | |
- for(c = sel->prev; c && !isvisible(c); c = c->prev); | |
- if(!c) { | |
- for(c = clients; c && c->next; c = c->next); | |
- for(; c && !isvisible(c); c = c->prev); | |
- } | |
- if(c) { | |
- focus(c); | |
- restack(); | |
- } | |
-} | |
- | |
-Client * | |
-getclient(Window w) { | |
- Client *c; | |
- | |
- for(c = clients; c; c = c->next) | |
- if(c->win == w) | |
- return c; | |
- return NULL; | |
-} | |
- | |
-Bool | |
-isvisible(Client *c) { | |
- unsigned int i; | |
- | |
- for(i = 0; i < ntags; i++) | |
- if(c->tags[i] && seltag[i]) | |
- return True; | |
- return False; | |
-} | |
- | |
-Client * | |
-nextmanaged(Client *c) { | |
- for(; c && (c->isfloat || !isvisible(c)); c = c->next); | |
- return c; | |
-} | |
- | |
-void | |
-restack(void) { | |
- Client *c; | |
- XEvent ev; | |
- | |
- drawstatus(); | |
- if(!sel) | |
- return; | |
- if(sel->isfloat || arrange == dofloat) | |
- XRaiseWindow(dpy, sel->win); | |
- if(arrange != dofloat) { | |
- if(!sel->isfloat) | |
- XLowerWindow(dpy, sel->win); | |
- for(c = nextmanaged(clients); c; c = nextmanaged(c->next)) { | |
- if(c == sel) | |
- continue; | |
- XLowerWindow(dpy, c->win); | |
- } | |
- } | |
- XSync(dpy, False); | |
- while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | |
-} | |
- | |
-void | |
-togglefloat(Arg *arg) { | |
- if(!sel || arrange == dofloat) | |
- return; | |
- sel->isfloat = !sel->isfloat; | |
- arrange(); | |
-} | |
- | |
-void | |
-togglemode(Arg *arg) { | |
- arrange = (arrange == dofloat) ? dotile : dofloat; | |
- if(sel) | |
- arrange(); | |
- 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(); | |
-} | |
- | |
-void | |
-view(Arg *arg) { | |
- unsigned int i; | |
- | |
- for(i = 0; i < ntags; i++) | |
- seltag[i] = (arg->i == -1) ? True : False; | |
- if(arg->i >= 0 && arg->i < ntags) | |
- seltag[arg->i] = True; | |
- arrange(); | |
-} | |
- |