Compare commits

...

60 Commits
1.2 ... 1.5

Author SHA1 Message Date
0925dd588c applied sanders patch of not manipulating sel 2006-09-08 08:19:54 +02:00
6f20315dff really small changes to dwm.1 2006-09-08 07:40:16 +02:00
2e68f22118 hotfix 2006-09-07 18:13:19 +02:00
8aa860d270 simplified unmanage 2006-09-07 18:12:40 +02:00
15abade272 using a global stack for focus recovery on arrange() - seems to work great 2006-09-07 17:53:40 +02:00
7ab8c87281 made markups in dwm.1 more consistent 2006-09-07 09:26:01 +02:00
4ff8f71643 small addition to dwm.1 2006-09-07 07:53:29 +02:00
d22abeee86 this patch keeps track of global z-layer order of clients which are floating or if floating mode is enabled 2006-09-06 17:31:52 +02:00
a33150eb4b no this is better 2006-09-06 15:36:42 +02:00
fd00b3a186 does this preserve z order for anthony? 2006-09-06 15:30:28 +02:00
e8389a4cc0 maybe this might work 2006-09-06 13:56:46 +02:00
6078d756bc Added tag 1.4 for changeset 3cff9403766bf83a9fc2a0aef230115d68de2a8e 2006-09-06 12:19:07 +02:00
57c49fe867 prepared dwm-1.4 update 2006-09-06 12:18:57 +02:00
c60de1acd4 drawstatus even if no client exists 2006-09-06 12:10:43 +02:00
69b738c097 sanders solution is convincing and elegant 2006-09-06 11:54:16 +02:00
da0b2a2f31 seems to preserve floating client z-layer order (even with reorder() calls) 2006-09-06 11:46:35 +02:00
2378a558a2 Added tag 1.4 for changeset a6b8994af16491220db0199623bd57d061e06143 2006-09-06 10:54:10 +02:00
f18ed615ae small fix 2006-09-06 10:03:21 +02:00
f6656fffb4 made args mode symbols the default ones (the default ones look too ugly) 2006-09-06 09:23:34 +02:00
aaad7bfd15 moved transient_for tag inheritance to settags 2006-09-06 09:21:17 +02:00
0915da8842 no, reodering floating clients definately breaks the manage() policy which attaches all clients zoomed (otherwise higher-weight clients couldn't be attached zoomed, which sucks) 2006-09-06 09:13:31 +02:00
0d0e8bde13 no, ordering floating clients at the end seems better 2006-09-05 19:26:34 +02:00
838a1ff950 fix 2006-09-05 18:43:15 +02:00
e1315fd40c this makes sure the issue mentioned by sander 2006-09-05 18:04:22 +02:00
52a3ab1042 fixing zoom 2006-09-05 17:10:48 +02:00
a82e7b765e fixing two off-by-ones 2006-09-05 16:11:52 +02:00
0ed0fa4d5b ach ich will auch Alt-s 2006-09-05 16:05:09 +02:00
ec85fddb9a applied checking existance of >2 tiles patch (proposed by sander) to zoom and resizecol 2006-09-05 16:00:09 +02:00
3a1343a245 renamed resizetile into resizecol 2006-09-05 13:52:23 +02:00
9066ee2eb4 well ok, added Mod-s to default bindings (however, I don't need it) 2006-09-05 13:27:43 +02:00
40bd21ce63 s/growcol/resizetile/g 2006-09-05 13:25:42 +02:00
4633fbec61 right, multihead issue is not involved with growcol 2006-09-05 13:21:59 +02:00
25060031a5 hotfix 2006-09-05 13:20:29 +02:00
c7ae6334b7 applied a fix related to Sanders remark to growcol 2006-09-05 13:19:18 +02:00
eac04882b4 sanders toggletag patch is much more elegant 2006-09-05 09:37:45 +02:00
6499fc4f93 I really need column growing, now pushing upstream 2006-09-05 09:02:37 +02:00
04f27a5438 don't access sel in restack without checking for NULL (multihead crashing bug) 2006-09-05 08:37:34 +02:00
1b3903d6e9 fixing c->weight handling 2006-09-05 08:24:00 +02:00
cc05093b0d removed some useless tags 2006-09-04 19:19:37 +02:00
6436dd4438 after 1.3 2006-09-04 17:52:46 +02:00
26c50c780e Added tag 1.3 for changeset f5f5cbf016a94b48a8fe9c47f0736e96d166d5d4 2006-09-04 17:52:16 +02:00
01d13b0c49 retagged 2006-09-04 17:52:12 +02:00
f15f45a9f8 simplified manage 2006-09-04 17:39:33 +02:00
1b2e149cb4 removed html crap 2006-09-04 17:37:31 +02:00
6136640ec9 Added tag 1.3 for changeset dd44dc937e8b0a46abf1a15a333dba5304e4fe89 2006-09-04 17:21:18 +02:00
95d8423823 hotfixing with sanders hint 2006-09-04 17:21:15 +02:00
de6411c338 Added tag 1.3 for changeset 6413ea66b1c2496cfc2173fe58df67cb965eb1da 2006-09-04 17:18:01 +02:00
e316cf53f6 fixing the issue that new clients appear lowered 2006-09-04 17:02:13 +02:00
c107db57db removed unused vars 2006-09-04 12:23:41 +02:00
d39d00057c reducing focus calls (sanders patch) 2006-09-04 10:10:08 +02:00
26157e6973 applied Sanders max_and_focus.patch 2006-09-04 08:55:49 +02:00
6d22782e8f simplified buttonpress 2006-09-01 15:31:59 +02:00
1836b6740d applied sanders patch 2006-09-01 10:32:50 +02:00
924a088812 reorder was misssing in Ross version of viewall 2006-08-31 18:08:28 +02:00
bab575c868 changed shortcut into Mod1-0 2006-08-31 18:04:34 +02:00
daae3bba50 added viewall to mainstream (only Ross Mohns version, not the toggle) 2006-08-31 18:02:38 +02:00
05fbbbd8dc implemented Button2 press on tags for toggletag on the focused client 2006-08-31 17:49:04 +02:00
4c368bcd24 applied sanders patch to remove unnecessary commit() 2006-08-31 08:48:04 +02:00
9927b9e642 small fix in config.arg.h 2006-08-30 13:00:30 +02:00
1b492dffc8 Added tag 1.2 for changeset e3179ce2b90451d2807cd53b589d768412b8666b 2006-08-30 12:39:35 +02:00
13 changed files with 231 additions and 345 deletions

View File

@ -9,3 +9,6 @@ cd15de32e173f8ce97bfe1c9b6607937b59056b4 0.8
fae61afa861755636c4a1070694209ace8efbb6c 0.9
bbc98e77ae89a7c9232a5be0835f60ea00d8036e 1.0
44a55e6e46bf6c231780b09d919977d6f01083de 1.1
e3179ce2b90451d2807cd53b589d768412b8666b 1.2
f5f5cbf016a94b48a8fe9c47f0736e96d166d5d4 1.3
3cff9403766bf83a9fc2a0aef230115d68de2a8e 1.4

View File

@ -10,6 +10,14 @@
/* static functions */
static void
detachstack(Client *c)
{
Client **tc;
for(tc=&stack; *tc && *tc != c; tc=&(*tc)->snext);
*tc = c->snext;
}
static void
grabbuttons(Client *c, Bool focus)
{
@ -82,22 +90,32 @@ ban(Client *c)
void
focus(Client *c)
{
Client *old = sel;
Client *old;
if(!issel)
return;
if(!sel)
sel = c;
else if(sel != c) {
if(sel->ismax)
if(maximized)
togglemax(NULL);
old = sel;
sel = c;
grabbuttons(old, False);
drawtitle(old);
if(old) {
grabbuttons(old, False);
drawtitle(old);
}
}
grabbuttons(c, True);
drawtitle(c);
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
if(c) {
detachstack(c);
c->snext = stack;
stack = c;
grabbuttons(c, True);
drawtitle(c);
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
}
else
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
}
Client *
@ -191,8 +209,7 @@ killclient(Arg *arg)
void
manage(Window w, XWindowAttributes *wa)
{
unsigned int i;
Client *c, *tc;
Client *c;
Window trans;
XSetWindowAttributes twa;
@ -231,11 +248,7 @@ manage(Window w, XWindowAttributes *wa)
CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
grabbuttons(c, False);
if((tc = getclient(trans))) /* inherit tags */
for(i = 0; i < ntags; i++)
c->tags[i] = tc->tags[i];
else
settags(c);
settags(c, getclient(trans));
if(!c->isfloat)
c->isfloat = trans
|| (c->maxw && c->minw &&
@ -244,16 +257,16 @@ manage(Window w, XWindowAttributes *wa)
if(clients)
clients->prev = c;
c->next = clients;
clients = c;
c->snext = stack;
stack = clients = c;
settitle(c);
if(isvisible(c))
sel = c;
arrange(NULL);
ban(c);
XMapWindow(dpy, c->win);
XMapWindow(dpy, c->twin);
if(isvisible(c))
focus(c);
arrange(NULL);
}
void
@ -366,12 +379,13 @@ void
togglemax(Arg *arg)
{
int ox, oy, ow, oh;
Client *c;
XEvent ev;
if(!sel)
return;
if((sel->ismax = !sel->ismax)) {
if((maximized = !maximized)) {
ox = sel->x;
oy = sel->y;
ow = sel->w;
@ -382,6 +396,9 @@ togglemax(Arg *arg)
sel->h = sh - 2 - bh;
restack();
for(c = getnext(clients); c; c = getnext(c->next))
if(c != sel)
ban(c);
resize(sel, arrange == dofloat, TopLeft);
sel->x = ox;
@ -390,37 +407,33 @@ togglemax(Arg *arg)
sel->h = oh;
}
else
resize(sel, False, TopLeft);
arrange(NULL);
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
}
void
unmanage(Client *c)
{
Client *tc;
Window trans;
Client *nc;
XGrabServer(dpy);
XSetErrorHandler(xerrordummy);
XGetTransientForHint(dpy, c->win, &trans);
detach(c);
detachstack(c);
if(sel == c) {
for(nc = stack; nc && !isvisible(nc); nc = nc->snext);
focus(nc);
}
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
XDestroyWindow(dpy, c->twin);
detach(c);
if(sel == c) {
if(trans && (tc = getclient(trans)) && isvisible(tc))
sel = tc;
else
sel = getnext(clients);
}
free(c->tags);
free(c);
XSync(dpy, False);
XSetErrorHandler(xerror);
XUngrabServer(dpy);
if(sel)
focus(sel);
arrange(NULL);
}

View File

@ -27,13 +27,15 @@ static Key key[] = { \
{ MODKEY|ShiftMask, XK_Return, spawn, \
{ .cmd = "exec uxterm -bg '#111111' -fg '#eeeeee' -cr '#eeeeee' +sb -fn '"FONT"'" } }, \
{ MODKEY, XK_p, spawn, \
{ .cmd = "exec \"$(IFS=:; for dir in $PATH; do " \
"for file in \"$dir\"/*; do [ -x \"$file\" ] && echo \"${file##*/}\"; done; " \
"done | sort -u | dmenu)\"" } }, \
{ .cmd = "exe=\"$(IFS=:; for dir in $PATH; do " \
"for file in \"$dir\"/*; do [ -x \"$file\" ] && echo \"${file##*/}\"; done; " \
"done | sort -u | dmenu)\" && exec \"$exe\"" } }, \
{ MODKEY, XK_j, focusnext, { 0 } }, \
{ MODKEY, XK_k, focusprev, { 0 } }, \
{ MODKEY, XK_Return, zoom, { 0 } }, \
{ MODKEY, XK_m, togglemax, { 0 } }, \
{ MODKEY, XK_g, resizecol, { .i = 20 } }, \
{ MODKEY, XK_s, resizecol, { .i = -20 } }, \
{ MODKEY|ShiftMask, XK_1, tag, { .i = 0 } }, \
{ MODKEY|ShiftMask, XK_2, tag, { .i = 1 } }, \
{ MODKEY|ShiftMask, XK_3, tag, { .i = 2 } }, \
@ -44,6 +46,7 @@ static Key key[] = { \
{ MODKEY|ControlMask|ShiftMask, XK_4, toggletag, { .i = 3 } }, \
{ MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \
{ MODKEY, XK_space, togglemode, { 0 } }, \
{ MODKEY, XK_0, viewall, { 0 } }, \
{ MODKEY, XK_1, view, { .i = 0 } }, \
{ MODKEY, XK_2, view, { .i = 1 } }, \
{ MODKEY, XK_3, view, { .i = 2 } }, \

View File

@ -7,8 +7,8 @@
const char *tags[] = { "1", "2", "3", "4", "5", NULL };
#define DEFMODE dotile /* dofloat */
#define FLOATSYMBOL "~"
#define TILESYMBOL "#"
#define FLOATSYMBOL "><>"
#define TILESYMBOL "[]="
#define FONT "fixed"
#define SELBGCOLOR "#666699"
@ -29,6 +29,8 @@ static Key key[] = { \
{ MODKEY|ShiftMask, XK_Tab, focusprev, { 0 } }, \
{ MODKEY, XK_Return, zoom, { 0 } }, \
{ MODKEY, XK_m, togglemax, { 0 } }, \
{ MODKEY, XK_g, resizecol, { .i = 20 } }, \
{ MODKEY, XK_s, resizecol, { .i = -20 } }, \
{ MODKEY|ShiftMask, XK_1, tag, { .i = 0 } }, \
{ MODKEY|ShiftMask, XK_2, tag, { .i = 1 } }, \
{ MODKEY|ShiftMask, XK_3, tag, { .i = 2 } }, \
@ -41,6 +43,7 @@ static Key key[] = { \
{ MODKEY|ControlMask|ShiftMask, XK_5, toggletag, { .i = 4 } }, \
{ MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \
{ MODKEY, XK_space, togglemode, { 0 } }, \
{ MODKEY, XK_0, viewall, { 0 } }, \
{ MODKEY, XK_1, view, { .i = 0 } }, \
{ MODKEY, XK_2, view, { .i = 1 } }, \
{ MODKEY, XK_3, view, { .i = 2 } }, \

View File

@ -1,5 +1,5 @@
# dwm version
VERSION = 1.2
VERSION = 1.5
# Customize below to fit your system

136
dwm.1
View File

@ -5,10 +5,9 @@ dwm \- dynamic window manager
.B dwm
.RB [ \-v ]
.SH DESCRIPTION
.B dwm
is a dynamic window manager for X. It manages windows in tiling and floating
modes. Either mode can be applied dynamically, optimizing the environment for
the application in use and the task performed.
dwm is a dynamic window manager for X. It manages windows in tiling and
floating modes. Either mode can be applied dynamically, optimizing the
environment for the application in use and the task performed.
.P
In tiling mode windows are managed in a master and stacking column. The master
column contains the window which currently needs most attention, whereas the
@ -17,16 +16,14 @@ resized and moved freely. Dialog windows are always managed floating,
regardless of the mode selected.
.P
Windows are grouped by tags. Each window can be tagged with one or multiple
tags. Selecting a certain tag for viewing will display all windows with that
tag.
tags. Selecting certain tags displays all windows with that tag.
.P
.B dwm
contains a small status bar which displays all available tags, the mode, the
title of the focused window, and the text read from standard input. The tags of
the focused window are highlighted with a small point.
dwm contains a small status bar which displays all available tags, the mode,
the title of the focused window, and the text read from standard input. The
selected tags are highlighted with a different color, the tags of the focused
window are highlighted with a small point.
.P
.B dwm
draws a 1-pixel border around windows to indicate the focus state.
dwm draws a 1-pixel border around windows to indicate the focus state.
Unfocused windows contain a small bar in front of them displaying their title.
.SH OPTIONS
.TP
@ -39,18 +36,17 @@ prints version information to standard output, then exits.
is read and displayed in the status text area.
.TP
.B Button1
click on a tag label views all windows with that
.BR tag ,
click on the mode label toggles between
.B tiled
and
.B floating
mode.
click on a tag label to display all windows with that tag, click on the mode
label toggles between tiled and floating mode.
.TP
.B Button3
click on a tag label adds/removes all windows with that
.B tag
to/from the view.
click on a tag label adds/removes all windows with that tag to/from the view.
.TP
.B Mod1-Button1
click on a tag label applies that tag to the focused window.
.TP
.B Mod1-Button3
click on a tag label adds/removes that tag to/from the focused window.
.SS Keyboard commands
.TP
.B Mod1-Shift-Return
@ -58,98 +54,72 @@ Start
.BR xterm (1).
.TP
.B Mod1-Tab
Focus next
.BR window .
Focus next window.
.TP
.B Mod1-Shift-Tab
Focus previous
.BR window .
Focus previous window.
.TP
.B Mod1-Return
Zoom current
.B window
to the
.B master
column
.RB ( tiling
mode only).
Zoom current window to the master column (tiling mode only).
.TP
.B Mod1-m
Maximize current
.BR window .
Maximize current window.
.TP
.B Mod1-Shift-[0..n]
.B Mod1-g
Grow current column (tiling mode only).
.TP
.B Mod1-s
Shrink current column (tiling mode only).
.TP
.B Mod1-Shift-[1..n]
Apply
.B nth tag
to current
.BR window .
.RB nth
tag to current window.
.TP
.B Mod1-Control-Shift-[0..n]
.B Mod1-Control-Shift-[1..n]
Add/remove
.B nth tag
to/from current
.BR window .
.B nth
tag to/from current window.
.TP
.B Mod1-Shift-c
Close focused
.B window.
Close focused window.
.TP
.B Mod1-space
Toggle between
.B tiled
and
.B floating
mode (affects
.BR "all windows" ).
Toggle between tiled and floating mode (affects all windows).
.TP
.B Mod1-[0..n]
.B Mod1-[1..n]
View all windows with
.BR "tag n" .
.BR nth
tag.
.TP
.B Mod1-Control-[0..n]
.B Mod1-0
View all windows with any tag.
.TP
.B Mod1-Control-[1..n]
Add/remove all windows with
.B tag n
to/from the view.
.BR nth
tag to/from the view.
.TP
.B Mod1-Shift-q
Quit
.B dwm.
Quit dwm.
.SS Mouse commands
.TP
.B Mod1-Button1
Move current
.B window
while dragging
.RB ( floating
mode only).
Move current window while dragging (floating mode only).
.TP
.B Mod1-Button2
Zoom current
.B window
to the
.B master
column
.RB ( tiling
mode only).
Zoom current window to the master column (tiling mode only).
.TP
.B Mod1-Button3
Resize current
.B window
while dragging
.RB ( floating
mode only).
Resize current window while dragging (floating mode only).
.SH CUSTOMIZATION
.B dwm
is customized by creating a custom config.h and (re)compiling the source
dwm is customized by creating a custom config.h and (re)compiling the source
code. This keeps it fast, secure and simple.
.SH CAVEATS
The status bar may display
.B broken pipe
when
.B dwm
has been started by
.BR "broken pipe"
when dwm has been started by
.BR xdm (1),
because it closes standard output before executing
.BR dwm .
because it closes standard output before executing dwm.
.SH SEE ALSO
.BR dmenu (1)

10
dwm.h
View File

@ -58,10 +58,10 @@ struct Client {
long flags;
unsigned int border, weight;
Bool isfloat;
Bool ismax;
Bool *tags;
Client *next;
Client *prev;
Client *snext;
Window win;
Window twin;
};
@ -73,8 +73,8 @@ extern unsigned int ntags, numlockmask;
extern void (*handler[LASTEvent])(XEvent *);
extern void (*arrange)(Arg *);
extern Atom wmatom[WMLast], netatom[NetLast];
extern Bool running, issel, *seltag;
extern Client *clients, *sel;
extern Bool running, issel, maximized, *seltag;
extern Client *clients, *sel, *stack;
extern Cursor cursor[CurLast];
extern DC dc;
extern Display *dpy;
@ -116,7 +116,7 @@ extern int xerror(Display *dsply, XErrorEvent *ee);
extern void initrregs();
extern Client *getnext(Client *c);
extern Client *getprev(Client *c);
extern void settags(Client *c);
extern void settags(Client *c, Client *trans);
extern void tag(Arg *arg);
extern void toggletag(Arg *arg);
@ -133,8 +133,10 @@ extern void dotile(Arg *arg);
extern void focusnext(Arg *arg);
extern void focusprev(Arg *arg);
extern Bool isvisible(Client *c);
extern void resizecol(Arg *arg);
extern void restack();
extern void togglemode(Arg *arg);
extern void toggleview(Arg *arg);
extern void view(Arg *arg);
extern void viewall(Arg *arg);
extern void zoom(Arg *arg);

127
dwm.html
View File

@ -1,127 +0,0 @@
<html>
<head>
<title>dwm - dynamic window manager</title>
<meta name="author" content="Anselm R. Garbe">
<meta name="generator" content="ed">
<meta name="copyright" content="(C)opyright 2006 by Anselm R. Garbe">
<link rel="dwm icon" href="favicon.ico" type="image/x-icon" />
<style type="text/css">
body {
color: #000000;
font-family: sans-serif;
margin: 20px 20px 20px 20px;
}
</style>
</head>
<body>
<center>
<img src="dwm.png"/><br />
<h3>dynamic window manager</h3>
</center>
<h3>Description</h3>
<p>
dwm is a dynamic window manager for X11.
</p>
<h4>Background</h4>
<p>
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
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
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> development model,
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>
<h4>Differences to ion, larswm, and wmii</h4>
<p>
In contrast to ion, larswm, and wmii, dwm is much smaller, faster and simpler.
</p>
<ul>
<li>
dwm has no Lua integration, no 9P support, no editable
tagbars, no shell-based configuration, no remote control, and comes
without any additional tools like printing the selection or warping
the mouse.
</li>
<li>
dwm is only a single binary, it's source code is intended to never
exceed 2000 SLOC.
</li>
<li>
dwm is based on tagging and dynamic window management (however
simpler than ion, wmii or larswm). It manages windows in
tiling and floating modes. Either mode can be applied dynamically,
depending on the application in use and the task performed.
</li>
<li>
dwm doesn't distinguishes between layers, there is no floating or
tiled layer. Wether the clients of currently selected tag are in
tiled mode or not, you can re-arrange all clients on the fly.
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 (at least editing header files).
</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>
dwm uses 1-pixel borders to provide the maximum of screen real
estate to clients. Small titlebars are only drawn in front of
unfocused clients.
</li>
<li>
dwm reads from standard input to print arbitrary status text (like
the date, load, battery charge). That's much simpler than
larsremote, wmiir and what not...
</li>
<li>
It can be downloaded and distributed under the conditions
of the <a href="http://10kloc.org/cgi-bin/hgwebdir.cgi/dwm?f=f10eb1139362;file=LICENSE;style=raw">MIT/X Consortium license</a>.
</li>
<li>
Optionally you can install <b>dmenu</b> to extend dwm with a wmii-alike menu.
</li>
</ul>
<h4>Links</h4>
<ul>
<li><a href="http://10kloc.org/cgi-bin/man/man2html?query=dwm">Man page</a></li>
<li><a href="http://10kloc.org/shots/dwm-20060810a.png">Screenshot of tiled mode</a> (20060810)</li>
<li><a href="http://10kloc.org/shots/dwm-20060810b.png">Screenshotof floating mode</a> (20060810)</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>&nbsp;<a href="http://dir.gmane.org/gmane.comp.window-managers.dwm">(GMANE Archive)</a></li>
<li>IRC channel: <code>#dwm</code> at <code>irc.oftc.net</code></li>
</ul>
<h3>Download</h3>
<ul>
<li><a href="http://10kloc.org/download/dwm-1.2.tar.gz">dwm 1.2</a> (15kb) (20060830)</li>
<li><a href="http://10kloc.org/download/dmenu-0.6.tar.gz">dmenu 0.6</a> (7kb) (20060828)</li>
</ul>
<h3>Development</h3>
<p>
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>
<code>hg clone http://10kloc.org/cgi-bin/hgwebdir.cgi/dwm</code>
</p>
<p>
<code>hg clone http://10kloc.org/cgi-bin/hgwebdir.cgi/dmenu</code>
</p>
<h3>Miscellaneous</h3>
<p>
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.
</p>
<p><small>--Anselm</small></p>
</body>
</html>

45
event.c
View File

@ -109,10 +109,18 @@ buttonpress(XEvent *e)
for(a.i = 0; a.i < ntags; a.i++) {
x += textw(tags[a.i]);
if(ev->x < x) {
if(ev->button == Button1)
view(&a);
else if(ev->button == Button3)
toggleview(&a);
if(ev->button == Button1) {
if(ev->state & MODKEY)
tag(&a);
else
view(&a);
}
else if(ev->button == Button3) {
if(ev->state & MODKEY)
toggletag(&a);
else
toggleview(&a);
}
return;
}
}
@ -123,26 +131,17 @@ buttonpress(XEvent *e)
}
else if((c = getclient(ev->window))) {
focus(c);
if(CLEANMASK(ev->state) != MODKEY)
if(maximized || CLEANMASK(ev->state) != MODKEY)
return;
switch(ev->button) {
default:
break;
case Button1:
if(!c->ismax && (arrange == dofloat || c->isfloat)) {
restack(c);
movemouse(c);
}
break;
case Button2:
if(ev->button == Button1 && (arrange == dofloat || c->isfloat)) {
restack(c);
movemouse(c);
}
else if(ev->button == Button2)
zoom(NULL);
break;
case Button3:
if(!c->ismax && (arrange == dofloat || c->isfloat)) {
restack(c);
resizemouse(c);
}
break;
else if(ev->button == Button3 && (arrange == dofloat || c->isfloat)) {
restack(c);
resizemouse(c);
}
}
}
@ -174,7 +173,7 @@ configurerequest(XEvent *e)
XWindowChanges wc;
if((c = getclient(ev->window))) {
if(!c->isfloat && (arrange != dofloat) && c->ismax) {
if((c == sel) && !c->isfloat && (arrange != dofloat) && maximized) {
synconfig(c, sx, sy + bh, sw - 2, sh - 2 - bh, ev->border_width);
XSync(dpy, False);
return;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 B

3
main.c
View File

@ -24,8 +24,10 @@ unsigned int ntags, numlockmask;
Atom wmatom[WMLast], netatom[NetLast];
Bool running = True;
Bool issel = True;
Bool maximized = False;
Client *clients = NULL;
Client *sel = NULL;
Client *stack = NULL;
Cursor cursor[CurLast];
Display *dpy;
DC dc = {0};
@ -54,6 +56,7 @@ cleanup()
XDestroyWindow(dpy, barwin);
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
XSync(dpy, False);
free(seltag);
}
static void

30
tag.c
View File

@ -30,17 +30,6 @@ RULES
static RReg *rreg = NULL;
static unsigned int len = 0;
static void
commit()
{
/* asserts sel != NULL */
settitle(sel);
if(!isvisible(sel))
arrange(NULL);
else
drawstatus();
}
/* extern */
Client *
@ -87,15 +76,19 @@ initrregs()
}
void
settags(Client *c)
settags(Client *c, Client *trans)
{
char prop[512];
unsigned int i, j;
regmatch_t tmp;
Bool matched = False;
Bool matched = trans != NULL;
XClassHint ch;
if(XGetClassHint(dpy, c->win, &ch)) {
if(matched) {
for(i = 0; i < ntags; i++)
c->tags[i] = trans->tags[i];
}
else if(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);
@ -117,8 +110,7 @@ settags(Client *c)
if(!matched)
for(i = 0; i < ntags; i++)
c->tags[i] = seltag[i];
for(i = 0; i < ntags && !c->tags[i]; i++);
c->weight = i;
for(c->weight = 0; c->weight < ntags && !c->tags[c->weight]; c->weight++);
}
void
@ -132,7 +124,8 @@ tag(Arg *arg)
for(i = 0; i < ntags; i++)
sel->tags[i] = False;
sel->tags[arg->i] = True;
commit();
sel->weight = arg->i;
arrange(NULL);
}
void
@ -147,5 +140,6 @@ toggletag(Arg *arg)
for(i = 0; i < ntags && !sel->tags[i]; i++);
if(i == ntags)
sel->tags[arg->i] = True;
commit();
sel->weight = (i == ntags) ? arg->i : i;
arrange(NULL);
}

127
view.c
View File

@ -12,13 +12,14 @@ minclient()
{
Client *c, *min;
if((clients && clients->isfloat) || arrange == dofloat)
return clients; /* don't touch floating order */
for(min = c = clients; c; c = c->next)
if(c->weight < min->weight)
min = c;
return min;
}
static void
reorder()
{
@ -38,6 +39,13 @@ reorder()
clients = newclients;
}
static Client *
nexttiled(Client *c)
{
for(c = getnext(c); c && c->isfloat; c = getnext(c->next));
return c;
}
/* extern */
void (*arrange)(Arg *) = DEFMODE;
@ -59,18 +67,19 @@ dofloat(Arg *arg)
{
Client *c;
maximized = False;
for(c = clients; c; c = c->next) {
c->ismax = False;
if(isvisible(c)) {
resize(c, True, TopLeft);
}
else
ban(c);
}
if((sel = getnext(clients)))
focus(sel);
else
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
if(!sel || !isvisible(sel)) {
for(c = stack; c && !isvisible(c); c = c->snext);
focus(c);
}
restack();
}
@ -80,6 +89,8 @@ dotile(Arg *arg)
int h, i, n, w;
Client *c;
maximized = False;
w = sw - mw;
for(n = 0, c = clients; c; c = c->next)
if(isvisible(c) && !c->isfloat)
@ -91,7 +102,6 @@ dotile(Arg *arg)
h = sh - bh;
for(i = 0, c = clients; c; c = c->next) {
c->ismax = False;
if(isvisible(c)) {
if(c->isfloat) {
resize(c, True, TopLeft);
@ -130,10 +140,10 @@ dotile(Arg *arg)
else
ban(c);
}
if((sel = getnext(clients)))
focus(sel);
else
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
if(!sel || !isvisible(sel)) {
for(c = stack; c && !isvisible(c); c = c->snext);
focus(c);
}
restack();
}
@ -182,53 +192,50 @@ isvisible(Client *c)
return False;
}
void
resizecol(Arg *arg)
{
unsigned int n;
Client *c;
for(n = 0, c = clients; c; c = c->next)
if(isvisible(c) && !c->isfloat)
n++;
if(!sel || sel->isfloat || n < 2 || (arrange != dotile) || maximized)
return;
if(sel == getnext(clients)) {
if(mw + arg->i > sw - 100 || mw + arg->i < 100)
return;
mw += arg->i;
}
else {
if(mw - arg->i > sw - 100 || mw - arg->i < 100)
return;
mw -= arg->i;
}
arrange(NULL);
}
void
restack()
{
static unsigned int nwins = 0;
static Window *wins = NULL;
unsigned int f, fi, m, mi, n;
Client *c;
XEvent ev;
for(f = 0, m = 0, c = clients; c; c = c->next)
if(isvisible(c)) {
if(c->isfloat || arrange == dofloat)
f++;
else
m++;
}
if(!(n = 2 * (f + m))) {
if(!sel) {
drawstatus();
return;
}
if(nwins < n) {
nwins = n;
wins = erealloc(wins, nwins * sizeof(Window));
}
fi = 0;
mi = 2 * f;
if(sel->isfloat || arrange == dofloat) {
wins[fi++] = sel->twin;
wins[fi++] = sel->win;
XRaiseWindow(dpy, sel->win);
XRaiseWindow(dpy, sel->twin);
}
else {
wins[mi++] = sel->twin;
wins[mi++] = sel->win;
}
for(c = clients; c; c = c->next)
if(isvisible(c) && c != sel) {
if(c->isfloat || arrange == dofloat) {
wins[fi++] = c->twin;
wins[fi++] = c->win;
}
else {
wins[mi++] = c->twin;
wins[mi++] = c->win;
}
if(arrange != dofloat)
for(c = nexttiled(clients); c; c = nexttiled(c->next)) {
XLowerWindow(dpy, c->twin);
XLowerWindow(dpy, c->win);
}
XRestackWindows(dpy, wins, n);
drawall();
XSync(dpy, False);
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
@ -269,20 +276,36 @@ view(Arg *arg)
arrange(NULL);
}
void
viewall(Arg *arg)
{
unsigned int i;
for(i = 0; i < ntags; i++)
seltag[i] = True;
reorder();
arrange(NULL);
}
void
zoom(Arg *arg)
{
Client *c = sel;
unsigned int n;
Client *c;
if(!c || (arrange != dotile) || c->isfloat || c->ismax)
for(n = 0, c = clients; c; c = c->next)
if(isvisible(c) && !c->isfloat)
n++;
if(!sel || sel->isfloat || n < 2 || (arrange != dotile) || maximized)
return;
if(c == getnext(clients))
if(!(c = getnext(c->next)))
if((c = sel) == nexttiled(clients))
if(!(c = nexttiled(c->next)))
return;
detach(c);
if(clients)
clients->prev = c;
c->next = clients;
clients->prev = c;
clients = c;
focus(c);
arrange(NULL);