Compare commits

..

25 Commits
1.0 ... 1.1

Author SHA1 Message Date
a50b15a9e9 added a comment to spawn 2006-08-28 08:17:27 +02:00
0a25fe9188 applied sanders focus_ patches 2006-08-28 08:06:50 +02:00
2dd5212a79 applied sanders somepatches.patch 2006-08-28 08:02:29 +02:00
00e95e1f38 oh frking dear big font... 2006-08-25 18:14:55 +02:00
0a0759132c term enlightened 2006-08-25 18:05:18 +02:00
5cf362c7d0 switching to darker colorscheme with larger font 2006-08-25 18:03:56 +02:00
413be1112a patched arg.h 2006-08-25 17:42:58 +02:00
8233dc8568 new stuff 2006-08-25 17:34:03 +02:00
afa8b3bcd9 switching to dark colors again 2006-08-25 17:31:57 +02:00
c518345f40 updated man page of dwm 2006-08-25 16:21:45 +02:00
afe6ac9923 changed order of options 2006-08-25 16:15:13 +02:00
e995c1b532 trying a different configuration 2006-08-25 15:48:44 +02:00
e36929292e removed small 1px gap, somehow without it things feel better 2006-08-25 15:37:00 +02:00
03128f78df oops 2006-08-25 15:24:18 +02:00
7d4a5e654c fixed typo 2006-08-25 15:21:49 +02:00
41ba7a7984 s/TILED/TILE/g 2006-08-25 15:16:20 +02:00
aa471f2d65 removed a bunch of lines, made mode symbols configurable 2006-08-25 15:12:32 +02:00
d37dfa1bed changed symbols for float/tiled mode, added mouse-driven mode toggle to buttonpress() 2006-08-25 15:06:38 +02:00
9f35cc52fe small fix to separate client title from right-most tag 2006-08-25 14:46:01 +02:00
f1fe19bc2b restored config.arg.h 2006-08-25 13:02:07 +02:00
b55bd709ee new color stuff/new rendering stuff 2006-08-25 12:59:45 +02:00
9833610356 back to 3 colors 2006-08-25 07:54:49 +02:00
de7fc0011e fixed 2006-08-24 12:07:10 +02:00
2e0c767d74 3->4 colors 2006-08-24 12:04:56 +02:00
a5379e901c Added tag 1.0 for changeset bbc98e77ae89a7c9232a5be0835f60ea00d8036e 2006-08-24 10:28:50 +02:00
11 changed files with 129 additions and 93 deletions

View File

@ -7,3 +7,4 @@ c11f86db4550cac5d0a648a3fe4d6d3b9a4fcf7e 0.6
3fb41412e2492f66476d92ce8f007a8b48fb1d2a 0.7 3fb41412e2492f66476d92ce8f007a8b48fb1d2a 0.7
cd15de32e173f8ce97bfe1c9b6607937b59056b4 0.8 cd15de32e173f8ce97bfe1c9b6607937b59056b4 0.8
fae61afa861755636c4a1070694209ace8efbb6c 0.9 fae61afa861755636c4a1070694209ace8efbb6c 0.9
bbc98e77ae89a7c9232a5be0835f60ea00d8036e 1.0

View File

@ -11,16 +11,42 @@
/* static functions */ /* static functions */
static void static void
grabbutton(Client *c, unsigned int button, unsigned int modifier) grabbuttons(Client *c, Bool focus)
{ {
XGrabButton(dpy, button, modifier, c->win, False, BUTTONMASK, XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
if(focus) {
XGrabButton(dpy, Button1, MODKEY, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None); GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, button, modifier | LockMask, c->win, False, BUTTONMASK, XGrabButton(dpy, Button1, MODKEY | LockMask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None); GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, button, modifier | numlockmask, c->win, False, BUTTONMASK, XGrabButton(dpy, Button1, MODKEY | numlockmask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None); GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, button, modifier | numlockmask | LockMask, c->win, False, BUTTONMASK, XGrabButton(dpy, Button1, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None); GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button2, MODKEY, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button2, MODKEY | LockMask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button2, MODKEY | numlockmask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button2, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button3, MODKEY, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button3, MODKEY | LockMask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button3, MODKEY | numlockmask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button3, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
}
else
XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
} }
static void static void
@ -40,15 +66,6 @@ resizetitle(Client *c)
} }
static void
ungrabbutton(Client *c, unsigned int button, unsigned int modifier)
{
XUngrabButton(dpy, button, modifier, c->win);
XUngrabButton(dpy, button, modifier | LockMask, c->win);
XUngrabButton(dpy, button, modifier | numlockmask, c->win);
XUngrabButton(dpy, button, modifier | numlockmask | LockMask, c->win);
}
static int static int
xerrordummy(Display *dsply, XErrorEvent *ee) xerrordummy(Display *dsply, XErrorEvent *ee)
{ {
@ -77,10 +94,10 @@ focus(Client *c)
if(sel->ismax) if(sel->ismax)
togglemax(NULL); togglemax(NULL);
sel = c; sel = c;
grabbutton(old, AnyButton, 0); grabbuttons(old, False);
drawtitle(old); drawtitle(old);
} }
ungrabbutton(c, AnyButton, 0); grabbuttons(c, True);
drawtitle(c); drawtitle(c);
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
} }
@ -220,9 +237,7 @@ manage(Window w, XWindowAttributes *wa)
c->next = clients; c->next = clients;
clients = c; clients = c;
grabbutton(c, Button1, MODKEY); grabbuttons(c, False);
grabbutton(c, Button2, MODKEY);
grabbutton(c, Button3, MODKEY);
if((tc = getclient(trans))) /* inherit tags */ if((tc = getclient(trans))) /* inherit tags */
for(i = 0; i < ntags; i++) for(i = 0; i < ntags; i++)
@ -384,9 +399,13 @@ togglemax(Arg *arg)
void void
unmanage(Client *c) unmanage(Client *c)
{ {
Client *tc;
Window trans;
XGrabServer(dpy); XGrabServer(dpy);
XSetErrorHandler(xerrordummy); XSetErrorHandler(xerrordummy);
XGetTransientForHint(dpy, c->win, &trans);
XUngrabButton(dpy, AnyButton, AnyModifier, c->win); XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
XDestroyWindow(dpy, c->twin); XDestroyWindow(dpy, c->twin);
@ -396,8 +415,12 @@ unmanage(Client *c)
c->next->prev = c->prev; c->next->prev = c->prev;
if(c == clients) if(c == clients)
clients = c->next; clients = c->next;
if(sel == c) if(sel == c) {
if(trans && (tc = getclient(trans)) && isvisible(tc))
sel = tc;
else
sel = getnext(clients); sel = getnext(clients);
}
free(c->tags); free(c->tags);
free(c); free(c);

View File

@ -7,10 +7,17 @@
const char *tags[] = { "work", "net", "fnord", NULL }; const char *tags[] = { "work", "net", "fnord", NULL };
#define DEFMODE dotile /* dofloat */ #define DEFMODE dotile /* dofloat */
#define FLOATSYMBOL "><>"
#define TILESYMBOL "[]="
#define FONT "-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*" #define FONT "-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*"
#define BGCOLOR "#666699" #define SELBGCOLOR "#333366"
#define FGCOLOR "#eeeeee" #define SELFGCOLOR "#eeeeee"
#define BORDERCOLOR "#9999CC" #define NORMBGCOLOR "#333333"
#define NORMFGCOLOR "#dddddd"
#define STATUSBGCOLOR "#222222"
#define STATUSFGCOLOR "#9999cc"
#define MODKEY Mod1Mask #define MODKEY Mod1Mask
#define MASTERW 60 /* percent */ #define MASTERW 60 /* percent */
@ -18,7 +25,7 @@ const char *tags[] = { "work", "net", "fnord", NULL };
static Key key[] = { \ static Key key[] = { \
/* modifier key function arguments */ \ /* modifier key function arguments */ \
{ MODKEY|ShiftMask, XK_Return, spawn, \ { MODKEY|ShiftMask, XK_Return, spawn, \
{ .cmd = "exec uxterm -bg '#e0e0e0' -fg '#000000' -cr '#000000' +sb -fn '"FONT"'" } }, \ { .cmd = "exec uxterm -bg '#111111' -fg '#eeeeee' -cr '#eeeeee' +sb -fn '"FONT"'" } }, \
{ MODKEY, XK_p, spawn, \ { MODKEY, XK_p, spawn, \
{ .cmd = "exec `ls -lL /usr/bin /usr/X11R6/bin /usr/local/bin 2>/dev/null | " \ { .cmd = "exec `ls -lL /usr/bin /usr/X11R6/bin /usr/local/bin 2>/dev/null | " \
"awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort -u | dmenu`" } }, \ "awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort -u | dmenu`" } }, \

View File

@ -7,10 +7,17 @@
const char *tags[] = { "1", "2", "3", "4", "5", NULL }; const char *tags[] = { "1", "2", "3", "4", "5", NULL };
#define DEFMODE dotile /* dofloat */ #define DEFMODE dotile /* dofloat */
#define FLOATSYMBOL "~"
#define TILESYMBOL "#"
#define FONT "fixed" #define FONT "fixed"
#define BGCOLOR "#666699" #define SELBGCOLOR "#666699"
#define FGCOLOR "#eeeeee" #define SELFGCOLOR "#eeeeee"
#define BORDERCOLOR "#9999CC" #define NORMBGCOLOR "#333366"
#define NORMFGCOLOR "#cccccc"
#define STATUSBGCOLOR "#dddddd"
#define STATUSFGCOLOR "#222222"
#define MODKEY Mod1Mask #define MODKEY Mod1Mask
#define MASTERW 60 /* percent */ #define MASTERW 60 /* percent */
@ -48,7 +55,7 @@ static Key key[] = { \
}; };
/* Query class:instance:title for regex matching info with following command: /* Query class:instance:title for regex matching info with following command:
* xprop | awk -F '"' '/^WM_CLASS/ { printf("%s:%s:",$4,$2) }; /^WM_NAME/{ printf("%s\n",$2) }' */ * xprop | awk -F '"' '/^WM_CLASS/ { printf("%s:%s:",$4,$2) }; /^WM_NAME/ { printf("%s\n",$2) }' */
#define RULES \ #define RULES \
static Rule rule[] = { \ static Rule rule[] = { \
/* class:instance:title regex tags regex isfloat */ \ /* class:instance:title regex tags regex isfloat */ \

View File

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

71
draw.c
View File

@ -22,29 +22,16 @@ textnw(const char *text, unsigned int len)
} }
static void static void
drawtext(const char *text, Bool invert, Bool highlight) drawtext(const char *text, unsigned long col[ColLast], Bool highlight)
{ {
int x, y, w, h; int x, y, w, h;
static char buf[256]; static char buf[256];
unsigned int len, olen; unsigned int len, olen;
XGCValues gcv; XGCValues gcv;
XPoint points[5];
XRectangle r = { dc.x, dc.y, dc.w, dc.h }; XRectangle r = { dc.x, dc.y, dc.w, dc.h };
XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg); XSetForeground(dpy, dc.gc, col[ColBG]);
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
points[0].x = dc.x;
points[0].y = dc.y;
points[1].x = dc.w - 1;
points[1].y = 0;
points[2].x = 0;
points[2].y = dc.h - 1;
points[3].x = -(dc.w - 1);
points[3].y = 0;
points[4].x = 0;
points[4].y = -(dc.h - 1);
XSetForeground(dpy, dc.gc, dc.border);
XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
if(!text) if(!text)
return; return;
@ -74,29 +61,21 @@ drawtext(const char *text, Bool invert, Bool highlight)
if(w > dc.w) if(w > dc.w)
return; /* too long */ return; /* too long */
gcv.foreground = invert ? dc.bg : dc.fg; gcv.foreground = col[ColFG];
gcv.background = invert ? dc.fg : dc.bg;
if(dc.font.set) { if(dc.font.set) {
XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv); XChangeGC(dpy, dc.gc, GCForeground, &gcv);
XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
} }
else { else {
gcv.font = dc.font.xfont->fid; gcv.font = dc.font.xfont->fid;
XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv); XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv);
XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
} }
if(highlight) { if(highlight) {
points[0].x = dc.x + 1; r.x = dc.x + 2;
points[0].y = dc.y + 1; r.y = dc.y + 2;
points[1].x = dc.w - 3; r.width = r.height = 3;
points[1].y = 0; XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
points[2].x = 0;
points[2].y = dc.h - 3;
points[3].x = -(dc.w - 3);
points[3].y = 0;
points[4].x = 0;
points[4].y = -(dc.h - 3);
XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
} }
} }
@ -116,21 +95,21 @@ void
drawstatus() drawstatus()
{ {
int i, x; int i, x;
Bool istile = arrange == dotile;
dc.x = dc.y = 0; dc.x = dc.y = 0;
dc.w = bw;
drawtext(NULL, !istile, False);
dc.w = 0;
for(i = 0; i < ntags; i++) { for(i = 0; i < ntags; i++) {
dc.x += dc.w;
dc.w = textw(tags[i]); dc.w = textw(tags[i]);
if(istile) if(seltag[i])
drawtext(tags[i], seltag[i], sel && sel->tags[i]); drawtext(tags[i], dc.sel, sel && sel->tags[i]);
else else
drawtext(tags[i], !seltag[i], sel && sel->tags[i]); drawtext(tags[i], dc.norm, sel && sel->tags[i]);
dc.x += dc.w;
} }
dc.w = bmw;
drawtext(arrange == dotile ? TILESYMBOL : FLOATSYMBOL, dc.status, False);
x = dc.x + dc.w; x = dc.x + dc.w;
dc.w = textw(stext); dc.w = textw(stext);
dc.x = bx + bw - dc.w; dc.x = bx + bw - dc.w;
@ -138,11 +117,14 @@ drawstatus()
dc.x = x; dc.x = x;
dc.w = bw - x; dc.w = bw - x;
} }
drawtext(stext, !istile, False); drawtext(stext, dc.status, False);
if(sel && ((dc.w = dc.x - x) > bh)) { if((dc.w = dc.x - x) > bh) {
dc.x = x; dc.x = x;
drawtext(sel->name, istile, False); if(sel)
drawtext(sel->name, dc.sel, False);
else
drawtext(NULL, dc.norm, False);
} }
XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0); XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0);
XSync(dpy, False); XSync(dpy, False);
@ -152,20 +134,19 @@ void
drawtitle(Client *c) drawtitle(Client *c)
{ {
int i; int i;
Bool istile = arrange == dotile;
if(c == sel && issel) { if(c == sel && issel) {
drawstatus(); drawstatus();
XUnmapWindow(dpy, c->twin); XUnmapWindow(dpy, c->twin);
XSetWindowBorder(dpy, c->win, dc.fg); XSetWindowBorder(dpy, c->win, dc.sel[ColBG]);
return; return;
} }
XSetWindowBorder(dpy, c->win, dc.bg); XSetWindowBorder(dpy, c->win, dc.norm[ColBG]);
XMapWindow(dpy, c->twin); XMapWindow(dpy, c->twin);
dc.x = dc.y = 0; dc.x = dc.y = 0;
dc.w = c->tw; dc.w = c->tw;
drawtext(c->name, !istile, False); drawtext(c->name, dc.norm, False);
XCopyArea(dpy, dc.drawable, c->twin, dc.gc, 0, 0, c->tw, c->th, 0, 0); XCopyArea(dpy, dc.drawable, c->twin, dc.gc, 0, 0, c->tw, c->th, 0, 0);
XSync(dpy, False); XSync(dpy, False);
} }

13
dwm.1
View File

@ -21,9 +21,9 @@ tags. Selecting a certain tag for viewing will display all windows with that
tag. tag.
.P .P
.B dwm .B dwm
contains a small status bar which displays all available tags, the title contains a small status bar which displays all available tags, the mode, the
of the focused window, and the text read from standard input. The tags of the title of the focused window, and the text read from standard input. The tags of
focused window are highlighted. the focused window are highlighted with a small point.
.P .P
.B dwm .B dwm
draws a 1-pixel border around windows to indicate the focus state. draws a 1-pixel border around windows to indicate the focus state.
@ -40,7 +40,12 @@ is read and displayed in the status text area.
.TP .TP
.B Button1 .B Button1
click on a tag label views all windows with that click on a tag label views all windows with that
.BR tag . .BR tag ,
click on the mode label toggles between
.B tiled
and
.B floating
mode.
.TP .TP
.B Button3 .B Button3
click on a tag label adds/removes all windows with that click on a tag label adds/removes all windows with that

11
dwm.h
View File

@ -23,6 +23,9 @@ enum { WMProtocols, WMDelete, WMLast };
/* cursor */ /* cursor */
enum { CurNormal, CurResize, CurMove, CurLast }; enum { CurNormal, CurResize, CurMove, CurLast };
/* color */
enum { ColFG, ColBG, ColLast };
/* window corners */ /* window corners */
typedef enum { TopLeft, TopRight, BotLeft, BotRight } Corner; typedef enum { TopLeft, TopRight, BotLeft, BotRight } Corner;
@ -36,9 +39,9 @@ typedef struct {
typedef struct { /* draw context */ typedef struct { /* draw context */
int x, y, w, h; int x, y, w, h;
unsigned long bg; unsigned long norm[ColLast];
unsigned long fg; unsigned long sel[ColLast];
unsigned long border; unsigned long status[ColLast];
Drawable drawable; Drawable drawable;
Fnt font; Fnt font;
GC gc; GC gc;
@ -65,7 +68,7 @@ struct Client {
extern const char *tags[]; extern const char *tags[];
extern char stext[1024]; extern char stext[1024];
extern int screen, sx, sy, sw, sh, bx, by, bw, bh, mw; extern int bx, by, bw, bh, bmw, mw, screen, sx, sy, sw, sh;
extern unsigned int ntags, numlockmask; extern unsigned int ntags, numlockmask;
extern void (*handler[LASTEvent])(XEvent *); extern void (*handler[LASTEvent])(XEvent *);
extern void (*arrange)(Arg *); extern void (*arrange)(Arg *);

View File

@ -116,10 +116,14 @@ buttonpress(XEvent *e)
return; return;
} }
} }
if(ev->x < x + bmw) {
if(ev->button == Button1)
togglemode(NULL);
}
} }
else if((c = getclient(ev->window))) { else if((c = getclient(ev->window))) {
focus(c); focus(c);
if(CLEANMASK(ev->state) == 0) if(CLEANMASK(ev->state) != MODKEY)
return; return;
switch(ev->button) { switch(ev->button) {
default: default:

14
main.c
View File

@ -19,7 +19,7 @@
char stext[1024]; char stext[1024];
Bool *seltag; Bool *seltag;
int screen, sx, sy, sw, sh, bx, by, bw, bh, mw; int bx, by, bw, bh, bmw, mw, screen, sx, sy, sw, sh;
unsigned int ntags, numlockmask; unsigned int ntags, numlockmask;
Atom wmatom[WMLast], netatom[NetLast]; Atom wmatom[WMLast], netatom[NetLast];
Bool running = True; Bool running = True;
@ -121,11 +121,15 @@ setup()
seltag[0] = True; seltag[0] = True;
/* style */ /* style */
dc.bg = getcolor(BGCOLOR); dc.norm[ColBG] = getcolor(NORMBGCOLOR);
dc.fg = getcolor(FGCOLOR); dc.norm[ColFG] = getcolor(NORMFGCOLOR);
dc.border = getcolor(BORDERCOLOR); dc.sel[ColBG] = getcolor(SELBGCOLOR);
dc.sel[ColFG] = getcolor(SELFGCOLOR);
dc.status[ColBG] = getcolor(STATUSBGCOLOR);
dc.status[ColFG] = getcolor(STATUSFGCOLOR);
setfont(FONT); setfont(FONT);
bmw = textw(FLOATSYMBOL) > textw(TILESYMBOL) ? textw(FLOATSYMBOL) : textw(TILESYMBOL);
sx = sy = 0; sx = sy = 0;
sw = DisplayWidth(dpy, screen); sw = DisplayWidth(dpy, screen);
sh = DisplayHeight(dpy, screen); sh = DisplayHeight(dpy, screen);
@ -133,7 +137,7 @@ setup()
bx = by = 0; bx = by = 0;
bw = sw; bw = sw;
dc.h = bh = dc.font.height + 4; dc.h = bh = dc.font.height + 2;
wa.override_redirect = 1; wa.override_redirect = 1;
wa.background_pixmap = ParentRelative; wa.background_pixmap = ParentRelative;
wa.event_mask = ButtonPressMask | ExposureMask; wa.event_mask = ButtonPressMask | ExposureMask;

1
util.c
View File

@ -51,6 +51,7 @@ spawn(Arg *arg)
if(!arg->cmd) if(!arg->cmd)
return; return;
/* the double-fork construct avoids zombie processes */
if(fork() == 0) { if(fork() == 0) {
if(fork() == 0) { if(fork() == 0) {
if(dpy) if(dpy)