Compare commits
37 Commits
Author | SHA1 | Date | |
---|---|---|---|
0680c76a6f | |||
c3e5f5cc9a | |||
1c620d27d8 | |||
fde45ebed8 | |||
4bd0d33f57 | |||
00255728aa | |||
4b0328f209 | |||
30561a0161 | |||
a4c4998c8b | |||
8e053b6476 | |||
b79b5facb1 | |||
c53f0fca91 | |||
c225e1afc2 | |||
92e55c7c53 | |||
c86f131681 | |||
e943234d09 | |||
9fc24e371b | |||
cac467d52c | |||
04f17d2669 | |||
dff15a02f7 | |||
42277b1110 | |||
095f9e143e | |||
9fbb2ebb90 | |||
dbcf87ce76 | |||
4250c26e9b | |||
e48de30516 | |||
1f0060caa3 | |||
c732cc90ab | |||
4e2c5b5f25 | |||
d9386a0c07 | |||
66e16c92d3 | |||
6a8e176df1 | |||
632c7f3410 | |||
045f1840e0 | |||
45d16d090b | |||
525c5ff4d8 | |||
5952157c3b |
1
.hgtags
1
.hgtags
@ -4,3 +4,4 @@ d31b5ad96b0ba7b5b0a30928fcf000428339a577 0.1
|
||||
eb3165734f00fe7f7da8aeebaed00e60a57caac9 0.4
|
||||
22213b9a2114167ee8ba019a012e27da0422a61a 0.5
|
||||
c11f86db4550cac5d0a648a3fe4d6d3b9a4fcf7e 0.6
|
||||
3fb41412e2492f66476d92ce8f007a8b48fb1d2a 0.7
|
||||
|
4
Makefile
4
Makefile
@ -19,7 +19,7 @@ options:
|
||||
@echo CC $<
|
||||
@${CC} -c ${CFLAGS} $<
|
||||
|
||||
${OBJ}: dwm.h config.h
|
||||
${OBJ}: dwm.h config.h config.mk
|
||||
|
||||
config.h:
|
||||
@echo creating $@ from config.default.h
|
||||
@ -50,7 +50,7 @@ install: all
|
||||
@chmod 755 ${DESTDIR}${PREFIX}/bin/dwm
|
||||
@echo installing manual page to ${DESTDIR}${MANPREFIX}/man1
|
||||
@mkdir -p ${DESTDIR}${MANPREFIX}/man1
|
||||
@cp -f dwm.1 ${DESTDIR}${MANPREFIX}/man1
|
||||
@sed 's/VERSION/${VERSION}/g' < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1
|
||||
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1
|
||||
|
||||
uninstall:
|
||||
|
9
client.c
9
client.c
@ -49,6 +49,8 @@ ban(Client *c)
|
||||
void
|
||||
focus(Client *c)
|
||||
{
|
||||
if (!issel)
|
||||
return;
|
||||
Client *old = sel;
|
||||
XEvent ev;
|
||||
|
||||
@ -196,13 +198,6 @@ killclient(Arg *arg)
|
||||
XKillClient(dpy, sel->win);
|
||||
}
|
||||
|
||||
void
|
||||
lower(Client *c)
|
||||
{
|
||||
XLowerWindow(dpy, c->title);
|
||||
XLowerWindow(dpy, c->win);
|
||||
}
|
||||
|
||||
void
|
||||
manage(Window w, XWindowAttributes *wa)
|
||||
{
|
||||
|
44
config.arg.h
44
config.arg.h
@ -4,14 +4,14 @@
|
||||
*/
|
||||
|
||||
#define TAGS \
|
||||
const char *tags[] = { "fnord", "dev", "net", "work", "misc", NULL };
|
||||
const char *tags[] = { "work", "net", "fnord", NULL };
|
||||
|
||||
#define DEFMODE dotile /* dofloat */
|
||||
#define DEFTAG 1 /* index */
|
||||
#define FONT "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*"
|
||||
#define BGCOLOR "#0a2c2d"
|
||||
#define FGCOLOR "#ddeeee"
|
||||
#define BORDERCOLOR "#176164"
|
||||
#define DEFTAG 0 /* index */
|
||||
#define FONT "-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*"
|
||||
#define BGCOLOR "#eeeeee"
|
||||
#define FGCOLOR "#666699"
|
||||
#define BORDERCOLOR "#9999CC"
|
||||
#define MODKEY Mod1Mask
|
||||
#define NUMLOCKMASK Mod2Mask
|
||||
#define MASTERW 60 /* percent */
|
||||
@ -19,36 +19,30 @@ const char *tags[] = { "fnord", "dev", "net", "work", "misc", NULL };
|
||||
#define KEYS \
|
||||
static Key key[] = { \
|
||||
/* modifier key function arguments */ \
|
||||
{ MODKEY, XK_0, view, { .i = 0 } }, \
|
||||
{ MODKEY, XK_1, view, { .i = 1 } }, \
|
||||
{ MODKEY, XK_2, view, { .i = 2 } }, \
|
||||
{ MODKEY, XK_3, view, { .i = 3 } }, \
|
||||
{ MODKEY, XK_4, view, { .i = 4 } }, \
|
||||
{ MODKEY, XK_1, view, { .i = 0 } }, \
|
||||
{ MODKEY, XK_2, view, { .i = 1 } }, \
|
||||
{ MODKEY, XK_3, view, { .i = 2 } }, \
|
||||
{ MODKEY, XK_h, viewprev, { 0 } }, \
|
||||
{ MODKEY, XK_j, focusnext, { 0 } }, \
|
||||
{ MODKEY, XK_k, focusprev, { 0 } }, \
|
||||
{ MODKEY, XK_l, viewnext, { 0 } }, \
|
||||
{ MODKEY, XK_m, togglemax, { 0 } }, \
|
||||
{ MODKEY, XK_p, spawn, \
|
||||
{ .cmd = "exec `ls -lL /usr/bin /usr/local/bin 2>/dev/null |" \
|
||||
" awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort | uniq | dmenu`" } }, \
|
||||
{ .cmd = "exec `ls -lL /usr/bin /usr/local/bin 2>/dev/null | " \
|
||||
"awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort | uniq | dmenu`" } }, \
|
||||
{ MODKEY, XK_space, togglemode, { 0 } }, \
|
||||
{ MODKEY, XK_Return, zoom, { 0 } }, \
|
||||
{ MODKEY|ControlMask, XK_0, appendtag, { .i = 0 } }, \
|
||||
{ MODKEY|ControlMask, XK_1, appendtag, { .i = 1 } }, \
|
||||
{ MODKEY|ControlMask, XK_2, appendtag, { .i = 2 } }, \
|
||||
{ MODKEY|ControlMask, XK_3, appendtag, { .i = 3 } }, \
|
||||
{ MODKEY|ControlMask, XK_4, appendtag, { .i = 4 } }, \
|
||||
{ MODKEY|ShiftMask, XK_0, replacetag, { .i = 0 } }, \
|
||||
{ MODKEY|ShiftMask, XK_1, replacetag, { .i = 1 } }, \
|
||||
{ MODKEY|ShiftMask, XK_2, replacetag, { .i = 2 } }, \
|
||||
{ MODKEY|ShiftMask, XK_3, replacetag, { .i = 3 } }, \
|
||||
{ MODKEY|ShiftMask, XK_4, replacetag, { .i = 5 } }, \
|
||||
{ MODKEY|ControlMask, XK_1, appendtag, { .i = 0 } }, \
|
||||
{ MODKEY|ControlMask, XK_2, appendtag, { .i = 1 } }, \
|
||||
{ MODKEY|ControlMask, XK_3, appendtag, { .i = 2 } }, \
|
||||
{ MODKEY|ShiftMask, XK_1, replacetag, { .i = 0 } }, \
|
||||
{ MODKEY|ShiftMask, XK_2, replacetag, { .i = 1 } }, \
|
||||
{ MODKEY|ShiftMask, XK_3, replacetag, { .i = 2 } }, \
|
||||
{ MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \
|
||||
{ MODKEY|ShiftMask, XK_q, quit, { 0 } }, \
|
||||
{ MODKEY|ShiftMask, XK_Return, spawn, \
|
||||
{ .cmd = "exec urxvt -tr +sb -bg black -fg white -cr white " \
|
||||
"-fn '-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*'" } }, \
|
||||
{ .cmd = "exec uxterm -bg '#dddddd' -fg '#000000' -cr '#000000' +sb " \
|
||||
"-fn '-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*'" } }, \
|
||||
};
|
||||
|
||||
#define RULES \
|
||||
|
@ -1,5 +1,5 @@
|
||||
# dwm version
|
||||
VERSION = 0.7
|
||||
VERSION = 0.8
|
||||
|
||||
# Customize below to fit your system
|
||||
|
||||
|
24
draw.c
24
draw.c
@ -42,7 +42,7 @@ textnw(const char *text, unsigned int len)
|
||||
}
|
||||
|
||||
static void
|
||||
drawtext(const char *text, Bool invert, Bool border)
|
||||
drawtext(const char *text, Bool invert)
|
||||
{
|
||||
int x, y, w, h;
|
||||
static char buf[256];
|
||||
@ -52,14 +52,12 @@ drawtext(const char *text, Bool invert, Bool border)
|
||||
|
||||
XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg);
|
||||
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
|
||||
|
||||
w = 0;
|
||||
if(border)
|
||||
drawborder();
|
||||
drawborder();
|
||||
|
||||
if(!text)
|
||||
return;
|
||||
|
||||
w = 0;
|
||||
len = strlen(text);
|
||||
if(len >= sizeof(buf))
|
||||
len = sizeof(buf) - 1;
|
||||
@ -111,24 +109,24 @@ drawstatus()
|
||||
|
||||
dc.x = dc.y = 0;
|
||||
dc.w = bw;
|
||||
drawtext(NULL, !istile, False);
|
||||
drawtext(NULL, !istile);
|
||||
|
||||
dc.w = 0;
|
||||
for(i = 0; i < ntags; i++) {
|
||||
dc.x += dc.w;
|
||||
dc.w = textw(tags[i]);
|
||||
if(istile)
|
||||
drawtext(tags[i], (i == tsel), True);
|
||||
drawtext(tags[i], (i == tsel));
|
||||
else
|
||||
drawtext(tags[i], (i != tsel), True);
|
||||
drawtext(tags[i], (i != tsel));
|
||||
}
|
||||
x = dc.x + dc.w;
|
||||
dc.w = textw(stext);
|
||||
dc.x = bx + bw - dc.w;
|
||||
drawtext(stext, !istile, False);
|
||||
drawtext(stext, !istile);
|
||||
if(sel && ((dc.w = dc.x - x) >= bh)) {
|
||||
dc.x = x;
|
||||
drawtext(sel->name, istile, True);
|
||||
drawtext(sel->name, istile);
|
||||
}
|
||||
XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0);
|
||||
XSync(dpy, False);
|
||||
@ -140,7 +138,7 @@ drawtitle(Client *c)
|
||||
int i;
|
||||
Bool istile = arrange == dotile;
|
||||
|
||||
if(c == sel) {
|
||||
if(c == sel && issel) {
|
||||
drawstatus();
|
||||
XUnmapWindow(dpy, c->title);
|
||||
XSetWindowBorder(dpy, c->win, dc.fg);
|
||||
@ -157,12 +155,12 @@ drawtitle(Client *c)
|
||||
if(c->tags[i]) {
|
||||
dc.x += dc.w;
|
||||
dc.w = textw(tags[i]);
|
||||
drawtext(tags[i], !istile, True);
|
||||
drawtext(tags[i], !istile);
|
||||
}
|
||||
}
|
||||
dc.x += dc.w;
|
||||
dc.w = textw(c->name);
|
||||
drawtext(c->name, !istile, True);
|
||||
drawtext(c->name, !istile);
|
||||
XCopyArea(dpy, dc.drawable, c->title, dc.gc, 0, 0, c->tw, c->th, 0, 0);
|
||||
XSync(dpy, False);
|
||||
}
|
||||
|
41
dwm.1
41
dwm.1
@ -1,4 +1,4 @@
|
||||
.TH DWM 1 dwm-0.7
|
||||
.TH DWM 1 dwm-VERSION
|
||||
.SH NAME
|
||||
dwm \- dynamic window manager
|
||||
.SH SYNOPSIS
|
||||
@ -33,35 +33,35 @@ prints version information to standard output, then exits.
|
||||
.SH USAGE
|
||||
.TP
|
||||
.B Mod1-Return
|
||||
Zoom
|
||||
Zoom current
|
||||
.B window
|
||||
to the
|
||||
.B master
|
||||
column
|
||||
column.
|
||||
.TP
|
||||
.B Mod1-h
|
||||
Focus previous
|
||||
.B tag
|
||||
.B tag.
|
||||
.TP
|
||||
.B Mod1-j
|
||||
Focus next
|
||||
.B window
|
||||
.B window.
|
||||
.TP
|
||||
.B Mod1-k
|
||||
Focus previous
|
||||
.B window
|
||||
.B window.
|
||||
.TP
|
||||
.B Mod1-l
|
||||
Focus next
|
||||
.B tag
|
||||
.B tag.
|
||||
.TP
|
||||
.B Mod1-m
|
||||
Maximize current
|
||||
.B window
|
||||
.B window.
|
||||
.TP
|
||||
.B Mod1-[0..n]
|
||||
Focus
|
||||
.B nth tag
|
||||
.B nth tag.
|
||||
.TP
|
||||
.B Mod1-space
|
||||
Toggle between
|
||||
@ -69,41 +69,44 @@ Toggle between
|
||||
and
|
||||
.B floating
|
||||
mode (affects
|
||||
.BR "all windows" )
|
||||
.BR "all windows" ).
|
||||
.TP
|
||||
.B Mod1-Shift-[0..n]
|
||||
Apply
|
||||
.B nth tag
|
||||
to current
|
||||
.B window
|
||||
.B window.
|
||||
.TP
|
||||
.B Mod1-Shift-q
|
||||
Quit
|
||||
.B dwm
|
||||
.B dwm.
|
||||
.TP
|
||||
.B Mod1-Shift-Return
|
||||
Start
|
||||
.B terminal
|
||||
.B terminal.
|
||||
.TP
|
||||
.B Mod1-Control-[0..n]
|
||||
Append
|
||||
.B nth tag
|
||||
to current
|
||||
.B window
|
||||
.B window.
|
||||
.TP
|
||||
.B Mod1-Button1
|
||||
Moves current
|
||||
Move current
|
||||
.B window
|
||||
while dragging
|
||||
while dragging.
|
||||
.TP
|
||||
.B Mod1-Button2
|
||||
Lowers current
|
||||
Zoom current
|
||||
.B window
|
||||
to the
|
||||
.B master
|
||||
column.
|
||||
.TP
|
||||
.B Mod1-Button3
|
||||
Resizes current
|
||||
Resize current
|
||||
.B window
|
||||
while dragging
|
||||
while dragging.
|
||||
.SH CUSTOMIZATION
|
||||
.B dwm
|
||||
is customized by creating a custom config.h and (re)compiling the source
|
||||
|
1
dwm.h
1
dwm.h
@ -91,7 +91,6 @@ extern Client *getctitle(Window w);
|
||||
extern void gravitate(Client *c, Bool invert);
|
||||
extern void higher(Client *c);
|
||||
extern void killclient(Arg *arg);
|
||||
extern void lower(Client *c);
|
||||
extern void manage(Window w, XWindowAttributes *wa);
|
||||
extern void resize(Client *c, Bool sizehints, Corner sticky);
|
||||
extern void setsize(Client *c);
|
||||
|
9
dwm.html
9
dwm.html
@ -21,7 +21,7 @@
|
||||
<p>
|
||||
dwm is a dynamic window manager for X11.
|
||||
</p>
|
||||
<h4>Philosophy</h4>
|
||||
<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
|
||||
@ -95,15 +95,16 @@
|
||||
<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-20060801.png">Screenshot</a> (20060801)</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></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-0.7.tar.gz">dwm 0.7</a> (14kb) (20060807)</li>
|
||||
<li><a href="http://10kloc.org/download/dmenu-0.2.tar.gz">dmenu 0.2</a> (7kb) (20060807)</li>
|
||||
<li><a href="http://10kloc.org/download/dwm-0.8.tar.gz">dwm 0.8</a> (14kb) (20060810)</li>
|
||||
<li><a href="http://10kloc.org/download/dmenu-0.3.tar.gz">dmenu 0.3</a> (7kb) (20060810)</li>
|
||||
</ul>
|
||||
<h3>Development</h3>
|
||||
<p>
|
||||
|
37
event.c
37
event.c
@ -114,32 +114,30 @@ buttonpress(XEvent *e)
|
||||
}
|
||||
break;
|
||||
case Button4:
|
||||
viewnext(&a);
|
||||
viewprev(&a);
|
||||
break;
|
||||
case Button5:
|
||||
viewprev(&a);
|
||||
viewnext(&a);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if((c = getclient(ev->window))) {
|
||||
higher(c);
|
||||
focus(c);
|
||||
switch(ev->button) {
|
||||
default:
|
||||
break;
|
||||
case Button1:
|
||||
if(!c->ismax && (arrange == dofloat || c->isfloat)) {
|
||||
higher(c);
|
||||
if(!c->ismax && (arrange == dofloat || c->isfloat))
|
||||
movemouse(c);
|
||||
}
|
||||
break;
|
||||
case Button2:
|
||||
lower(c);
|
||||
if(!c->ismax && arrange != dofloat && !c->isfloat)
|
||||
zoom(NULL);
|
||||
break;
|
||||
case Button3:
|
||||
if(!c->ismax && (arrange == dofloat || c->isfloat)) {
|
||||
higher(c);
|
||||
if(!c->ismax && (arrange == dofloat || c->isfloat))
|
||||
resizemouse(c);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -223,13 +221,16 @@ enternotify(XEvent *e)
|
||||
Client *c;
|
||||
XCrossingEvent *ev = &e->xcrossing;
|
||||
|
||||
if(ev->detail == NotifyInferior)
|
||||
if(ev->mode != NotifyNormal || ev->detail == NotifyInferior)
|
||||
return;
|
||||
|
||||
if((c = getclient(ev->window)) || (c = getctitle(ev->window)))
|
||||
focus(c);
|
||||
else if(ev->window == root)
|
||||
else if(ev->window == root) {
|
||||
issel = True;
|
||||
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
|
||||
drawall();
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@ -269,8 +270,10 @@ leavenotify(XEvent *e)
|
||||
{
|
||||
XCrossingEvent *ev = &e->xcrossing;
|
||||
|
||||
if((ev->window == root) && !ev->same_screen)
|
||||
issel = True;
|
||||
if((ev->window == root) && !ev->same_screen) {
|
||||
issel = False;
|
||||
drawall();
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@ -359,20 +362,12 @@ grabkeys()
|
||||
|
||||
for(i = 0; i < len; i++) {
|
||||
code = XKeysymToKeycode(dpy, key[i].keysym);
|
||||
/* normal */
|
||||
XUngrabKey(dpy, code, key[i].mod, root);
|
||||
XGrabKey(dpy, code, key[i].mod, root, True,
|
||||
GrabModeAsync, GrabModeAsync);
|
||||
/* capslock */
|
||||
XUngrabKey(dpy, code, key[i].mod | LockMask, root);
|
||||
XGrabKey(dpy, code, key[i].mod | LockMask, root, True,
|
||||
GrabModeAsync, GrabModeAsync);
|
||||
/* numlock */
|
||||
XUngrabKey(dpy, code, key[i].mod | NUMLOCKMASK, root);
|
||||
XGrabKey(dpy, code, key[i].mod | NUMLOCKMASK, root, True,
|
||||
GrabModeAsync, GrabModeAsync);
|
||||
/* capslock & numlock */
|
||||
XUngrabKey(dpy, code, key[i].mod | NUMLOCKMASK | LockMask, root);
|
||||
XGrabKey(dpy, code, key[i].mod | NUMLOCKMASK | LockMask, root, True,
|
||||
GrabModeAsync, GrabModeAsync);
|
||||
}
|
||||
|
6
main.c
6
main.c
@ -240,6 +240,8 @@ main(int argc, char *argv[])
|
||||
|
||||
dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
|
||||
dc.gc = XCreateGC(dpy, root, 0, 0);
|
||||
|
||||
strcpy(stext, "dwm-"VERSION);
|
||||
drawstatus();
|
||||
|
||||
issel = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask);
|
||||
@ -248,10 +250,10 @@ main(int argc, char *argv[])
|
||||
wa.cursor = cursor[CurNormal];
|
||||
XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
|
||||
|
||||
strcpy(stext, "dwm-"VERSION);
|
||||
scan();
|
||||
|
||||
/* main event loop, reads status text from stdin as well */
|
||||
/* main event loop, also reads status text from stdin */
|
||||
XSync(dpy, False);
|
||||
while(running) {
|
||||
FD_ZERO(&rd);
|
||||
if(readin)
|
||||
|
5
tag.c
5
tag.c
@ -106,7 +106,10 @@ dotile(Arg *arg)
|
||||
c->x = sx + mw;
|
||||
c->y = sy + (i - 1) * h + bh;
|
||||
c->w = w - 2;
|
||||
c->h = h - 2;
|
||||
if(i + 1 == n)
|
||||
c->h = sh - c->y - 2;
|
||||
else
|
||||
c->h = h - 2;
|
||||
}
|
||||
else { /* fallback if h < bh */
|
||||
c->x = sx + mw;
|
||||
|
Reference in New Issue
Block a user