Compare commits

...

26 Commits
1.7.1 ... 1.8

Author SHA1 Message Date
69408d384d simplified dotile(), removed misleading line 2006-10-05 13:47:30 +02:00
4aea423f06 final fix for man page 2006-10-05 13:44:48 +02:00
6fc8a63041 keep master ratio on resizecol -> arrange 2006-10-05 12:59:35 +02:00
2583a7c0d1 yet another simplification of dotile() 2006-10-05 12:18:04 +02:00
0ef6e3103c simplified dotile() 2006-10-05 12:13:24 +02:00
7c052b37c8 applied resizecol fix by Jukka 2006-10-05 11:00:55 +02:00
d9c475d7f4 Button3 click on mode label toggles stack position now 2006-10-05 09:37:11 +02:00
c8e57332d1 applied dave's highlight patch for big fonts 2006-09-29 19:06:27 +02:00
c045459917 using ff tiled again, seems to work perfectly with new bottom stack 2006-09-29 18:40:32 +02:00
e0f64e63db applied ality's hardcode-0 patches 2006-09-29 18:21:02 +02:00
dddd58a8cd added symbols for different modes 2006-09-29 18:08:20 +02:00
010fd21b20 removed useless updatemaster 2006-09-29 17:25:49 +02:00
1802fad2f9 documented the new behavior in man page 2006-09-29 17:20:05 +02:00
f833d109d1 fixed small offset issue 2006-09-29 17:15:05 +02:00
7225c99903 fixed the z-layer issue described on mailinglist 2006-09-29 17:12:57 +02:00
36178933ed removed the direction flipping 2006-09-29 17:02:56 +02:00
ad0da9a571 small fix of a corner case 2006-09-29 16:54:15 +02:00
6646468125 small change 2006-09-29 16:44:02 +02:00
fee8df6ccf added the new dotile as described on ml 2006-09-29 16:22:20 +02:00
8fa47ac679 prelim of dotile() 2006-09-29 14:39:03 +02:00
b427a2c6cb I changed sanders patch to fix the ff issue to be simplier, though it needs testing if this really fixes the issue 2006-09-29 12:56:01 +02:00
14d05e7c72 first step to a more flexible dotile() algorithm 2006-09-29 12:38:27 +02:00
a118a57fe3 renamed column into area 2006-09-28 21:29:20 +02:00
02cea3b47e small change to README 2006-09-28 16:14:48 +02:00
1c2d673ded applied Jukkas patch 2006-09-28 14:03:39 +02:00
c34df2c1b6 Added tag 1.7.1 for changeset d5ad819f2a66a40fa75dd2e44429f3bfc884d07b 2006-09-27 17:21:25 +02:00
12 changed files with 167 additions and 80 deletions

View File

@ -15,3 +15,4 @@ f5f5cbf016a94b48a8fe9c47f0736e96d166d5d4 1.3
728c9089b079721b43c3347124639a29baa22a97 1.5
ad3fa2d185426c51fd5deceae809770363f8d33c 1.6
4dbdb61c8b8ce21dee5c7050a6b103855964ed20 1.7
d5ad819f2a66a40fa75dd2e44429f3bfc884d07b 1.7.1

2
README
View File

@ -37,7 +37,7 @@ like this in your .xinitrc:
while true
do
echo `date` `uptime | sed 's/.*://; s/,//g'`
echo `date` `uptime | sed 's/.*,//'`
sleep 1
done | dwm

View File

@ -214,12 +214,12 @@ manage(Window w, XWindowAttributes *wa) {
c->border = 0;
updatesize(c);
if(c->x + c->w + 2 > sw)
c->x = sw - c->w - 2;
if(c->x < 0)
c->x = 0;
if(c->y + c->h + 2 > sh)
c->y = sh - c->h - 2;
if(c->x + c->w + 2 * BORDERPX > sw)
c->x = sw - c->w - 2 * BORDERPX;
if(c->x < sx)
c->x = sx;
if(c->y + c->h + 2 * BORDERPX > sh)
c->y = sh - c->h - 2 * BORDERPX;
if(c->h != sh && c->y < bh)
c->y = bh;
@ -285,8 +285,8 @@ resize(Client *c, Bool sizehints, Corner sticky) {
c->y = bottom - c->h;
/* offscreen appearance fixes */
if(c->x + c->w < 0)
c->x = 0;
if(c->x + c->w < sx)
c->x = sx;
if(c->y + c->h < bh)
c->y = bh;
if(c->x > sw)
@ -302,7 +302,7 @@ resize(Client *c, Bool sizehints, Corner sticky) {
if(c->w == sw && c->h == sh)
wc.border_width = 0;
else
wc.border_width = 1;
wc.border_width = BORDERPX;
XConfigureWindow(dpy, c->win, CWX | CWY | CWWidth | CWHeight | CWBorderWidth, &wc);
configure(c);
XSync(dpy, False);
@ -312,8 +312,8 @@ void
resizetitle(Client *c) {
c->tw = textw(c->name);
if(c->tw > c->w)
c->tw = c->w + 2;
c->tx = c->x + c->w - c->tw + 2;
c->tw = c->w + 2 * BORDERPX;
c->tx = c->x + c->w - c->tw + 2 * BORDERPX;
c->ty = c->y;
if(isvisible(c))
XMoveResizeWindow(dpy, c->twin, c->tx, c->ty, c->tw, c->th);

View File

@ -6,9 +6,11 @@
#define TAGS \
const char *tags[] = { "dev", "work", "net", "fnord", NULL };
#define DEFMODE dotile /* dofloat */
#define DEFMODE dotile /* dofloat */
#define FLOATSYMBOL "><>"
#define TILESYMBOL "[]="
#define STACKPOS StackRight /* StackLeft */
#define BSTACKSYMBOL "==="
#define VSTACKSYMBOL "[]="
#define FONT "-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*"
#define NORMBGCOLOR "#333333"
@ -18,7 +20,7 @@ const char *tags[] = { "dev", "work", "net", "fnord", NULL };
#define STATUSBGCOLOR "#222222"
#define STATUSFGCOLOR "#9999cc"
#define MASTERW 60 /* percent */
#define MASTER 60 /* percent */
#define MODKEY Mod1Mask
#define KEYS \
@ -34,8 +36,9 @@ static Key key[] = { \
{ MODKEY, XK_j, focusnext, { 0 } }, \
{ MODKEY, XK_k, focusprev, { 0 } }, \
{ MODKEY, XK_Return, zoom, { 0 } }, \
{ MODKEY, XK_g, resizecol, { .i = 20 } }, \
{ MODKEY, XK_s, resizecol, { .i = -20 } }, \
{ MODKEY, XK_b, togglestackpos, { 0 } }, \
{ MODKEY, XK_g, resizecol, { .i = 1 } }, \
{ MODKEY, XK_s, resizecol, { .i = -1 } }, \
{ MODKEY|ShiftMask, XK_1, tag, { .i = 0 } }, \
{ MODKEY|ShiftMask, XK_2, tag, { .i = 1 } }, \
{ MODKEY|ShiftMask, XK_3, tag, { .i = 2 } }, \
@ -61,7 +64,7 @@ static Key key[] = { \
#define RULES \
static Rule rule[] = { \
/* class:instance:title regex tags regex isfloat */ \
{ "Firefox.*", "net", True}, \
{ "Firefox.*", "net", False}, \
{ "Gimp.*", NULL, True}, \
{ "MPlayer.*", NULL, True}, \
{ "Acroread.*", NULL, True}, \

View File

@ -8,7 +8,9 @@ const char *tags[] = { "1", "2", "3", "4", "5", NULL };
#define DEFMODE dotile /* dofloat */
#define FLOATSYMBOL "><>"
#define TILESYMBOL "[]="
#define STACKPOS StackRight /* StackLeft */
#define BSTACKSYMBOL "==="
#define VSTACKSYMBOL "[]="
#define FONT "fixed"
#define NORMBGCOLOR "#333366"
@ -18,7 +20,7 @@ const char *tags[] = { "1", "2", "3", "4", "5", NULL };
#define STATUSBGCOLOR "#dddddd"
#define STATUSFGCOLOR "#222222"
#define MASTERW 60 /* percent */
#define MASTER 60 /* percent */
#define MODKEY Mod1Mask
#define KEYS \
@ -28,8 +30,9 @@ static Key key[] = { \
{ MODKEY, XK_Tab, focusnext, { 0 } }, \
{ MODKEY|ShiftMask, XK_Tab, focusprev, { 0 } }, \
{ MODKEY, XK_Return, zoom, { 0 } }, \
{ MODKEY, XK_g, resizecol, { .i = 20 } }, \
{ MODKEY, XK_s, resizecol, { .i = -20 } }, \
{ MODKEY, XK_b, togglestackpos, { 0 } }, \
{ MODKEY, XK_g, resizecol, { .i = 1 } }, \
{ MODKEY, XK_s, resizecol, { .i = -1 } }, \
{ MODKEY|ShiftMask, XK_1, tag, { .i = 0 } }, \
{ MODKEY|ShiftMask, XK_2, tag, { .i = 1 } }, \
{ MODKEY|ShiftMask, XK_3, tag, { .i = 2 } }, \

View File

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

6
draw.c
View File

@ -72,7 +72,7 @@ drawtext(const char *text, unsigned long col[ColLast], Bool highlight) {
if(highlight) {
r.x = dc.x + 2;
r.y = dc.y + 2;
r.width = r.height = 3;
r.width = r.height = (h + 2) / 4;
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
}
}
@ -104,7 +104,9 @@ drawstatus(void) {
}
dc.w = bmw;
drawtext(arrange == dofloat ? FLOATSYMBOL : TILESYMBOL, dc.status, False);
drawtext(arrange == dofloat ?
FLOATSYMBOL : stackpos == StackBottom ?
BSTACKSYMBOL : VSTACKSYMBOL, dc.status, False);
x = dc.x + dc.w;
dc.w = textw(stext);

24
dwm.1
View File

@ -9,9 +9,9 @@ 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
stacking column contains all other windows. In floating mode windows can be
In tiling mode windows are managed in a master and stacking area. The master
area contains the window which currently needs most attention, whereas the
stacking area contains all other windows. In floating mode windows can be
resized and moved freely. Dialog windows are always managed floating,
regardless of the mode selected.
.P
@ -37,10 +37,11 @@ is read and displayed in the status text area.
.TP
.B Button1
click on a tag label to display all windows with that tag, click on the mode
label toggles between tiled and floating mode.
label toggles between tiling and floating mode.
.TP
.B Button3
click on a tag label adds/removes all windows with that tag to/from the view.
click on a tag label adds/removes all windows with that tag to/from the view,
click on the mode label toggles the stack position (tiling mode).
.TP
.B Mod1-Button1
click on a tag label applies that tag to the focused window.
@ -60,13 +61,16 @@ Focus next window.
Focus previous window.
.TP
.B Mod1-Return
Zooms/cycles current window to/from master column (tiling mode), toggles maximization current window (floating mode).
Zooms/cycles current window to/from master area (tiling mode), toggles maximization current window (floating mode).
.TP
.B Mod1-b
Toggle stack position (tiling mode only).
.TP
.B Mod1-g
Grow current column (tiling mode only).
Grow current area (tiling mode only).
.TP
.B Mod1-s
Shrink current column (tiling mode only).
Shrink current area (tiling mode only).
.TP
.B Mod1-Shift-[1..n]
Apply
@ -82,7 +86,7 @@ tag to/from current window.
Close focused window.
.TP
.B Mod1-space
Toggle between tiled and floating mode (affects all windows).
Toggle between tiling and floating mode (affects all windows).
.TP
.B Mod1-[1..n]
View all windows with
@ -105,7 +109,7 @@ Quit dwm.
Move current window while dragging (floating mode only).
.TP
.B Mod1-Button2
Zoom current window to the master column (tiling mode only).
Zoom current window to the master area (tiling mode only).
.TP
.B Mod1-Button3
Resize current window while dragging (floating mode only).

16
dwm.h
View File

@ -38,6 +38,8 @@
/* mask shorthands, used in event.c and client.c */
#define BUTTONMASK (ButtonPressMask | ButtonReleaseMask)
#define MOUSEMASK (BUTTONMASK | PointerMotionMask)
/* other stuff used in different places */
#define BORDERPX 1
#define PROTODELWIN 1
enum { NetSupported, NetWMName, NetLast }; /* EWMH atoms */
@ -45,6 +47,10 @@ enum { WMProtocols, WMDelete, WMLast }; /* default atoms */
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
enum { ColFG, ColBG, ColLast }; /* color */
typedef enum {
StackLeft, StackBottom, StackRight
} StackPos; /* stack position*/
typedef enum {
TopLeft, TopRight, BotLeft, BotRight
} Corner; /* window corners */
@ -95,8 +101,8 @@ struct Client {
extern const char *tags[]; /* all tags */
extern char stext[1024]; /* status text */
extern int bx, by, bw, bh, bmw; /* bar geometry, bar mode label width */
extern int mw, screen, sx, sy, sw, sh; /* screen geometry, master width */
extern unsigned int ntags, numlockmask; /* number of tags, dynamic lock mask */
extern int screen, sx, sy, sw, sh; /* screen geometry */
extern unsigned int master, ntags, numlockmask; /* master percent, number of tags, dynamic lock mask */
extern void (*handler[LASTEvent])(XEvent *); /* event handler */
extern void (*arrange)(Arg *); /* arrange function, indicates mode */
extern Atom wmatom[WMLast], netatom[NetLast];
@ -105,6 +111,7 @@ extern Client *clients, *sel, *stack; /* global client list and stack */
extern Cursor cursor[CurLast];
extern DC dc; /* global draw context */
extern Display *dpy;
extern StackPos stackpos;
extern Window root, barwin;
/* client.c */
@ -161,10 +168,11 @@ extern void dotile(Arg *arg); /* arranges all windows, arg is ignored */
extern void focusnext(Arg *arg); /* focuses next visible client, arg is ignored */
extern void focusprev(Arg *arg); /* focuses previous visible client, arg is ignored */
extern Bool isvisible(Client *c); /* returns True if client is visible */
extern void resizecol(Arg *arg); /* resizes the master width with arg's index value */
extern void resizecol(Arg *arg); /* resizes the master percent with arg's index value */
extern void restack(void); /* restores z layers of all clients */
extern void togglestackpos(Arg *arg); /* toggles stack position */
extern void togglemode(Arg *arg); /* toggles global arrange function (dotile/dofloat) */
extern void toggleview(Arg *arg); /* toggles the tag with arg's index (in)visible */
extern void view(Arg *arg); /* views the tag with arg's index */
extern void viewall(Arg *arg); /* views all tags, arg is ignored */
extern void zoom(Arg *arg); /* zooms the focused client to master column, arg is ignored */
extern void zoom(Arg *arg); /* zooms the focused client to master area, arg is ignored */

View File

@ -126,6 +126,8 @@ buttonpress(XEvent *e) {
if(ev->x < x + bmw) {
if(ev->button == Button1)
togglemode(NULL);
else if(ev->button == Button3)
togglestackpos(NULL);
}
}
else if((c = getclient(ev->window))) {
@ -176,8 +178,11 @@ configurerequest(XEvent *e) {
else
configure(c);
XSync(dpy, False);
if(c->isfloat)
if(c->isfloat) {
resize(c, False, TopLeft);
if(!isvisible(c))
ban(c);
}
else
arrange(NULL);
}

13
main.c
View File

@ -19,8 +19,8 @@
char stext[1024];
Bool *seltag;
int bx, by, bw, bh, bmw, mw, screen, sx, sy, sw, sh;
unsigned int ntags, numlockmask;
int bx, by, bw, bh, bmw, masterd, screen, sx, sy, sw, sh;
unsigned int master, ntags, numlockmask;
Atom wmatom[WMLast], netatom[NetLast];
Bool running = True;
Bool issel = True;
@ -128,12 +128,15 @@ setup(void) {
dc.status[ColBG] = getcolor(STATUSBGCOLOR);
dc.status[ColFG] = getcolor(STATUSFGCOLOR);
setfont(FONT);
bmw = textw(FLOATSYMBOL) > textw(TILESYMBOL) ? textw(FLOATSYMBOL) : textw(TILESYMBOL);
bmw = textw(VSTACKSYMBOL) > textw(BSTACKSYMBOL) ?
textw(VSTACKSYMBOL) : textw(BSTACKSYMBOL);
bmw = bmw > textw(FLOATSYMBOL) ?
bmw : textw(FLOATSYMBOL);
sx = sy = 0;
sw = DisplayWidth(dpy, screen);
sh = DisplayHeight(dpy, screen);
mw = (sw * MASTERW) / 100;
master = MASTER;
bx = by = 0;
bw = sw;

128
view.c
View File

@ -49,8 +49,8 @@ togglemax(Client *c)
if((c->ismax = !c->ismax)) {
c->rx = c->x; c->x = sx;
c->ry = c->y; c->y = bh;
c->rw = c->w; c->w = sw;
c->rh = c->h; c->h = sh - bh - 2;
c->rw = c->w; c->w = sw - 2 * BORDERPX;
c->rh = c->h; c->h = sh - bh - 2 * BORDERPX;
}
else {
c->x = c->rx;
@ -65,6 +65,7 @@ togglemax(Client *c)
/* extern */
void (*arrange)(Arg *) = DEFMODE;
StackPos stackpos = STACKPOS;
void
detach(Client *c) {
@ -95,19 +96,35 @@ dofloat(Arg *arg) {
restack();
}
/* This algorithm is based on a (M)aster area and a (S)tacking area.
* It supports following arrangements:
* SSMMM MMMMM MMMSS
* SSMMM SSSSS MMMSS
*/
void
dotile(Arg *arg) {
int h, i, n, w;
unsigned int i, n, md, stackw, stackh, tw, th;
Client *c;
w = sw - mw;
for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
n++;
if(stackpos == StackBottom) {
md = ((sh - bh) * master) / 100;
stackw = sw;
stackh = sh - bh - md;
}
else {
md = (sw * master) / 100;
stackw = sw - md;
stackh = sh - bh;
}
tw = stackw;
if(n > 1)
h = (sh - bh) / (n - 1);
th = stackh / (n - 1);
else
h = sh - bh;
th = stackh;
for(i = 0, c = clients; c; c = c->next) {
if(isvisible(c)) {
@ -116,32 +133,53 @@ dotile(Arg *arg) {
continue;
}
c->ismax = False;
if(n == 1) {
c->x = sx;
c->y = sy + bh;
c->w = sw - 2;
c->h = sh - 2 - bh;
c->x = sx;
c->y = sy + bh;
if(n == 1) { /* only 1 window */
c->w = sw - 2 * BORDERPX;
c->h = sh - 2 * BORDERPX - bh;
}
else if(i == 0) {
c->x = sx;
c->y = sy + bh;
c->w = mw - 2;
c->h = sh - 2 - bh;
else if(i == 0) { /* master window */
if(stackpos == StackLeft)
c->x += stackw;
switch(stackpos) {
case StackLeft:
case StackRight:
c->w = md - 2 * BORDERPX;
c->h = sh - bh - 2 * BORDERPX;
break;
case StackBottom:
c->w = sw - 2 * BORDERPX;
c->h = md - 2 * BORDERPX;
break;
}
}
else if(h > bh) {
c->x = sx + mw;
c->y = sy + (i - 1) * h + bh;
c->w = w - 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;
c->y = sy + bh;
c->w = w - 2;
c->h = sh - 2 - bh;
else { /* tile window */
if(stackpos == StackRight)
c->x += md;
if(th > bh) {
switch(stackpos) {
case StackLeft:
case StackRight:
c->y = sy + (i - 1) * th + bh;
if(i + 1 == n)
c->h = sh - c->y - 2 * BORDERPX;
break;
case StackBottom:
c->y = sy + md + (i - 1) * th + bh;
if(i + 1 == n)
c->h = sh - c->y - 2 * BORDERPX;
break;
}
c->w = tw - 2 * BORDERPX;
c->h = th - 2 * BORDERPX;
}
else { /* fallback if th < bh */
if(stackpos == StackBottom)
c->y += md;
c->w = stackw - 2 * BORDERPX;
c->h = stackh - 2 * BORDERPX;
}
}
resize(c, False, TopLeft);
i++;
@ -210,14 +248,14 @@ resizecol(Arg *arg) {
return;
if(sel == getnext(clients)) {
if(mw + arg->i > sw - 100 || mw + arg->i < 100)
if(master + arg->i > 95 || master + arg->i < 5)
return;
mw += arg->i;
master += arg->i;
}
else {
if(mw - arg->i > sw - 100 || mw - arg->i < 100)
if(master - arg->i > 95 || master - arg->i < 5)
return;
mw -= arg->i;
master -= arg->i;
}
arrange(NULL);
}
@ -235,11 +273,18 @@ restack(void) {
XRaiseWindow(dpy, sel->win);
XRaiseWindow(dpy, sel->twin);
}
if(arrange != dofloat)
if(arrange != dofloat) {
if(!sel->isfloat) {
XLowerWindow(dpy, sel->twin);
XLowerWindow(dpy, sel->win);
}
for(c = nexttiled(clients); c; c = nexttiled(c->next)) {
if(c == sel)
continue;
XLowerWindow(dpy, c->twin);
XLowerWindow(dpy, c->win);
}
}
drawall();
XSync(dpy, False);
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
@ -266,6 +311,17 @@ toggleview(Arg *arg) {
arrange(NULL);
}
void
togglestackpos(Arg *arg) {
if(arrange == dofloat)
return;
if(stackpos == StackBottom)
stackpos = STACKPOS;
else
stackpos = StackBottom;
arrange(NULL);
}
void
view(Arg *arg) {
unsigned int i;
@ -287,6 +343,8 @@ viewall(Arg *arg) {
arrange(NULL);
}
void
zoom(Arg *arg) {
unsigned int n;