Compare commits
32 Commits
Author | SHA1 | Date | |
---|---|---|---|
b5d297f02f | |||
9056d7ea88 | |||
ebd17e4827 | |||
7e59c89250 | |||
9e4e4d9022 | |||
71fd06f843 | |||
58e6866d86 | |||
c7da124149 | |||
21bd90d7d3 | |||
c8f96b5b4c | |||
ded60365d4 | |||
629647dfee | |||
4ca3d861f0 | |||
069e7a6e24 | |||
ac6e34ea06 | |||
a308b7507a | |||
630e7ff26f | |||
3764ab471b | |||
a3319c6f8e | |||
66c699a701 | |||
aaf1e44da9 | |||
1ef2307ec4 | |||
d42c3ba2dc | |||
4b06155873 | |||
857d825eeb | |||
6b345353e3 | |||
ab3b3a8f61 | |||
71b82fb1f6 | |||
9bd9ea423e | |||
99964398e7 | |||
7009ebfa69 | |||
760e23dd3a |
4
.hgtags
4
.hgtags
@ -23,3 +23,7 @@ a2c465098a3b972bbed00feda9804b6aae1e9531 2.1
|
||||
7e92f58754ae6edb3225f26d754bd89c1ff458cf 2.2
|
||||
719b37b37b0df829d7cf017ac70e353088fe5849 2.3
|
||||
32b246925086910d63147483160281a91a47479f 2.4
|
||||
dcbbfabc8ecc5f33a6cc950584de87da1a368045 2.5
|
||||
c7f84f23ec5aef29988dcdc4ec22a7352ee8f58e 2.5.1
|
||||
5308dd22b6ee8e3218c81d9e7e4125f235bb5778 2.6
|
||||
21951c0dfbae5af68ed77821a4d87253ee91803f 2.7
|
||||
|
60
client.c
60
client.c
@ -131,58 +131,6 @@ getctitle(Window w) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
gravitate(Client *c, Bool invert) {
|
||||
int dx = 0, dy = 0;
|
||||
|
||||
switch(c->grav) {
|
||||
default:
|
||||
break;
|
||||
case StaticGravity:
|
||||
case NorthWestGravity:
|
||||
case NorthGravity:
|
||||
case NorthEastGravity:
|
||||
dy = c->border;
|
||||
break;
|
||||
case EastGravity:
|
||||
case CenterGravity:
|
||||
case WestGravity:
|
||||
dy = -(c->h / 2) + c->border;
|
||||
break;
|
||||
case SouthEastGravity:
|
||||
case SouthGravity:
|
||||
case SouthWestGravity:
|
||||
dy = -(c->h);
|
||||
break;
|
||||
}
|
||||
switch (c->grav) {
|
||||
default:
|
||||
break;
|
||||
case StaticGravity:
|
||||
case NorthWestGravity:
|
||||
case WestGravity:
|
||||
case SouthWestGravity:
|
||||
dx = c->border;
|
||||
break;
|
||||
case NorthGravity:
|
||||
case CenterGravity:
|
||||
case SouthGravity:
|
||||
dx = -(c->w / 2) + c->border;
|
||||
break;
|
||||
case NorthEastGravity:
|
||||
case EastGravity:
|
||||
case SouthEastGravity:
|
||||
dx = -(c->w + c->border);
|
||||
break;
|
||||
}
|
||||
if(invert) {
|
||||
dx = -dx;
|
||||
dy = -dy;
|
||||
}
|
||||
c->x += dx;
|
||||
c->y += dy;
|
||||
}
|
||||
|
||||
void
|
||||
killclient(Arg *arg) {
|
||||
if(!sel)
|
||||
@ -208,7 +156,7 @@ manage(Window w, XWindowAttributes *wa) {
|
||||
c->w = c->tw = wa->width;
|
||||
c->h = wa->height;
|
||||
c->th = bh;
|
||||
updatesize(c);
|
||||
updatesizehints(c);
|
||||
if(c->x + c->w + 2 * BORDERPX > sw)
|
||||
c->x = sw - c->w - 2 * BORDERPX;
|
||||
if(c->x < sx)
|
||||
@ -308,7 +256,7 @@ resizetitle(Client *c) {
|
||||
}
|
||||
|
||||
void
|
||||
updatesize(Client *c) {
|
||||
updatesizehints(Client *c) {
|
||||
long msize;
|
||||
XSizeHints size;
|
||||
|
||||
@ -341,10 +289,6 @@ updatesize(Client *c) {
|
||||
c->minw = c->minh = 0;
|
||||
c->isfixed = (c->maxw && c->minw && c->maxh && c->minh &&
|
||||
c->maxw == c->minw && c->maxh == c->minh);
|
||||
if(c->flags & PWinGravity)
|
||||
c->grav = size.win_gravity;
|
||||
else
|
||||
c->grav = NorthWestGravity;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -9,7 +9,7 @@ const char *tags[] = { "dev", "work", "net", "fnord", NULL };
|
||||
#define FLOATSYMBOL "><>"
|
||||
#define TILESYMBOL "[]="
|
||||
|
||||
#define FONT "-*-terminus-medium-*-*-*-14-*-*-*-*-*-iso10646-*"
|
||||
#define FONT "-*-terminus-medium-r-*-*-14-*-*-*-*-*-*-*"
|
||||
#define NORMBGCOLOR "#333333"
|
||||
#define NORMFGCOLOR "#cccccc"
|
||||
#define SELBGCOLOR "#336699"
|
||||
@ -25,11 +25,11 @@ const char *tags[] = { "dev", "work", "net", "fnord", NULL };
|
||||
static Key key[] = { \
|
||||
/* modifier key function argument */ \
|
||||
{ MODKEY|ShiftMask, XK_Return, spawn, \
|
||||
{ .cmd = "exec urxvtc -tr -bg black -fg '#eeeeee' -cr '#eeeeee' +sb -fn '"FONT"'" } }, \
|
||||
{ .cmd = "exec uxterm -bg black -fg '#eeeeee' -cr '#eeeeee' +sb -fn '"FONT"'" } }, \
|
||||
{ MODKEY, XK_p, spawn, \
|
||||
{ .cmd = "exe=\"$(lsx `echo $PATH | sed 's/:/ /g'` | sort -u " \
|
||||
" | dmenu -font '"FONT"' -normbg '"NORMBGCOLOR"' -normfg '"NORMFGCOLOR"' " \
|
||||
"-selbg '"SELBGCOLOR"' -selfg '"SELFGCOLOR"')\" && exec $exe" } }, \
|
||||
" | dmenu -fn '"FONT"' -nb '"NORMBGCOLOR"' -nf '"NORMFGCOLOR"' " \
|
||||
"-sb '"SELBGCOLOR"' -sf '"SELFGCOLOR"')\" && exec $exe" } }, \
|
||||
{ MODKEY, XK_j, focusnext, { 0 } }, \
|
||||
{ MODKEY, XK_k, focusprev, { 0 } }, \
|
||||
{ MODKEY, XK_Return, zoom, { 0 } }, \
|
||||
|
@ -9,7 +9,7 @@ const char *tags[] = { "1", "2", "3", "4", "5", NULL };
|
||||
#define FLOATSYMBOL "><>"
|
||||
#define TILESYMBOL "[]="
|
||||
|
||||
#define FONT "fixed"
|
||||
#define FONT "-*-fixed-medium-r-normal-*-13-*-*-*-*-*-*-*"
|
||||
#define NORMBGCOLOR "#333366"
|
||||
#define NORMFGCOLOR "#cccccc"
|
||||
#define SELBGCOLOR "#666699"
|
||||
|
@ -1,5 +1,5 @@
|
||||
# dwm version
|
||||
VERSION = 2.5
|
||||
VERSION = 2.8
|
||||
|
||||
# Customize below to fit your system
|
||||
|
||||
@ -20,6 +20,11 @@ LDFLAGS = ${LIBS}
|
||||
#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
|
||||
#LDFLAGS = -g ${LIBS}
|
||||
|
||||
# Solaris
|
||||
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
|
||||
#LDFLAGS = ${LIBS}
|
||||
#CFLAGS += -xtarget=ultra
|
||||
|
||||
# compiler and linker
|
||||
CC = cc
|
||||
LD = ${CC}
|
||||
|
15
draw.c
15
draw.c
@ -4,7 +4,6 @@
|
||||
#include "dwm.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <X11/Xlocale.h>
|
||||
|
||||
/* static */
|
||||
|
||||
@ -167,11 +166,10 @@ getcolor(const char *colstr) {
|
||||
|
||||
void
|
||||
setfont(const char *fontstr) {
|
||||
char **missing, *def;
|
||||
char *def, **missing;
|
||||
int i, n;
|
||||
|
||||
missing = NULL;
|
||||
setlocale(LC_ALL, "");
|
||||
if(dc.font.set)
|
||||
XFreeFontSet(dpy, dc.font.set);
|
||||
dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
|
||||
@ -179,10 +177,6 @@ setfont(const char *fontstr) {
|
||||
while(n--)
|
||||
fprintf(stderr, "missing fontset: %s\n", missing[n]);
|
||||
XFreeStringList(missing);
|
||||
if(dc.font.set) {
|
||||
XFreeFontSet(dpy, dc.font.set);
|
||||
dc.font.set = NULL;
|
||||
}
|
||||
}
|
||||
if(dc.font.set) {
|
||||
XFontSetExtents *font_extents;
|
||||
@ -203,11 +197,8 @@ setfont(const char *fontstr) {
|
||||
if(dc.font.xfont)
|
||||
XFreeFont(dpy, dc.font.xfont);
|
||||
dc.font.xfont = NULL;
|
||||
dc.font.xfont = XLoadQueryFont(dpy, fontstr);
|
||||
if (!dc.font.xfont)
|
||||
dc.font.xfont = XLoadQueryFont(dpy, "fixed");
|
||||
if (!dc.font.xfont)
|
||||
eprint("error, cannot init 'fixed' font\n");
|
||||
if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)))
|
||||
eprint("error, cannot load font: '%s'\n", fontstr);
|
||||
dc.font.ascent = dc.font.xfont->ascent;
|
||||
dc.font.descent = dc.font.xfont->descent;
|
||||
}
|
||||
|
16
dwm.1
16
dwm.1
@ -22,7 +22,7 @@ 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 indicated with a different color. The tags of the focused
|
||||
window are indicated with a filled square in the top left corner. The tags
|
||||
which are applied to one or more clients are indicated with an empty square in
|
||||
which are applied to one or more windows are indicated with an empty square in
|
||||
the top left corner.
|
||||
.P
|
||||
dwm draws a 1-pixel border around windows to indicate the focus state.
|
||||
@ -122,9 +122,17 @@ 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
|
||||
.BR "broken pipe"
|
||||
when dwm has been started by
|
||||
.BR "EOF"
|
||||
when dwm has been started by an X session manager like
|
||||
.BR xdm (1),
|
||||
because it closes standard output before executing dwm.
|
||||
because those close standard output before executing dwm.
|
||||
.P
|
||||
Java applications which use the XToolkit/XAWT backend may draw grey windows
|
||||
only. The XToolkit/XAWT backend breaks ICCCM-compliance in recent JDK 1.5 and early
|
||||
JDK 1.6 versions, because it assumes a reparenting window manager. As a workaround
|
||||
you can use JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or you
|
||||
can set the following environment variable (to use the older Motif
|
||||
backend instead):
|
||||
.BR AWT_TOOLKIT=MToolkit .
|
||||
.SH SEE ALSO
|
||||
.BR dmenu (1)
|
||||
|
4
dwm.h
4
dwm.h
@ -80,7 +80,6 @@ struct Client {
|
||||
int rx, ry, rw, rh; /* revert geometry */
|
||||
int tx, ty, tw, th; /* title window geometry */
|
||||
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
|
||||
int grav;
|
||||
long flags;
|
||||
unsigned int border;
|
||||
Bool isfloat, isfixed, ismax;
|
||||
@ -114,12 +113,11 @@ extern void configure(Client *c); /* send synthetic configure event */
|
||||
extern void focus(Client *c); /* focus c, c may be NULL */
|
||||
extern Client *getclient(Window w); /* return client of w */
|
||||
extern Client *getctitle(Window w); /* return client of title window */
|
||||
extern void gravitate(Client *c, Bool invert); /* gravitate c */
|
||||
extern void killclient(Arg *arg); /* kill c nicely */
|
||||
extern void manage(Window w, XWindowAttributes *wa); /* manage new client */
|
||||
extern void resize(Client *c, Bool sizehints, Corner sticky); /* resize c*/
|
||||
extern void resizetitle(Client *c); /* resizes c->twin correctly */
|
||||
extern void updatesize(Client *c); /* update the size structs of c */
|
||||
extern void updatesizehints(Client *c); /* update the size hint variables of c */
|
||||
extern void updatetitle(Client *c); /* update the name of c */
|
||||
extern void unmanage(Client *c); /* destroy c */
|
||||
|
||||
|
4
event.c
4
event.c
@ -161,7 +161,6 @@ configurerequest(XEvent *e) {
|
||||
|
||||
if((c = getclient(ev->window))) {
|
||||
c->ismax = False;
|
||||
gravitate(c, True);
|
||||
if(ev->value_mask & CWX)
|
||||
c->x = ev->x;
|
||||
if(ev->value_mask & CWY)
|
||||
@ -172,7 +171,6 @@ configurerequest(XEvent *e) {
|
||||
c->h = ev->height;
|
||||
if(ev->value_mask & CWBorderWidth)
|
||||
c->border = ev->border_width;
|
||||
gravitate(c, False);
|
||||
wc.x = c->x;
|
||||
wc.y = c->y;
|
||||
wc.width = c->w;
|
||||
@ -316,7 +314,7 @@ propertynotify(XEvent *e) {
|
||||
arrange();
|
||||
break;
|
||||
case XA_WM_NORMAL_HINTS:
|
||||
updatesize(c);
|
||||
updatesizehints(c);
|
||||
break;
|
||||
}
|
||||
if(ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) {
|
||||
|
13
main.c
13
main.c
@ -4,6 +4,7 @@
|
||||
|
||||
#include "dwm.h"
|
||||
#include <errno.h>
|
||||
#include <locale.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@ -39,9 +40,9 @@ static Bool otherwm, readin;
|
||||
static void
|
||||
cleanup(void) {
|
||||
close(STDIN_FILENO);
|
||||
while(sel) {
|
||||
resize(sel, True, TopLeft);
|
||||
unmanage(sel);
|
||||
while(clients) {
|
||||
resize(clients, True, TopLeft);
|
||||
unmanage(clients);
|
||||
}
|
||||
if(dc.font.set)
|
||||
XFreeFontSet(dpy, dc.font.set);
|
||||
@ -51,6 +52,9 @@ cleanup(void) {
|
||||
XFreePixmap(dpy, dc.drawable);
|
||||
XFreeGC(dpy, dc.gc);
|
||||
XDestroyWindow(dpy, barwin);
|
||||
XFreeCursor(dpy, cursor[CurNormal]);
|
||||
XFreeCursor(dpy, cursor[CurResize]);
|
||||
XFreeCursor(dpy, cursor[CurMove]);
|
||||
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
|
||||
XSync(dpy, False);
|
||||
free(seltag);
|
||||
@ -104,7 +108,7 @@ setup(void) {
|
||||
numlockmask = (1 << i);
|
||||
}
|
||||
}
|
||||
XFree(modmap);
|
||||
XFreeModifiermap(modmap);
|
||||
/* select for events */
|
||||
wa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask
|
||||
| EnterWindowMask | LeaveWindowMask;
|
||||
@ -237,6 +241,7 @@ main(int argc, char *argv[]) {
|
||||
}
|
||||
else if(argc != 1)
|
||||
eprint("usage: dwm [-v]\n");
|
||||
setlocale(LC_CTYPE, "");
|
||||
dpy = XOpenDisplay(0);
|
||||
if(!dpy)
|
||||
eprint("dwm: cannot open display\n");
|
||||
|
3
tag.c
3
tag.c
@ -114,7 +114,8 @@ tag(Arg *arg) {
|
||||
return;
|
||||
for(i = 0; i < ntags; i++)
|
||||
sel->tags[i] = (arg->i == -1) ? True : False;
|
||||
sel->tags[arg->i] = True;
|
||||
if(arg->i >= 0 && arg->i < ntags)
|
||||
sel->tags[arg->i] = True;
|
||||
arrange();
|
||||
}
|
||||
|
||||
|
14
view.c
14
view.c
@ -69,13 +69,12 @@ dofloat(void) {
|
||||
|
||||
void
|
||||
dotile(void) {
|
||||
unsigned int i, n, mpx, stackw, th;
|
||||
unsigned int i, n, mpw, th;
|
||||
Client *c;
|
||||
|
||||
for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
|
||||
n++;
|
||||
mpx = (waw * master) / 1000;
|
||||
stackw = waw - mpx;
|
||||
mpw = (waw * master) / 1000;
|
||||
|
||||
for(i = 0, c = clients; c; c = c->next)
|
||||
if(isvisible(c)) {
|
||||
@ -91,13 +90,13 @@ dotile(void) {
|
||||
c->h = wah - 2 * BORDERPX;
|
||||
}
|
||||
else if(i == 0) { /* master window */
|
||||
c->w = mpx - 2 * BORDERPX;
|
||||
c->w = mpw - 2 * BORDERPX;
|
||||
c->h = wah - 2 * BORDERPX;
|
||||
th = wah / (n - 1);
|
||||
}
|
||||
else { /* tile window */
|
||||
c->x += mpx;
|
||||
c->w = stackw - 2 * BORDERPX;
|
||||
c->x += mpw;
|
||||
c->w = (waw - mpw) - 2 * BORDERPX;
|
||||
if(th > bh) {
|
||||
c->y += (i - 1) * th;
|
||||
c->h = th - 2 * BORDERPX;
|
||||
@ -234,7 +233,8 @@ view(Arg *arg) {
|
||||
|
||||
for(i = 0; i < ntags; i++)
|
||||
seltag[i] = (arg->i == -1) ? True : False;
|
||||
seltag[arg->i] = True;
|
||||
if(arg->i >= 0 && arg->i < ntags)
|
||||
seltag[arg->i] = True;
|
||||
arrange();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user