Compare commits

..

38 Commits
4.5 ... 4.6

Author SHA1 Message Date
13577b15e5 fixed a comment 2007-10-25 10:42:55 +02:00
5473e763f6 also consider width for tile fallback enforcing 2007-10-24 20:34:08 +02:00
cdd6c3e820 removed RESIZEHINTS and enhanced tile for fixed or aspect-ratio'ed clients 2007-10-24 16:26:59 +02:00
29f2b15ddc some cleanup, removed ntags variable, defined NTAGS macro, simplified tag(), view() and idxoftag(), fixed some NULL comparisions 2007-10-24 16:07:43 +02:00
7b65b763bc parenthized use of ISTILE macro in dwm.c 2007-10-23 09:38:47 +02:00
e94774dd69 thx to Toni Lainson 2007-10-19 09:56:51 +02:00
af0034f3a5 fixed two comments 2007-10-18 17:02:19 +02:00
cd7ebaad25 removed dwm.h, just include C-files in config.h if you extend dwm, that's simplier and most flexible than all other possibilities 2007-10-18 10:28:41 +02:00
8dc03d6e6b small cosmetic fix 2007-10-17 14:35:21 +02:00
1dcb18c124 uncommented DEBUG CFLGAS/LDFLAGS 2007-10-17 12:28:34 +02:00
206eb344e2 just making dwm.h saner 2007-10-17 11:19:14 +02:00
04de5720e6 applied Eric Mertens patch to mainstream dwm, however this needs testing 2007-10-16 19:07:51 +02:00
5a04edecb1 cleaned up dwm.c/dwm.h somewhat that it allows easier integration of patches 2007-10-16 19:04:49 +02:00
24c125cc8a small comment 2007-10-11 20:50:01 +02:00
0453c1d180 recreated dwm.h 2007-10-11 20:47:34 +02:00
0b5c14cf59 added Mod1-Tab description to dwm.1 2007-10-10 18:51:03 +02:00
a73de0cff4 added antoszka's viewprev patch with some minor modifications, restored Client->tags as Bool *, however kept the static initialization of ntags and seltags (prevtags) - this seems to be the best compromise 2007-10-10 18:39:28 +02:00
eeea4ef583 applied Brandon MacDone's static initialization patch for seltags and Client->tags 2007-10-06 19:43:15 +02:00
883e09b2eb removing NULL-terminating **tags definition in config.h 2007-10-05 18:30:01 +02:00
7e25897f11 removed two spaces reported by Soleen 2007-10-03 16:25:25 +02:00
95091dcad4 reverted Peters patch to tile, I will discuss the reasons at dwm@ 2007-10-01 21:25:15 +02:00
57676994ea s/xterm/uxterm/ 2007-10-01 15:39:37 +02:00
60adbab726 added hint for downloading dextra 2007-10-01 14:40:53 +02:00
c3eca4d14f fixed font definition 2007-10-01 11:43:53 +02:00
d1f4fbb469 fixed man page 2007-09-30 19:20:05 +02:00
635b64384d fixed an issue in Peter's patch (it is no good idea to restack() all clients on enternotify() 2007-09-30 18:33:05 +02:00
bedbe59aaa applied Peter Hartlich's border collapse patch 2007-09-30 12:47:08 +02:00
3f3086f8b8 improved tile() for the RESIZEHINTS == True case, now more space is consumed by the clients (esp. if those clients use increment handling heavily) 2007-09-27 20:08:21 +02:00
f92a4e45c4 fixed colors 2007-09-27 18:59:47 +02:00
2fc8a13588 fixed inclusion order 2007-09-27 09:14:32 +02:00
63725004f5 updated with my favorite colorscheme 2007-09-26 19:14:22 +02:00
e9348dcaca applied colors depend from lavishs proposal 2007-09-25 20:43:29 +02:00
fa857b2896 switching to white normal bg, renaming tag 9 into www, for static use in conjunction with ff 2007-09-23 18:50:04 +02:00
c77663fcb4 btw 4.6 will be the next release 2007-09-23 11:24:42 +02:00
17d39ee014 renamed config.h into config.def.h, config.h will be created if not present, this seems less annoying after all 2007-09-23 11:24:12 +02:00
8d1810c85b introduced ISTILE, which can be easily extended with other layout functions to allow reuse of setmwfact() and zoom() 2007-09-22 21:55:19 +02:00
60444daa70 setmwfact and zoom check isarrange(floating) now, not !isarrange(tile) - this makes it easier to play well with bstack and nmtile patches 2007-09-22 21:34:06 +02:00
b0477c3017 Added tag 4.5 for changeset 2acc60d6dfe2 2007-09-22 09:13:03 +02:00
7 changed files with 119 additions and 99 deletions

View File

@ -48,3 +48,4 @@ c13cb8c6b7a56af74cc88346e71d2490470b546f 4.2
e0ec0d5d8b1ef3ee04a83c7c0fee5853aa2ac6a6 4.3 e0ec0d5d8b1ef3ee04a83c7c0fee5853aa2ac6a6 4.3
408014d2126153d2b0fce26a13ba707db222b7b9 4.4 408014d2126153d2b0fce26a13ba707db222b7b9 4.4
7c117df5d202530e85066d8b1ab02cef605c79ad 4.4.1 7c117df5d202530e85066d8b1ab02cef605c79ad 4.4.1
2acc60d6dfe28c101a8cd44a8aa710a38ae3607c 4.5

View File

@ -3,7 +3,7 @@
include config.mk include config.mk
SRC += dwm.c SRC = dwm.c
OBJ = ${SRC:.c=.o} OBJ = ${SRC:.c=.o}
all: options dwm all: options dwm
@ -20,6 +20,10 @@ options:
${OBJ}: config.h config.mk ${OBJ}: config.h config.mk
config.h:
@echo creating $@ from config.def.h
@cp config.def.h $@
dwm: ${OBJ} dwm: ${OBJ}
@echo CC -o $@ @echo CC -o $@
@${CC} -o $@ ${OBJ} ${LDFLAGS} @${CC} -o $@ ${OBJ} ${LDFLAGS}
@ -31,7 +35,7 @@ clean:
dist: clean dist: clean
@echo creating dist tarball @echo creating dist tarball
@mkdir -p dwm-${VERSION} @mkdir -p dwm-${VERSION}
@cp -R LICENSE Makefile README config.h config.mk \ @cp -R LICENSE Makefile README config.def.h config.mk \
dwm.1 ${SRC} dwm-${VERSION} dwm.1 ${SRC} dwm-${VERSION}
@tar -cf dwm-${VERSION}.tar dwm-${VERSION} @tar -cf dwm-${VERSION}.tar dwm-${VERSION}
@gzip dwm-${VERSION}.tar @gzip dwm-${VERSION}.tar

3
README
View File

@ -18,6 +18,9 @@ necessary as root):
make clean install make clean install
If you are going to use the default bluegray color scheme it is highly
recommended to also install the bluegray files shipped in the dextra package.
Running dwm Running dwm
----------- -----------

View File

@ -3,33 +3,33 @@
/* appearance */ /* appearance */
#define BARPOS BarTop /* BarBot, BarOff */ #define BARPOS BarTop /* BarBot, BarOff */
#define BORDERPX 1 #define BORDERPX 1
#define FONT "-*-terminus-medium-r-*-*-12-*-*-*-*-*-iso10646-*" #define FONT "-*-terminus-medium-*-*-*-*-*-*-*-*-*-*-*"
#define NORMBORDERCOLOR "#333" #define NORMBORDERCOLOR "#cccccc"
#define NORMBGCOLOR "#000" #define NORMBGCOLOR "#cccccc"
#define NORMFGCOLOR "#ccc" #define NORMFGCOLOR "#000000"
#define SELBORDERCOLOR "#f00" #define SELBORDERCOLOR "#0066ff"
#define SELBGCOLOR "#00f" #define SELBGCOLOR "#0066ff"
#define SELFGCOLOR "#fff" #define SELFGCOLOR "#ffffff"
/* tagging */ /* tagging */
const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL }; const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "www" };
Rule rules[] = { Rule rules[] = {
/* class:instance:title regex tags regex isfloating */ /* class:instance:title regex tags regex isfloating */
{ "Firefox", "3", False }, { "Firefox", "www", False },
{ "Gimp", NULL, True }, { "Gimp", NULL, True },
{ "MPlayer", NULL, True }, { "MPlayer", NULL, True },
{ "Acroread", NULL, True }, { "Acroread", NULL, True },
}; };
/* layout(s) */ /* layout(s) */
#define ISTILE isarrange(tile) /* || isarrange(<custom>) */
#define MWFACT 0.6 /* master width factor [0.1 .. 0.9] */
#define SNAP 32 /* snap pixel */
Layout layouts[] = { Layout layouts[] = {
/* symbol function */ /* symbol function */
{ "[]=", tile }, /* first entry is default */ { "[]=", tile }, /* first entry is default */
{ "><>", floating }, { "><>", floating },
}; };
#define RESIZEHINTS True /* False - respect size hints in tiled resizals */
#define MWFACT 0.6 /* master width factor [0.1 .. 0.9] */
#define SNAP 32 /* snap pixel */
/* key definitions */ /* key definitions */
#define MODKEY Mod1Mask #define MODKEY Mod1Mask
@ -39,8 +39,7 @@ Key keys[] = { \
{ MODKEY, XK_p, spawn, \ { MODKEY, XK_p, spawn, \
"exe=`dmenu_path | dmenu -fn '"FONT"' -nb '"NORMBGCOLOR"' -nf '"NORMFGCOLOR"'" \ "exe=`dmenu_path | dmenu -fn '"FONT"' -nb '"NORMBGCOLOR"' -nf '"NORMFGCOLOR"'" \
" -sb '"SELBGCOLOR"' -sf '"SELFGCOLOR"'` && exec $exe" }, \ " -sb '"SELBGCOLOR"' -sf '"SELFGCOLOR"'` && exec $exe" }, \
{ MODKEY|ShiftMask, XK_Return, spawn, \ { MODKEY|ShiftMask, XK_Return, spawn, "exec uxterm" }, \
"exec xterm -bg '"NORMBGCOLOR"' -fg '"NORMFGCOLOR"' -cr '"NORMFGCOLOR"' +sb -fn '"FONT"'" }, \
{ MODKEY, XK_space, setlayout, NULL }, \ { MODKEY, XK_space, setlayout, NULL }, \
{ MODKEY, XK_b, togglebar, NULL }, \ { MODKEY, XK_b, togglebar, NULL }, \
{ MODKEY, XK_j, focusnext, NULL }, \ { MODKEY, XK_j, focusnext, NULL }, \
@ -49,6 +48,7 @@ Key keys[] = { \
{ MODKEY, XK_l, setmwfact, "+0.05" }, \ { MODKEY, XK_l, setmwfact, "+0.05" }, \
{ MODKEY, XK_m, togglemax, NULL }, \ { MODKEY, XK_m, togglemax, NULL }, \
{ MODKEY, XK_Return, zoom, NULL }, \ { MODKEY, XK_Return, zoom, NULL }, \
{ MODKEY, XK_Tab, viewprevtag, NULL }, \
{ MODKEY|ShiftMask, XK_space, togglefloating, NULL }, \ { MODKEY|ShiftMask, XK_space, togglefloating, NULL }, \
{ MODKEY|ShiftMask, XK_c, killclient, NULL }, \ { MODKEY|ShiftMask, XK_c, killclient, NULL }, \
{ MODKEY, XK_0, view, NULL }, \ { MODKEY, XK_0, view, NULL }, \

View File

@ -1,5 +1,5 @@
# dwm version # dwm version
VERSION = 4.5 VERSION = 4.6
# Customize below to fit your system # Customize below to fit your system
@ -17,7 +17,7 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11
# flags # flags
CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"
LDFLAGS = -s ${LIBS} LDFLAGS = -s ${LIBS}
#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" #CFLAGS = -g -std=c99 -pedantic -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
#LDFLAGS = -g ${LIBS} #LDFLAGS = -g ${LIBS}
# Solaris # Solaris

5
dwm.1
View File

@ -1,4 +1,4 @@
.TH DWM 1 dwm\-4.3 .TH DWM 1 dwm\-VERSION
.SH NAME .SH NAME
dwm \- dynamic window manager dwm \- dynamic window manager
.SH SYNOPSIS .SH SYNOPSIS
@ -59,6 +59,9 @@ Start
.B Mod1\-Return .B Mod1\-Return
Zooms/cycles current window to/from master area (tiled layout only). Zooms/cycles current window to/from master area (tiled layout only).
.TP .TP
.B Mod1\-Tab
Toggles to the previously selected tags.
.TP
.B Mod1\-b .B Mod1\-b
Shows/hides the status bar. Shows/hides the status bar.
.TP .TP

169
dwm.c
View File

@ -27,14 +27,15 @@
*/ */
#include <errno.h> #include <errno.h>
#include <locale.h> #include <locale.h>
#include <regex.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <sys/select.h> #include <sys/select.h>
#include <sys/types.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <regex.h>
#include <X11/cursorfont.h> #include <X11/cursorfont.h>
#include <X11/keysym.h> #include <X11/keysym.h>
#include <X11/Xatom.h> #include <X11/Xatom.h>
@ -62,7 +63,7 @@ struct Client {
int rx, ry, rw, rh; /* revert geometry */ int rx, ry, rw, rh; /* revert geometry */
int basew, baseh, incw, inch, maxw, maxh, minw, minh; int basew, baseh, incw, inch, maxw, maxh, minw, minh;
int minax, maxax, minay, maxay; int minax, maxax, minay, maxay;
long flags; long flags;
unsigned int border, oldborder; unsigned int border, oldborder;
Bool isbanned, isfixed, ismax, isfloating, wasfloating; Bool isbanned, isfixed, ismax, isfloating, wasfloating;
Bool *tags; Bool *tags;
@ -110,7 +111,7 @@ typedef struct {
regex_t *tagregex; regex_t *tagregex;
} Regs; } Regs;
/* forward declarations */ /* function declarations */
void applyrules(Client *c); void applyrules(Client *c);
void arrange(void); void arrange(void);
void attach(Client *c); void attach(Client *c);
@ -184,6 +185,7 @@ void updatebarpos(void);
void updatesizehints(Client *c); void updatesizehints(Client *c);
void updatetitle(Client *c); void updatetitle(Client *c);
void view(const char *arg); void view(const char *arg);
void viewprevtag(const char *arg); /* views previous selected tags */
int xerror(Display *dpy, XErrorEvent *ee); int xerror(Display *dpy, XErrorEvent *ee);
int xerrordummy(Display *dsply, XErrorEvent *ee); int xerrordummy(Display *dsply, XErrorEvent *ee);
int xerrorstart(Display *dsply, XErrorEvent *ee); int xerrorstart(Display *dsply, XErrorEvent *ee);
@ -194,7 +196,7 @@ char stext[256];
double mwfact; double mwfact;
int screen, sx, sy, sw, sh, wax, way, waw, wah; int screen, sx, sy, sw, sh, wax, way, waw, wah;
int (*xerrorxlib)(Display *, XErrorEvent *); int (*xerrorxlib)(Display *, XErrorEvent *);
unsigned int bh, bpos, ntags; unsigned int bh, bpos;
unsigned int blw = 0; unsigned int blw = 0;
unsigned int ltidx = 0; /* default */ unsigned int ltidx = 0; /* default */
unsigned int nlayouts = 0; unsigned int nlayouts = 0;
@ -217,7 +219,6 @@ void (*handler[LASTEvent]) (XEvent *) = {
Atom wmatom[WMLast], netatom[NetLast]; Atom wmatom[WMLast], netatom[NetLast];
Bool otherwm, readin; Bool otherwm, readin;
Bool running = True; Bool running = True;
Bool *seltags;
Bool selscreen = True; Bool selscreen = True;
Client *clients = NULL; Client *clients = NULL;
Client *sel = NULL; Client *sel = NULL;
@ -231,7 +232,11 @@ Regs *regs = NULL;
/* configuration, allows nested code to access above variables */ /* configuration, allows nested code to access above variables */
#include "config.h" #include "config.h"
/* functions*/ #define NTAGS (sizeof tags / sizeof tags[0])
Bool seltags[NTAGS] = {[0] = True};
Bool prevtags[NTAGS] = {[0] = True};
/* function implementations */
void void
applyrules(Client *c) { applyrules(Client *c) {
static char buf[512]; static char buf[512];
@ -248,7 +253,7 @@ applyrules(Client *c) {
for(i = 0; i < nrules; i++) for(i = 0; i < nrules; i++)
if(regs[i].propregex && !regexec(regs[i].propregex, buf, 1, &tmp, 0)) { if(regs[i].propregex && !regexec(regs[i].propregex, buf, 1, &tmp, 0)) {
c->isfloating = rules[i].isfloating; c->isfloating = rules[i].isfloating;
for(j = 0; regs[i].tagregex && j < ntags; j++) { for(j = 0; regs[i].tagregex && j < NTAGS; j++) {
if(!regexec(regs[i].tagregex, tags[j], 1, &tmp, 0)) { if(!regexec(regs[i].tagregex, tags[j], 1, &tmp, 0)) {
matched = True; matched = True;
c->tags[j] = True; c->tags[j] = True;
@ -260,8 +265,7 @@ applyrules(Client *c) {
if(ch.res_name) if(ch.res_name)
XFree(ch.res_name); XFree(ch.res_name);
if(!matched) if(!matched)
for(i = 0; i < ntags; i++) memcpy(c->tags, seltags, sizeof seltags);
c->tags[i] = seltags[i];
} }
void void
@ -308,7 +312,7 @@ buttonpress(XEvent *e) {
if(barwin == ev->window) { if(barwin == ev->window) {
x = 0; x = 0;
for(i = 0; i < ntags; i++) { for(i = 0; i < NTAGS; i++) {
x += textw(tags[i]); x += textw(tags[i]);
if(ev->x < x) { if(ev->x < x) {
if(ev->button == Button1) { if(ev->button == Button1) {
@ -341,7 +345,7 @@ buttonpress(XEvent *e) {
movemouse(c); movemouse(c);
} }
else if(ev->button == Button2) { else if(ev->button == Button2) {
if(isarrange(tile) && !c->isfixed && c->isfloating) if((ISTILE) && !c->isfixed && c->isfloating)
togglefloating(NULL); togglefloating(NULL);
else else
zoom(NULL); zoom(NULL);
@ -392,7 +396,6 @@ cleanup(void) {
XFreeCursor(dpy, cursor[CurMove]); XFreeCursor(dpy, cursor[CurMove]);
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
XSync(dpy, False); XSync(dpy, False);
free(seltags);
} }
void void
@ -533,7 +536,7 @@ drawbar(void) {
int i, x; int i, x;
dc.x = dc.y = 0; dc.x = dc.y = 0;
for(i = 0; i < ntags; i++) { for(i = 0; i < NTAGS; i++) {
dc.w = textw(tags[i]); dc.w = textw(tags[i]);
if(seltags[i]) { if(seltags[i]) {
drawtext(tags[i], dc.sel); drawtext(tags[i], dc.sel);
@ -843,10 +846,8 @@ unsigned int
idxoftag(const char *tag) { idxoftag(const char *tag) {
unsigned int i; unsigned int i;
for(i = 0; i < ntags; i++) for(i = 0; (i < NTAGS) && (tags[i] != tag); i++);
if(tags[i] == tag) return (i < NTAGS) ? i : 0;
return i;
return 0;
} }
void void
@ -926,7 +927,7 @@ Bool
isvisible(Client *c) { isvisible(Client *c) {
unsigned int i; unsigned int i;
for(i = 0; i < ntags; i++) for(i = 0; i < NTAGS; i++)
if(c->tags[i] && seltags[i]) if(c->tags[i] && seltags[i])
return True; return True;
return False; return False;
@ -998,14 +999,13 @@ leavenotify(XEvent *e) {
void void
manage(Window w, XWindowAttributes *wa) { manage(Window w, XWindowAttributes *wa) {
unsigned int i;
Client *c, *t = NULL; Client *c, *t = NULL;
Window trans; Window trans;
Status rettrans; Status rettrans;
XWindowChanges wc; XWindowChanges wc;
c = emallocz(sizeof(Client)); c = emallocz(sizeof(Client));
c->tags = emallocz(ntags * sizeof(Bool)); c->tags = emallocz(sizeof seltags);
c->win = w; c->win = w;
c->x = wa->x; c->x = wa->x;
c->y = wa->y; c->y = wa->y;
@ -1040,8 +1040,7 @@ manage(Window w, XWindowAttributes *wa) {
if((rettrans = XGetTransientForHint(dpy, w, &trans) == Success)) if((rettrans = XGetTransientForHint(dpy, w, &trans) == Success))
for(t = clients; t && t->win != trans; t = t->next); for(t = clients; t && t->win != trans; t = t->next);
if(t) if(t)
for(i = 0; i < ntags; i++) memcpy(c->tags, t->tags, sizeof seltags);
c->tags[i] = t->tags[i];
applyrules(c); applyrules(c);
if(!c->isfloating) if(!c->isfloating)
c->isfloating = (rettrans == Success) || c->isfixed; c->isfloating = (rettrans == Success) || c->isfixed;
@ -1138,7 +1137,7 @@ propertynotify(XEvent *e) {
default: break; default: break;
case XA_WM_TRANSIENT_FOR: case XA_WM_TRANSIENT_FOR:
XGetTransientForHint(dpy, c->win, &trans); XGetTransientForHint(dpy, c->win, &trans);
if(!c->isfloating && (c->isfloating = (getclient(trans) != NULL))) if(!c->isfloating && (c->isfloating = (NULL != getclient(trans))))
arrange(); arrange();
break; break;
case XA_WM_NORMAL_HINTS: case XA_WM_NORMAL_HINTS:
@ -1160,43 +1159,45 @@ quit(const char *arg) {
void void
resize(Client *c, int x, int y, int w, int h, Bool sizehints) { resize(Client *c, int x, int y, int w, int h, Bool sizehints) {
double dx, dy, max, min, ratio; XWindowChanges wc;
XWindowChanges wc;
if(sizehints) { if(sizehints) {
if(c->minay > 0 && c->maxay > 0 && (h - c->baseh) > 0 && (w - c->basew) > 0) { /* set minimum possible */
dx = (double)(w - c->basew); if (w < 1)
dy = (double)(h - c->baseh); w = 1;
min = (double)(c->minax) / (double)(c->minay); if (h < 1)
max = (double)(c->maxax) / (double)(c->maxay); h = 1;
ratio = dx / dy;
if(max > 0 && min > 0 && ratio > 0) { /* temporarily remove base dimensions */
if(ratio < min) { w -= c->basew;
dy = (dx * min + dy) / (min * min + 1); h -= c->baseh;
dx = dy * min;
w = (int)dx + c->basew; /* adjust for aspect limits */
h = (int)dy + c->baseh; if (c->minay > 0 && c->maxay > 0 && c->minax > 0 && c->maxax > 0) {
} if (w * c->maxay > h * c->maxax)
else if(ratio > max) { w = h * c->maxax / c->maxay;
dy = (dx * min + dy) / (max * max + 1); else if (w * c->minay < h * c->minax)
dx = dy * min; h = w * c->minay / c->minax;
w = (int)dx + c->basew;
h = (int)dy + c->baseh;
}
}
} }
if(c->minw && w < c->minw)
w = c->minw; /* adjust for increment value */
if(c->minh && h < c->minh)
h = c->minh;
if(c->maxw && w > c->maxw)
w = c->maxw;
if(c->maxh && h > c->maxh)
h = c->maxh;
if(c->incw) if(c->incw)
w -= (w - c->basew) % c->incw; w -= w % c->incw;
if(c->inch) if(c->inch)
h -= (h - c->baseh) % c->inch; h -= h % c->inch;
/* restore base dimensions */
w += c->basew;
h += c->baseh;
if(c->minw > 0 && w < c->minw)
w = c->minw;
if(c->minh > 0 && h < c->minh)
h = c->minh;
if(c->maxw > 0 && w > c->maxw)
w = c->maxw;
if(c->maxh > 0 && h > c->maxh)
h = c->maxh;
} }
if(w <= 0 || h <= 0) if(w <= 0 || h <= 0)
return; return;
@ -1398,7 +1399,7 @@ void
setmwfact(const char *arg) { setmwfact(const char *arg) {
double delta; double delta;
if(!isarrange(tile)) if(!(ISTILE))
return; return;
/* arg handling, manipulate mwfact */ /* arg handling, manipulate mwfact */
if(arg == NULL) if(arg == NULL)
@ -1466,9 +1467,6 @@ setup(void) {
/* init tags */ /* init tags */
compileregs(); compileregs();
for(ntags = 0; tags[ntags]; ntags++);
seltags = emallocz(sizeof(Bool) * ntags);
seltags[0] = True;
/* init appearance */ /* init appearance */
dc.norm[ColBorder] = getcolor(NORMBORDERCOLOR); dc.norm[ColBorder] = getcolor(NORMBORDERCOLOR);
@ -1541,11 +1539,9 @@ tag(const char *arg) {
if(!sel) if(!sel)
return; return;
for(i = 0; i < ntags; i++) for(i = 0; i < NTAGS; i++)
sel->tags[i] = arg == NULL; sel->tags[i] = (NULL == arg);
i = idxoftag(arg); sel->tags[idxoftag(arg)] = True;
if(i >= 0 && i < ntags)
sel->tags[i] = True;
arrange(); arrange();
} }
@ -1568,7 +1564,7 @@ textw(const char *text) {
void void
tile(void) { tile(void) {
unsigned int i, n, nx, ny, nw, nh, mw, th; unsigned int i, n, nx, ny, nw, nh, mw, th;
Client *c; Client *c, *mc;
for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
n++; n++;
@ -1581,7 +1577,8 @@ tile(void) {
nx = wax; nx = wax;
ny = way; ny = way;
for(i = 0, c = nexttiled(clients); c; c = nexttiled(c->next), i++) { nw = 0; /* gcc stupidity requires this */
for(i = 0, c = mc = nexttiled(clients); c; c = nexttiled(c->next), i++) {
c->ismax = False; c->ismax = False;
if(i == 0) { /* master */ if(i == 0) { /* master */
nw = mw - 2 * c->border; nw = mw - 2 * c->border;
@ -1590,17 +1587,20 @@ tile(void) {
else { /* tile window */ else { /* tile window */
if(i == 1) { if(i == 1) {
ny = way; ny = way;
nx += mw; nx += mc->w + 2 * mc->border;
nw = waw - nx - 2 * c->border;
} }
nw = waw - mw - 2 * c->border;
if(i + 1 == n) /* remainder */ if(i + 1 == n) /* remainder */
nh = (way + wah) - ny - 2 * c->border; nh = (way + wah) - ny - 2 * c->border;
else else
nh = th - 2 * c->border; nh = th - 2 * c->border;
} }
resize(c, nx, ny, nw, nh, RESIZEHINTS); resize(c, nx, ny, nw, nh, True);
if((c->h < bh) || (c->h > nh) || (c->w < bh) || (c->w > nw))
/* client doesn't accept size constraints */
resize(c, nx, ny, nw, nh, False);
if(n > 1 && th != wah) if(n > 1 && th != wah)
ny += nh + 2 * c->border; ny = c->y + c->h + 2 * c->border;
} }
} }
@ -1660,9 +1660,9 @@ toggletag(const char *arg) {
return; return;
i = idxoftag(arg); i = idxoftag(arg);
sel->tags[i] = !sel->tags[i]; sel->tags[i] = !sel->tags[i];
for(j = 0; j < ntags && !sel->tags[j]; j++); for(j = 0; j < NTAGS && !sel->tags[j]; j++);
if(j == ntags) if(j == NTAGS)
sel->tags[i] = True; sel->tags[i] = True; /* at least one tag must be enabled */
arrange(); arrange();
} }
@ -1672,8 +1672,8 @@ toggleview(const char *arg) {
i = idxoftag(arg); i = idxoftag(arg);
seltags[i] = !seltags[i]; seltags[i] = !seltags[i];
for(j = 0; j < ntags && !seltags[j]; j++); for(j = 0; j < NTAGS && !seltags[j]; j++);
if(j == ntags) if(j == NTAGS)
seltags[i] = True; /* at least one tag must be viewed */ seltags[i] = True; /* at least one tag must be viewed */
arrange(); arrange();
} }
@ -1838,11 +1838,20 @@ void
view(const char *arg) { view(const char *arg) {
unsigned int i; unsigned int i;
for(i = 0; i < ntags; i++) memcpy(prevtags, seltags, sizeof seltags);
for(i = 0; i < NTAGS; i++)
seltags[i] = arg == NULL; seltags[i] = arg == NULL;
i = idxoftag(arg); seltags[idxoftag(arg)] = True;
if(i >= 0 && i < ntags) arrange();
seltags[i] = True; }
void
viewprevtag(const char *arg) {
static Bool tmptags[sizeof tags / sizeof tags[0]];
memcpy(tmptags, seltags, sizeof seltags);
memcpy(seltags, prevtags, sizeof seltags);
memcpy(prevtags, tmptags, sizeof seltags);
arrange(); arrange();
} }
@ -1850,7 +1859,7 @@ void
zoom(const char *arg) { zoom(const char *arg) {
Client *c; Client *c;
if(!sel || !isarrange(tile) || sel->isfloating) if(!sel || !(ISTILE) || sel->isfloating)
return; return;
if((c = sel) == nexttiled(clients)) if((c = sel) == nexttiled(clients))
if(!(c = nexttiled(c->next))) if(!(c = nexttiled(c->next)))