Compare commits

...

23 Commits
0.2 ... 0.3

Author SHA1 Message Date
d34b4c7b9a some changes in the html page 2006-07-19 14:44:24 +02:00
1f9614f82e prepared 0.3 2006-07-19 14:43:17 +02:00
4491bdda69 fixed the bug mentioned by Sander 2006-07-19 14:11:27 +02:00
8af1d97332 refactored Sanders code somewhat 2006-07-19 13:52:31 +02:00
79cd408844 implemented fallback for too many clients in stacked mode 2006-07-19 13:36:04 +02:00
18be893b66 and another fix... 2006-07-19 13:30:18 +02:00
0fb1842fd0 yet another typo fix 2006-07-19 13:29:45 +02:00
f522930a99 fixed a typo 2006-07-19 13:24:58 +02:00
aebd745f72 floating clients get random (x,y) offsets now 2006-07-19 13:22:49 +02:00
c53980cddc applied Sanders resize patch, fixed lower bug 2006-07-19 11:31:04 +02:00
95e56ffc0d changed CFLAGs 2006-07-18 17:54:55 +02:00
f1294353f2 firefox instance is different now 2006-07-18 15:10:57 +02:00
6649dcce6d changed occurrences of wmii.de into 10kloc.org in dwm.html, because 10kloc.org is already working 2006-07-18 13:01:33 +02:00
58f2fe3f6a implemened distinguishing float/managed geometries of clients (works quite well) 2006-07-18 12:36:57 +02:00
0aaa9a21f3 pop on heretag 2006-07-18 11:45:32 +02:00
4f8b08d330 added heretag command which allows to tag a client of a foreign tag with current tag 2006-07-18 11:38:31 +02:00
849e631510 using EXIT_stuff in exit() now 2006-07-18 08:18:54 +02:00
789717d109 simplified Makefile 2006-07-17 18:49:13 +02:00
605630c145 added new stuff 2006-07-17 16:46:42 +02:00
1e7e57dad3 updated html 2006-07-17 11:56:27 +02:00
eb184e02ea patched dwm 2006-07-17 11:36:07 +02:00
ed41473634 updated README 2006-07-17 10:09:57 +02:00
ee5ba14431 Added tag 0.2 for changeset 0a6472e2203994bc5738d40a340d26f7ec9d6062 2006-07-17 10:00:59 +02:00
13 changed files with 292 additions and 187 deletions

View File

@ -1 +1,2 @@
d31b5ad96b0ba7b5b0a30928fcf000428339a577 0.1 d31b5ad96b0ba7b5b0a30928fcf000428339a577 0.1
0a6472e2203994bc5738d40a340d26f7ec9d6062 0.2

View File

@ -8,10 +8,10 @@ OBJ = ${SRC:.c=.o}
MAN1 = dwm.1 MAN1 = dwm.1
BIN = dwm BIN = dwm
all: config dwm all: options dwm
@echo finished @echo finished
config: options:
@echo dwm build options: @echo dwm build options:
@echo "LIBS = ${LIBS}" @echo "LIBS = ${LIBS}"
@echo "CFLAGS = ${CFLAGS}" @echo "CFLAGS = ${CFLAGS}"

4
README
View File

@ -36,5 +36,5 @@ This will start dwm on display :1 of the host foo.bar.
Configuration Configuration
------------- -------------
The configuration of dwm is done by customizing the wm.h source file. To The configuration of dwm is done by customizing source code,
customize the key bindings edit dev.c. grep for CUSTOMIZE keyword.

171
client.c
View File

@ -16,16 +16,20 @@ resizetitle(Client *c)
{ {
int i; int i;
c->tw = 0; c->bw = 0;
for(i = 0; i < TLast; i++) for(i = 0; i < TLast; i++)
if(c->tags[i]) if(c->tags[i])
c->tw += textw(c->tags[i]); c->bw += textw(c->tags[i]);
c->tw += textw(c->name); c->bw += textw(c->name);
if(c->tw > c->w) if(c->bw > *c->w)
c->tw = c->w + 2; c->bw = *c->w + 2;
c->tx = c->x + c->w - c->tw + 2; c->bx = *c->x + *c->w - c->bw + 2;
c->ty = c->y; c->by = *c->y;
XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th); if(c->tags[tsel])
XMoveResizeWindow(dpy, c->title, c->bx, c->by, c->bw, c->bh);
else
XMoveResizeWindow(dpy, c->title, c->bx + 2 * sw, c->by, c->bw, c->bh);
} }
static int static int
@ -39,8 +43,8 @@ xerrordummy(Display *dsply, XErrorEvent *ee)
void void
ban(Client *c) ban(Client *c)
{ {
XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); XMoveWindow(dpy, c->win, *c->x + 2 * sw, *c->y);
XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty); XMoveWindow(dpy, c->title, c->bx + 2 * sw, c->by);
} }
void void
@ -66,8 +70,8 @@ focusnext(Arg *arg)
if(!sel) if(!sel)
return; return;
if(!(c = getnext(sel->next))) if(!(c = getnext(sel->next, tsel)))
c = getnext(clients); c = getnext(clients, tsel);
if(c) { if(c) {
higher(c); higher(c);
c->revert = sel; c->revert = sel;
@ -124,12 +128,12 @@ gravitate(Client *c, Bool invert)
case EastGravity: case EastGravity:
case CenterGravity: case CenterGravity:
case WestGravity: case WestGravity:
dy = -(c->h / 2) + c->border; dy = -(*c->h / 2) + c->border;
break; break;
case SouthEastGravity: case SouthEastGravity:
case SouthGravity: case SouthGravity:
case SouthWestGravity: case SouthWestGravity:
dy = -c->h; dy = -(*c->h);
break; break;
default: default:
break; break;
@ -145,12 +149,12 @@ gravitate(Client *c, Bool invert)
case NorthGravity: case NorthGravity:
case CenterGravity: case CenterGravity:
case SouthGravity: case SouthGravity:
dx = -(c->w / 2) + c->border; dx = -(*c->w / 2) + c->border;
break; break;
case NorthEastGravity: case NorthEastGravity:
case EastGravity: case EastGravity:
case SouthEastGravity: case SouthEastGravity:
dx = -(c->w + c->border); dx = -(*c->w + c->border);
break; break;
default: default:
break; break;
@ -160,8 +164,8 @@ gravitate(Client *c, Bool invert)
dx = -dx; dx = -dx;
dy = -dy; dy = -dy;
} }
c->x += dx; *c->x += dx;
c->y += dy; *c->y += dy;
} }
void void
@ -192,19 +196,27 @@ lower(Client *c)
void void
manage(Window w, XWindowAttributes *wa) manage(Window w, XWindowAttributes *wa)
{ {
int diff;
Client *c; Client *c;
XSetWindowAttributes twa; XSetWindowAttributes twa;
Window trans; Window trans;
c = emallocz(sizeof(Client)); c = emallocz(sizeof(Client));
c->win = w; c->win = w;
c->tx = c->x = wa->x; c->bx = c->fx = c->tx = wa->x;
c->ty = c->y = wa->y; c->by = c->fy = c->ty = wa->y;
if(c->y < bh) c->bw = c->fw = c->tw = wa->width;
c->ty = c->y += bh; c->fh = c->th = wa->height;
c->tw = c->w = wa->width; c->bh = bh;
c->h = wa->height;
c->th = bh; diff = sw - c->fw;
c->fx = random() % (diff ? diff : 1);
diff = sh - c->fh - bh;
c->fy = random() % (diff ? diff : 1);
if(c->fy < bh)
c->by = c->fy = c->ty = bh;
c->border = 1; c->border = 1;
c->proto = getproto(c->win); c->proto = getproto(c->win);
setsize(c); setsize(c);
@ -215,12 +227,11 @@ manage(Window w, XWindowAttributes *wa)
twa.background_pixmap = ParentRelative; twa.background_pixmap = ParentRelative;
twa.event_mask = ExposureMask; twa.event_mask = ExposureMask;
c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th, c->title = XCreateWindow(dpy, root, c->bx, c->by, c->bw, c->bh,
0, DefaultDepth(dpy, screen), CopyFromParent, 0, DefaultDepth(dpy, screen), CopyFromParent,
DefaultVisual(dpy, screen), DefaultVisual(dpy, screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa); CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
settitle(c);
settags(c); settags(c);
c->next = clients; c->next = clients;
@ -239,7 +250,11 @@ manage(Window w, XWindowAttributes *wa)
c->isfloat = trans c->isfloat = trans
|| ((c->maxw == c->minw) && (c->maxh == c->minh)); || ((c->maxw == c->minw) && (c->maxh == c->minh));
setgeom(c);
settitle(c);
arrange(NULL); arrange(NULL);
/* mapping the window now prevents flicker */ /* mapping the window now prevents flicker */
if(c->tags[tsel]) { if(c->tags[tsel]) {
XMapRaised(dpy, c->win); XMapRaised(dpy, c->win);
@ -247,10 +262,8 @@ manage(Window w, XWindowAttributes *wa)
focus(c); focus(c);
} }
else { else {
ban(c);
XMapRaised(dpy, c->win); XMapRaised(dpy, c->win);
XMapRaised(dpy, c->title); XMapRaised(dpy, c->title);
XSync(dpy, False);
} }
} }
@ -259,47 +272,67 @@ maximize(Arg *arg)
{ {
if(!sel) if(!sel)
return; return;
sel->x = sx; *sel->x = sx;
sel->y = sy + bh; *sel->y = sy + bh;
sel->w = sw - 2 * sel->border; *sel->w = sw - 2 * sel->border;
sel->h = sh - 2 * sel->border - bh; *sel->h = sh - 2 * sel->border - bh;
higher(sel); higher(sel);
resize(sel, False); resize(sel, False, TopLeft);
} }
void void
resize(Client *c, Bool inc) pop(Client *c)
{
Client **l;
for(l = &clients; *l && *l != c; l = &(*l)->next);
*l = c->next;
c->next = clients; /* pop */
clients = c;
arrange(NULL);
}
void
resize(Client *c, Bool inc, Corner sticky)
{ {
XConfigureEvent e; XConfigureEvent e;
int right = *c->x + *c->w;
int bottom = *c->y + *c->h;
if(inc) { if(inc) {
if(c->incw) if(c->incw)
c->w -= (c->w - c->basew) % c->incw; *c->w -= (*c->w - c->basew) % c->incw;
if(c->inch) if(c->inch)
c->h -= (c->h - c->baseh) % c->inch; *c->h -= (*c->h - c->baseh) % c->inch;
} }
if(c->x > sw) /* might happen on restart */ if(*c->x > sw) /* might happen on restart */
c->x = sw - c->w; *c->x = sw - *c->w;
if(c->y > sh) if(*c->y > sh)
c->ty = c->y = sh - c->h; *c->y = sh - *c->h;
if(c->minw && c->w < c->minw) if(c->minw && *c->w < c->minw)
c->w = c->minw; *c->w = c->minw;
if(c->minh && c->h < c->minh) if(c->minh && *c->h < c->minh)
c->h = c->minh; *c->h = c->minh;
if(c->maxw && c->w > c->maxw) if(c->maxw && *c->w > c->maxw)
c->w = c->maxw; *c->w = c->maxw;
if(c->maxh && c->h > c->maxh) if(c->maxh && *c->h > c->maxh)
c->h = c->maxh; *c->h = c->maxh;
if(sticky == TopRight || sticky == BotRight)
*c->x = right - *c->w;
if(sticky == BotLeft || sticky == BotRight)
*c->y = bottom - *c->h;
resizetitle(c); resizetitle(c);
XSetWindowBorderWidth(dpy, c->win, 1); XSetWindowBorderWidth(dpy, c->win, 1);
XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); XMoveResizeWindow(dpy, c->win, *c->x, *c->y, *c->w, *c->h);
e.type = ConfigureNotify; e.type = ConfigureNotify;
e.event = c->win; e.event = c->win;
e.window = c->win; e.window = c->win;
e.x = c->x; e.x = *c->x;
e.y = c->y; e.y = *c->y;
e.width = c->w; e.width = *c->w;
e.height = c->h; e.height = *c->h;
e.border_width = c->border; e.border_width = c->border;
e.above = None; e.above = None;
e.override_redirect = False; e.override_redirect = False;
@ -307,6 +340,23 @@ resize(Client *c, Bool inc)
XSync(dpy, False); XSync(dpy, False);
} }
void
setgeom(Client *c)
{
if((arrange == dotile) && !c->isfloat) {
c->x = &c->tx;
c->y = &c->ty;
c->w = &c->tw;
c->h = &c->th;
}
else {
c->x = &c->fx;
c->y = &c->fy;
c->w = &c->fw;
c->h = &c->fh;
}
}
void void
setsize(Client *c) setsize(Client *c)
{ {
@ -405,21 +455,16 @@ unmanage(Client *c)
void void
zoom(Arg *arg) zoom(Arg *arg)
{ {
Client **l, *c; Client *c;
if(!sel) if(!sel)
return; return;
if(sel == getnext(clients) && sel->next) { if(sel == getnext(clients, tsel) && sel->next) {
if((c = getnext(sel->next))) if((c = getnext(sel->next, tsel)))
sel = c; sel = c;
} }
for(l = &clients; *l && *l != sel; l = &(*l)->next); pop(sel);
*l = sel->next;
sel->next = clients; /* pop */
clients = sel;
arrange(NULL);
focus(sel); focus(sel);
} }

View File

@ -2,24 +2,23 @@
# paths # paths
PREFIX = /usr/local PREFIX = /usr/local
CONFPREFIX = ${PREFIX}/etc
MANPREFIX = ${PREFIX}/share/man MANPREFIX = ${PREFIX}/share/man
X11INC = /usr/X11R6/include X11INC = /usr/X11R6/include
X11LIB = /usr/X11R6/lib X11LIB = /usr/X11R6/lib
VERSION = 0.2 VERSION = 0.3
# includes and libs # includes and libs
LIBS = -L${PREFIX}/lib -L/usr/lib -lc -L${X11LIB} -lX11 LIBS = -L${PREFIX}/lib -L/usr/lib -lc -L${X11LIB} -lX11
# Linux/BSD # Linux/BSD
#CFLAGS = -Os -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \ CFLAGS = -Os -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \
# -DVERSION=\"${VERSION}\"
#LDFLAGS = ${LIBS}
CFLAGS = -g -Wall -O2 -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \
-DVERSION=\"${VERSION}\" -DVERSION=\"${VERSION}\"
LDFLAGS = -g ${LIBS} LDFLAGS = ${LIBS}
#CFLAGS = -g -Wall -O2 -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \
# -DVERSION=\"${VERSION}\"
#LDFLAGS = -g ${LIBS}
# Solaris # Solaris

2
draw.c
View File

@ -97,7 +97,7 @@ drawall()
{ {
Client *c; Client *c;
for(c = clients; c; c = getnext(c->next)) for(c = clients; c; c = getnext(c->next, tsel))
drawtitle(c); drawtitle(c);
drawstatus(); drawstatus();
} }

10
dwm.1
View File

@ -90,7 +90,15 @@ Lock
.B Control-[0..n] .B Control-[0..n]
Append Append
.B nth .B nth
tag to cureent tag to current
.B window
.TP
.B Control-Shift-[0..n]
Replace current
.B window
of
.B nth
tag with current tag.
.B window .B window
.TP .TP
.B Control-Button1 .B Control-Button1

18
dwm.h
View File

@ -25,8 +25,9 @@ enum { Tscratch, Tdev, Twww, Twork, TLast };
/********** CUSTOMIZE **********/ /********** CUSTOMIZE **********/
typedef union Arg Arg; typedef union Arg Arg;
typedef struct DC DC;
typedef struct Client Client; typedef struct Client Client;
typedef enum Corner Corner;
typedef struct DC DC;
typedef struct Fnt Fnt; typedef struct Fnt Fnt;
typedef struct Key Key; typedef struct Key Key;
typedef struct Rule Rule; typedef struct Rule Rule;
@ -43,6 +44,8 @@ enum { WMProtocols, WMDelete, WMLast };
/* cursor */ /* cursor */
enum { CurNormal, CurResize, CurMove, CurLast }; enum { CurNormal, CurResize, CurMove, CurLast };
enum Corner { TopLeft, TopRight, BotLeft, BotRight };
struct Fnt { struct Fnt {
int ascent; int ascent;
int descent; int descent;
@ -65,8 +68,10 @@ struct Client {
char name[256]; char name[256];
char *tags[TLast]; char *tags[TLast];
int proto; int proto;
int x, y, w, h; int *x, *y, *w, *h; /* current geom */
int tx, ty, tw, th; int bx, by, bw, bh; /* title bar */
int fx, fy, fw, fh; /* floating geom */
int tx, ty, tw, th; /* tiled geom */
int basew, baseh, incw, inch, maxw, maxh, minw, minh; int basew, baseh, incw, inch, maxw, maxh, minw, minh;
int grav; int grav;
unsigned int border; unsigned int border;
@ -118,7 +123,9 @@ extern void killclient(Arg *arg);
extern void lower(Client *c); extern void lower(Client *c);
extern void manage(Window w, XWindowAttributes *wa); extern void manage(Window w, XWindowAttributes *wa);
extern void maximize(Arg *arg); extern void maximize(Arg *arg);
extern void resize(Client *c, Bool inc); extern void pop(Client *c);
extern void resize(Client *c, Bool inc, Corner sticky);
extern void setgeom(Client *c);
extern void setsize(Client *c); extern void setsize(Client *c);
extern void settitle(Client *c); extern void settitle(Client *c);
extern void unmanage(Client *c); extern void unmanage(Client *c);
@ -145,7 +152,8 @@ extern int xerror(Display *dsply, XErrorEvent *ee);
extern void appendtag(Arg *arg); extern void appendtag(Arg *arg);
extern void dofloat(Arg *arg); extern void dofloat(Arg *arg);
extern void dotile(Arg *arg); extern void dotile(Arg *arg);
extern Client *getnext(Client *c); extern Client *getnext(Client *c, unsigned int t);
extern void heretag(Arg *arg);
extern void replacetag(Arg *arg); extern void replacetag(Arg *arg);
extern void settags(Client *c); extern void settags(Client *c);
extern void view(Arg *arg); extern void view(Arg *arg);

View File

@ -21,85 +21,98 @@
<p> <p>
dwm is a dynamic window manager for X11. dwm is a dynamic window manager for X11.
</p> </p>
<h3>Philosophy</h3> <h4>Philosophy</h4>
<p> <p>
As founder and main developer of wmii I came to the conclusion that As founder and main developer of wmii I came to the conclusion that
wmii is too clunky for my needs. I don't need so many funky features wmii is too clunky for my needs. I don't need so many funky features
and all this hype about remote control through a 9P service, I only and all this hype about remote control through a 9P service, I only
want to manage my windows in a simple, but dynamic way. wmii never got want to manage my windows in a simple, but dynamic way. wmii never got
finished because I listened to users, who proposed arbitrary ideas I finished because I listened to users, who proposed arbitrary ideas I
considered useful. This resulted in an extreme <a href="http://www.jwz.org/doc/cadt.html">CADT</a> considered useful. This resulted in an extreme <a
development model, which was a mistake. Thus the philosophy of href="http://www.jwz.org/doc/cadt.html">CADT</a> development model,
dwm is simply <i>to fit my needs</i> (maybe yours as well). That's it. which was a mistake. Thus the philosophy of dwm is simply <i>to fit my
needs</i> (maybe yours as well). That's it.
</p> </p>
<h3>Differences to wmii</h3 <h4>Differences to ion, larswm, and wmii</h4>
<p> <p>
In contrast to wmii, dwm is only a window manager, and nothing else. In contrast to ion, larswm, and wmii, dwm is much smaller, faster and simpler.
Hence, it is much smaller, faster and simpler.
</p> </p>
<ul> <ul>
<li> <li>
dwm has no 9P support, no editable tagbars, no shell-based dwm has no Lua integration, no 9P support, no menu, no editable
configuration and remote control and comes without any additional tagbars, no shell-based configuration, no remote control, and comes
tools like printing the selection or warping the mouse. without any additional tools like printing the selection or warping
the mouse.
</li> </li>
<li> <li>
dwm is only a single binary, it's source code is intended to never dwm is only a single binary, it's source code is intended to never
exceed 2000 SLOC. exceed 2000 SLOC.
</li> </li>
<li> <li>
dwm is customized through editing its source code, that makes it dwm is based on tagging and dynamic window management (however
extremely fast and secure - it does not process any input data which simpler than ion, wmii or larswm). It manages windows in
hasn't been known at compile time, except window title names. tiling and floating modes. Either mode can be applied dynamically,
</li> depending on the application in use and the task performed.
<li>
dwm is based on tagging and dynamic window management (however simpler
than wmii or larswm).
</li> </li>
<li> <li>
dwm don't distinguishes between layers, there is no floating or dwm don't distinguishes between layers, there is no floating or
managed layer. Wether the clients of currently selected tag are tiled layer. Wether the clients of currently selected tag are in
managed or not, you can re-arrange all clients on the fly. Popup- tiled mode or not, you can re-arrange all clients on the fly.
and fixed-size windows are treated unmanaged. Popup- and fixed-size windows are treated floating, however.
</li>
<li>
dwm is customized through editing its source code, that makes it
extremely fast and secure - it does not process any input data
which hasn't been known at compile time, except window title names
and status text read from standard input. You don't have to learn
Lua/sh/ruby or some weird configuration file format (like X
resource files), beside C to customize it for your needs,
you <b>only</b> have to learn C.
</li>
<li>
Because dwm is customized through editing its source code, it's
pointless to make binary packages of it. This keeps its userbase
small and elitist. No novices asking stupid questions.
</li> </li>
<li> <li>
dwm uses 1-pixel borders to provide the maximum of screen real dwm uses 1-pixel borders to provide the maximum of screen real
estate to clients. Small titlebars are only drawn in front of unfocused estate to clients. Small titlebars are only drawn in front of
clients. unfocused clients.
</li> </li>
<li> <li>
dwm reads from <b>stdin</b> to print arbitrary status text (like the dwm reads from standard input to print arbitrary status text (like
date, load, battery charge). That's much simpler than larsremote, the date, load, battery charge). That's much simpler than
wmiir and what not... larsremote, wmiir and what not...
</li> </li>
<li> <li>
Anselm <b>does not</b> want any feedback to dwm. If you ask for support, It can be downloaded and distributed under the conditions
feature requests, or if you report bugs, they will be <b>ignored</b> of the <a href="http://10kloc.org/cgi-bin/hgwebdir.cgi/dwm?f=f10eb1139362;file=LICENSE;style=raw">MIT/X Consortium license</a>.
with a high chance. dwm is only intended to fit Anselms needs.
However you are free to download and distribute/relicense it, with the
conditions of the <a href="http://wmii.de/cgi-bin/hgwebdir.cgi/dwm?f=f10eb1139362;file=LICENSE;style=raw">MIT/X Consortium license</a>.
</li> </li>
</ul> </ul>
<h3>Screenshot</h3> <h4>Links</h4>
<p> <ul>
<a href="http://wmii.de/shots/dwm-20060714.png">Click here for a screenshot</a> (20060714) <li><a href="http://10kloc.org/cgi-bin/man/man2html?query=dwm">Man page</a></li>
</p> <li><a href="http://10kloc.org/shots/dwm-20060714.png">Screenshot</a> (20060714)</li>
<li><a href="http://10kloc.org/download/poster.ps">A4 poster (PostScript)</a></li>
<li>Mailing List: <a href="http://10kloc.org/cgi-bin/mailman/listinfo/dwm">dwm at wmii dot de</a> <a href="http://10kloc.org/pipermail/dwm/">(Archives)</a></li>
<li>IRC channel: <code>#dwm</code> at <code>irc.oftc.net</code></li>
</ul>
<h3>Development</h3> <h3>Development</h3>
<p> <p>
dwm is actively developed in parallel to wmii. You can <a href="http://wmii.de/cgi-bin/hgwebdir.cgi/dwm">browse</a> its source code repository or get a copy using <a href="http://www.selenic.com/mercurial/">Mercurial</a> with following command: dwm is actively developed in parallel to wmii. You can <a href="http://10kloc.org/cgi-bin/hgwebdir.cgi/dwm">browse</a> its source code repository or get a copy using <a href="http://www.selenic.com/mercurial/">Mercurial</a> with following command:
</p> </p>
<p> <p>
<code>hg clone http://wmii.de/cgi-bin/hgwebdir.cgi/dwm</code> <code>hg clone http://10kloc.org/cgi-bin/hgwebdir.cgi/dwm</code>
</p> </p>
<h3>Download</h3> <h3>Download</h3>
<ul> <ul>
<li><a href="http://wmii.de/download/dwm-0.2.tar.gz">dwm 0.2</a> (13kb) (20060717)</li> <li><a href="http://10kloc.org/download/dwm-0.3.tar.gz">dwm 0.3</a> (13kb) (20060719)</li>
</ul> </ul>
<h3>Miscellaneous</h3> <h3>Miscellaneous</h3>
<p> <p>
You can purchase this <a href="https://www.spreadshirt.net/shop.php?op=article&article_id=3298632&view=403">tricot</a> You can purchase this <a href="https://www.spreadshirt.net/shop.php?op=article&article_id=3298632&view=403">tricot</a>
if you like dwm and the dwm logo, which has been designed by Anselm. if you like dwm and the dwm logo, which has been designed by Anselm.
</p> </p>
<p><small>--Anselm (20060714)</small></p> <p><small>--Anselm (20060719)</small></p>
</body> </body>
</html> </html>

77
event.c
View File

@ -12,13 +12,7 @@
#define MouseMask (ButtonMask | PointerMotionMask) #define MouseMask (ButtonMask | PointerMotionMask)
/* CUSTOMIZE */ /* CUSTOMIZE */
const char *browse[] = { "firefox", NULL }; const char *term[] = { "xterm", NULL };
const char *gimp[] = { "gimp", NULL };
const char *term[] = {
"urxvtc", "-tr", "+sb", "-bg", "black", "-fg", "white", "-cr", "white",
"-fn", "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*", NULL
};
const char *xlock[] = { "xlock", NULL };
Key key[] = { Key key[] = {
/* modifier key function arguments */ /* modifier key function arguments */
@ -35,16 +29,17 @@ Key key[] = {
{ Mod1Mask, XK_m, maximize, { 0 } }, { Mod1Mask, XK_m, maximize, { 0 } },
{ Mod1Mask, XK_space, dotile, { 0 } }, { Mod1Mask, XK_space, dotile, { 0 } },
{ Mod1Mask, XK_Return, zoom, { 0 } }, { Mod1Mask, XK_Return, zoom, { 0 } },
{ ControlMask|ShiftMask,XK_0, heretag, { .i = Tscratch } },
{ ControlMask|ShiftMask,XK_1, heretag, { .i = Tdev } },
{ ControlMask|ShiftMask,XK_2, heretag, { .i = Twww } },
{ ControlMask|ShiftMask,XK_3, heretag, { .i = Twork } },
{ Mod1Mask|ShiftMask, XK_0, replacetag, { .i = Tscratch } }, { Mod1Mask|ShiftMask, XK_0, replacetag, { .i = Tscratch } },
{ Mod1Mask|ShiftMask, XK_1, replacetag, { .i = Tdev } }, { Mod1Mask|ShiftMask, XK_1, replacetag, { .i = Tdev } },
{ Mod1Mask|ShiftMask, XK_2, replacetag, { .i = Twww } }, { Mod1Mask|ShiftMask, XK_2, replacetag, { .i = Twww } },
{ Mod1Mask|ShiftMask, XK_3, replacetag, { .i = Twork } }, { Mod1Mask|ShiftMask, XK_3, replacetag, { .i = Twork } },
{ Mod1Mask|ShiftMask, XK_c, killclient, { 0 } }, { Mod1Mask|ShiftMask, XK_c, killclient, { 0 } },
{ Mod1Mask|ShiftMask, XK_g, spawn, { .argv = gimp } },
{ Mod1Mask|ShiftMask, XK_l, spawn, { .argv = xlock } },
{ Mod1Mask|ShiftMask, XK_q, quit, { 0 } }, { Mod1Mask|ShiftMask, XK_q, quit, { 0 } },
{ Mod1Mask|ShiftMask, XK_space, dofloat, { 0 } }, { Mod1Mask|ShiftMask, XK_space, dofloat, { 0 } },
{ Mod1Mask|ShiftMask, XK_w, spawn, { .argv = browse } },
{ Mod1Mask|ShiftMask, XK_Return, spawn, { .argv = term } }, { Mod1Mask|ShiftMask, XK_Return, spawn, { .argv = term } },
}; };
@ -58,8 +53,8 @@ movemouse(Client *c)
unsigned int dui; unsigned int dui;
Window dummy; Window dummy;
ocx = c->x; ocx = *c->x;
ocy = c->y; ocy = *c->y;
if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync, if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
None, cursor[CurMove], CurrentTime) != GrabSuccess) None, cursor[CurMove], CurrentTime) != GrabSuccess)
return; return;
@ -73,9 +68,9 @@ movemouse(Client *c)
break; break;
case MotionNotify: case MotionNotify:
XSync(dpy, False); XSync(dpy, False);
c->x = ocx + (ev.xmotion.x - x1); *c->x = ocx + (ev.xmotion.x - x1);
c->y = ocy + (ev.xmotion.y - y1); *c->y = ocy + (ev.xmotion.y - y1);
resize(c, False); resize(c, False, TopLeft);
break; break;
case ButtonRelease: case ButtonRelease:
XUngrabPointer(dpy, CurrentTime); XUngrabPointer(dpy, CurrentTime);
@ -89,13 +84,14 @@ resizemouse(Client *c)
{ {
XEvent ev; XEvent ev;
int ocx, ocy; int ocx, ocy;
Corner sticky;
ocx = c->x; ocx = *c->x;
ocy = c->y; ocy = *c->y;
if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync, if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
None, cursor[CurResize], CurrentTime) != GrabSuccess) None, cursor[CurResize], CurrentTime) != GrabSuccess)
return; return;
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h); XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, *c->w, *c->h);
for(;;) { for(;;) {
XMaskEvent(dpy, MouseMask | ExposureMask, &ev); XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
switch(ev.type) { switch(ev.type) {
@ -105,11 +101,15 @@ resizemouse(Client *c)
break; break;
case MotionNotify: case MotionNotify:
XSync(dpy, False); XSync(dpy, False);
c->w = abs(ocx - ev.xmotion.x); *c->w = abs(ocx - ev.xmotion.x);
c->h = abs(ocy - ev.xmotion.y); *c->h = abs(ocy - ev.xmotion.y);
c->x = (ocx <= ev.xmotion.x) ? ocx : ocx - c->w; *c->x = (ocx <= ev.xmotion.x) ? ocx : ocx - *c->w;
c->y = (ocy <= ev.xmotion.y) ? ocy : ocy - c->h; *c->y = (ocy <= ev.xmotion.y) ? ocy : ocy - *c->h;
resize(c, True); if(ocx <= ev.xmotion.x)
sticky = (ocy <= ev.xmotion.y) ? TopLeft : BotLeft;
else
sticky = (ocy <= ev.xmotion.y) ? TopRight : BotRight;
resize(c, True, sticky);
break; break;
case ButtonRelease: case ButtonRelease:
XUngrabPointer(dpy, CurrentTime); XUngrabPointer(dpy, CurrentTime);
@ -149,24 +149,27 @@ buttonpress(XEvent *e)
} }
} }
else if((c = getclient(ev->window))) { else if((c = getclient(ev->window))) {
if(arrange == dotile && !c->isfloat) {
if((ev->state & ControlMask) && (ev->button == Button1))
zoom(NULL);
return;
}
/* floating windows */
higher(c);
switch(ev->button) { switch(ev->button) {
default: default:
break; break;
case Button1: case Button1:
movemouse(c); if(arrange == dotile && !c->isfloat) {
if((ev->state & ControlMask) && (ev->button == Button1))
zoom(NULL);
}
else {
higher(c);
movemouse(c);
}
break; break;
case Button2: case Button2:
lower(c); lower(c);
break; break;
case Button3: case Button3:
resizemouse(c); if(arrange == dofloat || c->isfloat) {
higher(c);
resizemouse(c);
}
break; break;
} }
} }
@ -183,17 +186,17 @@ configurerequest(XEvent *e)
if((c = getclient(ev->window))) { if((c = getclient(ev->window))) {
gravitate(c, True); gravitate(c, True);
if(ev->value_mask & CWX) if(ev->value_mask & CWX)
c->x = ev->x; *c->x = ev->x;
if(ev->value_mask & CWY) if(ev->value_mask & CWY)
c->y = ev->y; *c->y = ev->y;
if(ev->value_mask & CWWidth) if(ev->value_mask & CWWidth)
c->w = ev->width; *c->w = ev->width;
if(ev->value_mask & CWHeight) if(ev->value_mask & CWHeight)
c->h = ev->height; *c->h = ev->height;
if(ev->value_mask & CWBorderWidth) if(ev->value_mask & CWBorderWidth)
c->border = 1; c->border = 1;
gravitate(c, False); gravitate(c, False);
resize(c, True); resize(c, True, TopLeft);
} }
wc.x = ev->x; wc.x = ev->x;

12
main.c
View File

@ -24,7 +24,7 @@ static void
cleanup() cleanup()
{ {
while(sel) { while(sel) {
resize(sel, True); resize(sel, True, TopLeft);
unmanage(sel); unmanage(sel);
} }
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
@ -179,14 +179,13 @@ main(int argc, char *argv[])
for(i = 1; (i < argc) && (argv[i][0] == '-'); i++) { for(i = 1; (i < argc) && (argv[i][0] == '-'); i++) {
switch (argv[i][1]) { switch (argv[i][1]) {
case 'v':
fprintf(stdout, "%s",
"dwm-"VERSION", (C)opyright MMVI Anselm R. Garbe\n");
exit(0);
break;
default: default:
eprint("usage: dwm [-v]\n"); eprint("usage: dwm [-v]\n");
break; break;
case 'v':
fputs("dwm-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", stdout);
exit(EXIT_SUCCESS);
break;
} }
} }
@ -262,6 +261,7 @@ main(int argc, char *argv[])
XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa); XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
strcpy(stext, "dwm-"VERSION); strcpy(stext, "dwm-"VERSION);
scan(); scan();
/* main event loop, reads status text from stdin as well */ /* main event loop, reads status text from stdin as well */

72
tag.c
View File

@ -12,7 +12,7 @@
/* CUSTOMIZE */ /* CUSTOMIZE */
static Rule rule[] = { static Rule rule[] = {
/* class instance tags isfloat */ /* class instance tags isfloat */
{ "Firefox-bin", "Gecko", { [Twww] = "www" }, False }, { "Firefox-bin", "firefox-bin", { [Twww] = "www" }, False },
}; };
/* extern */ /* extern */
@ -43,13 +43,15 @@ dofloat(Arg *arg)
arrange = dofloat; arrange = dofloat;
for(c = clients; c; c = c->next) { for(c = clients; c; c = c->next) {
if(c->tags[tsel]) setgeom(c);
resize(c, True); if(c->tags[tsel]) {
resize(c, True, TopLeft);
}
else else
ban(c); ban(c);
} }
if(sel && !sel->tags[tsel]) { if(sel && !sel->tags[tsel]) {
if((sel = getnext(clients))) { if((sel = getnext(clients, tsel))) {
higher(sel); higher(sel);
focus(sel); focus(sel);
} }
@ -75,38 +77,45 @@ dotile(Arg *arg)
h = sh - bh; h = sh - bh;
for(i = 0, c = clients; c; c = c->next) { for(i = 0, c = clients; c; c = c->next) {
setgeom(c);
if(c->tags[tsel]) { if(c->tags[tsel]) {
if(c->isfloat) { if(c->isfloat) {
higher(c); higher(c);
resize(c, True); resize(c, True, TopLeft);
continue; continue;
} }
if(n == 1) { if(n == 1) {
c->x = sx; *c->x = sx;
c->y = sy + bh; *c->y = sy + bh;
c->w = sw - 2 * c->border; *c->w = sw - 2 * c->border;
c->h = sh - 2 * c->border - bh; *c->h = sh - 2 * c->border - bh;
} }
else if(i == 0) { else if(i == 0) {
c->x = sx; *c->x = sx;
c->y = sy + bh; *c->y = sy + bh;
c->w = mw - 2 * c->border; *c->w = mw - 2 * c->border;
c->h = sh - 2 * c->border - bh; *c->h = sh - 2 * c->border - bh;
} }
else { else if(h > bh) {
c->x = sx + mw; *c->x = sx + mw;
c->y = sy + (i - 1) * h + bh; *c->y = sy + (i - 1) * h + bh;
c->w = w - 2 * c->border; *c->w = w - 2 * c->border;
c->h = h - 2 * c->border; *c->h = h - 2 * c->border;
} }
resize(c, False); else { /* fallback if h < bh */
*c->x = sx + mw;
*c->y = sy + bh;
*c->w = w - 2 * c->border;
*c->h = sh - 2 * c->border - bh;
}
resize(c, False, TopLeft);
i++; i++;
} }
else else
ban(c); ban(c);
} }
if(!sel || (sel && !sel->tags[tsel])) { if(!sel || (sel && !sel->tags[tsel])) {
if((sel = getnext(clients))) { if((sel = getnext(clients, tsel))) {
higher(sel); higher(sel);
focus(sel); focus(sel);
} }
@ -115,12 +124,31 @@ dotile(Arg *arg)
} }
Client * Client *
getnext(Client *c) getnext(Client *c, unsigned int t)
{ {
for(; c && !c->tags[tsel]; c = c->next); for(; c && !c->tags[t]; c = c->next);
return c; return c;
} }
void
heretag(Arg *arg)
{
int i;
Client *c;
if(arg->i == tsel)
return;
if(!(c = getnext(clients, arg->i)))
return;
for(i = 0; i < TLast; i++)
c->tags[i] = NULL;
c->tags[tsel] = tags[tsel];
pop(c);
focus(c);
}
void void
replacetag(Arg *arg) replacetag(Arg *arg)
{ {

6
util.c
View File

@ -17,7 +17,7 @@ bad_malloc(unsigned int size)
{ {
fprintf(stderr, "fatal: could not malloc() %d bytes\n", fprintf(stderr, "fatal: could not malloc() %d bytes\n",
(int) size); (int) size);
exit(1); exit(EXIT_FAILURE);
} }
/* extern */ /* extern */
@ -37,7 +37,7 @@ eprint(const char *errstr, ...) {
va_start(ap, errstr); va_start(ap, errstr);
vfprintf(stderr, errstr, ap); vfprintf(stderr, errstr, ap);
va_end(ap); va_end(ap);
exit(1); exit(EXIT_FAILURE);
} }
void void
@ -55,7 +55,7 @@ spawn(Arg *arg)
fprintf(stderr, "dwm: execvp %s", argv[0]); fprintf(stderr, "dwm: execvp %s", argv[0]);
perror(" failed"); perror(" failed");
} }
exit (0); exit(EXIT_FAILURE);
} }
wait(0); wait(0);
} }