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
408014d2126153d2b0fce26a13ba707db222b7b9 4.4
7c117df5d202530e85066d8b1ab02cef605c79ad 4.4.1
2acc60d6dfe28c101a8cd44a8aa710a38ae3607c 4.5

View File

@ -3,7 +3,7 @@
include config.mk
SRC += dwm.c
SRC = dwm.c
OBJ = ${SRC:.c=.o}
all: options dwm
@ -20,6 +20,10 @@ options:
${OBJ}: config.h config.mk
config.h:
@echo creating $@ from config.def.h
@cp config.def.h $@
dwm: ${OBJ}
@echo CC -o $@
@${CC} -o $@ ${OBJ} ${LDFLAGS}
@ -31,7 +35,7 @@ clean:
dist: clean
@echo creating dist tarball
@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}
@tar -cf dwm-${VERSION}.tar dwm-${VERSION}
@gzip dwm-${VERSION}.tar

3
README
View File

@ -18,6 +18,9 @@ necessary as root):
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
-----------

View File

@ -3,33 +3,33 @@
/* appearance */
#define BARPOS BarTop /* BarBot, BarOff */
#define BORDERPX 1
#define FONT "-*-terminus-medium-r-*-*-12-*-*-*-*-*-iso10646-*"
#define NORMBORDERCOLOR "#333"
#define NORMBGCOLOR "#000"
#define NORMFGCOLOR "#ccc"
#define SELBORDERCOLOR "#f00"
#define SELBGCOLOR "#00f"
#define SELFGCOLOR "#fff"
#define FONT "-*-terminus-medium-*-*-*-*-*-*-*-*-*-*-*"
#define NORMBORDERCOLOR "#cccccc"
#define NORMBGCOLOR "#cccccc"
#define NORMFGCOLOR "#000000"
#define SELBORDERCOLOR "#0066ff"
#define SELBGCOLOR "#0066ff"
#define SELFGCOLOR "#ffffff"
/* 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[] = {
/* class:instance:title regex tags regex isfloating */
{ "Firefox", "3", False },
{ "Firefox", "www", False },
{ "Gimp", NULL, True },
{ "MPlayer", NULL, True },
{ "Acroread", NULL, True },
};
/* 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[] = {
/* symbol function */
{ "[]=", tile }, /* first entry is default */
{ "><>", 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 */
#define MODKEY Mod1Mask
@ -39,8 +39,7 @@ Key keys[] = { \
{ MODKEY, XK_p, spawn, \
"exe=`dmenu_path | dmenu -fn '"FONT"' -nb '"NORMBGCOLOR"' -nf '"NORMFGCOLOR"'" \
" -sb '"SELBGCOLOR"' -sf '"SELFGCOLOR"'` && exec $exe" }, \
{ MODKEY|ShiftMask, XK_Return, spawn, \
"exec xterm -bg '"NORMBGCOLOR"' -fg '"NORMFGCOLOR"' -cr '"NORMFGCOLOR"' +sb -fn '"FONT"'" }, \
{ MODKEY|ShiftMask, XK_Return, spawn, "exec uxterm" }, \
{ MODKEY, XK_space, setlayout, NULL }, \
{ MODKEY, XK_b, togglebar, NULL }, \
{ MODKEY, XK_j, focusnext, NULL }, \
@ -49,6 +48,7 @@ Key keys[] = { \
{ MODKEY, XK_l, setmwfact, "+0.05" }, \
{ MODKEY, XK_m, togglemax, NULL }, \
{ MODKEY, XK_Return, zoom, NULL }, \
{ MODKEY, XK_Tab, viewprevtag, NULL }, \
{ MODKEY|ShiftMask, XK_space, togglefloating, NULL }, \
{ MODKEY|ShiftMask, XK_c, killclient, NULL }, \
{ MODKEY, XK_0, view, NULL }, \

View File

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

5
dwm.1
View File

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

169
dwm.c
View File

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