dwm

dynamic window manager
git clone git://git.suckless.org/dwm
Log | Files | Refs | README | LICENSE

commit 292ccc4c43d9529cb6db0973fcab6e24c73607a5
parent d7413ffd2d9a84fc3140b28b26f8cb6bb80164e4
Author: Anselm R.Garbe <arg@10ksloc.org>
Date:   Fri, 11 Aug 2006 19:26:12 +0200

implemented viewextend and added M-S-C-n shortcuts for extending the current view... updated man page (works great!) nice feature

Diffstat:
Mconfig.arg.h | 45++++++++++++++++++++++++---------------------
Mconfig.default.h | 57+++++++++++++++++++++++++++++++--------------------------
Mdraw.c | 4++--
Mdwm.1 | 21+++++++++++++++++----
Mdwm.h | 3++-
Mevent.c | 7++-----
Mmain.c | 6+++---
Mtag.c | 25+++++++++++++++++++------
8 files changed, 100 insertions(+), 68 deletions(-)

diff --git a/config.arg.h b/config.arg.h @@ -18,31 +18,34 @@ const char *tags[] = { "work", "net", "fnord", NULL }; #define KEYS \ static Key key[] = { \ - /* modifier key function arguments */ \ - { 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, \ + /* modifier key function arguments */ \ + { 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`" } }, \ - { MODKEY, XK_space, togglemode, { 0 } }, \ - { MODKEY, XK_Return, zoom, { 0 } }, \ - { 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, \ + { MODKEY, XK_space, togglemode, { 0 } }, \ + { MODKEY, XK_Return, zoom, { 0 } }, \ + { 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 +sb -tr -bg black -fg '#eeeeee' -cr '#eeeeee' +sb " \ "-fn '-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*'" } }, \ + { MODKEY|ControlMask|ShiftMask, XK_1, viewextend, { .i = 0 } }, \ + { MODKEY|ShiftMask, XK_2, viewextend, { .i = 1 } }, \ + { MODKEY|ShiftMask, XK_3, viewextend, { .i = 2 } }, \ }; #define RULES \ diff --git a/config.default.h b/config.default.h @@ -18,32 +18,37 @@ const char *tags[] = { "0", "1", "2", "3", "4", 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_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_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 = 4 } }, \ - { MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \ - { MODKEY|ShiftMask, XK_q, quit, { 0 } }, \ - { MODKEY|ShiftMask, XK_Return, spawn, { .cmd = "exec xterm" } }, \ + /* 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_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_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 = 4 } }, \ + { MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \ + { MODKEY|ShiftMask, XK_q, quit, { 0 } }, \ + { MODKEY|ShiftMask, XK_Return, spawn, { .cmd = "exec xterm" } }, \ + { MODKEY|ControlMask|ShiftMask, XK_0, viewextend, { .i = 0 } }, \ + { MODKEY|ControlMask|ShiftMask, XK_1, viewextend, { .i = 1 } }, \ + { MODKEY|ControlMask|ShiftMask, XK_2, viewextend, { .i = 2 } }, \ + { MODKEY|ControlMask|ShiftMask, XK_3, viewextend, { .i = 3 } }, \ + { MODKEY|ControlMask|ShiftMask, XK_4, viewextend, { .i = 4 } }, \ }; #define RULES \ diff --git a/draw.c b/draw.c @@ -109,9 +109,9 @@ drawstatus() dc.x += dc.w; dc.w = textw(tags[i]); if(istile) - drawtext(tags[i], tsel[i]); + drawtext(tags[i], seltag[i]); else - drawtext(tags[i], !tsel[i]); + drawtext(tags[i], !seltag[i]); } x = dc.x + dc.w; dc.w = textw(stext); diff --git a/dwm.1 b/dwm.1 @@ -36,14 +36,21 @@ prints version information to standard output, then exits. .B Standard input is read and displayed in the status text area. .TP -.B Button[1-3] -click on a tag label focuses that tag. +.B Button[1,3] +click on a tag label focuses that +.B tag. +.TP +.B Button2 +click on a tag label (un)extends the current +.B tag. .TP .B Button[1,4] -click on the bar focuses the previous tag. +click on the bar focuses the previous +.B tag. .TP .B Button[2,5] -click on the bar focuses the next tag. +click on the bar focuses the next +.B tag. .SS Keyboard commands .TP .B Mod1-Return @@ -108,6 +115,12 @@ Append .B nth tag to current .B window. +.TP +.B Mod1-Control-Shift-[0..n] +(Un)extends +.B nth tag +with current +.B tag. .SS Mouse commands .TP .B Mod1-Button1 diff --git a/dwm.h b/dwm.h @@ -74,7 +74,7 @@ extern unsigned int ntags; extern void (*handler[LASTEvent])(XEvent *); extern void (*arrange)(Arg *); extern Atom wmatom[WMLast], netatom[NetLast]; -extern Bool running, issel, *tsel; +extern Bool running, issel, *seltag; extern Client *clients, *sel; extern Cursor cursor[CurLast]; extern DC dc; @@ -128,6 +128,7 @@ extern void replacetag(Arg *arg); extern void settags(Client *c); extern void togglemode(Arg *arg); extern void view(Arg *arg); +extern void viewextend(Arg *arg); extern void viewnext(Arg *arg); extern void viewprev(Arg *arg); diff --git a/event.c b/event.c @@ -108,11 +108,8 @@ buttonpress(XEvent *e) for(a.i = 0; a.i < ntags; a.i++) { x += textw(tags[a.i]); if(ev->x < x) { - if(ev->button == Button3) { - tsel[a.i] = True; - arrange(NULL); - drawall(); - } + if(ev->button == Button3) + viewextend(&a); else view(&a); return; diff --git a/main.c b/main.c @@ -83,7 +83,7 @@ xerrorstart(Display *dsply, XErrorEvent *ee) /* extern */ char stext[1024]; -Bool *tsel; +Bool *seltag; int screen, sx, sy, sw, sh, bx, by, bw, bh, mw; unsigned int ntags; Atom wmatom[WMLast], netatom[NetLast]; @@ -213,8 +213,8 @@ main(int argc, char *argv[]) initrregs(); for(ntags = 0; tags[ntags]; ntags++); - tsel = emallocz(sizeof(Bool) * ntags); - tsel[DEFTAG] = True; + seltag = emallocz(sizeof(Bool) * ntags); + seltag[DEFTAG] = True; /* style */ dc.bg = getcolor(BGCOLOR); diff --git a/tag.c b/tag.c @@ -181,7 +181,7 @@ isvisible(Client *c) unsigned int i; for(i = 0; i < ntags; i++) - if(c->tags[i] && tsel[i]) + if(c->tags[i] && seltag[i]) return True; return False; } @@ -229,7 +229,7 @@ settags(Client *c) } if(!matched) for(i = 0; i < ntags; i++) - c->tags[i] = tsel[i]; + c->tags[i] = seltag[i]; } void @@ -245,8 +245,21 @@ view(Arg *arg) unsigned int i; for(i = 0; i < ntags; i++) - tsel[i] = False; - tsel[arg->i] = True; + seltag[i] = False; + seltag[arg->i] = True; + arrange(NULL); + drawall(); +} + +void +viewextend(Arg *arg) +{ + unsigned int i; + + seltag[arg->i] = !seltag[arg->i]; + for(i = 0; !seltag[i] && i < ntags; i++); + if(i == ntags) + seltag[arg->i] = True; /* cannot toggle last view */ arrange(NULL); drawall(); } @@ -256,7 +269,7 @@ viewnext(Arg *arg) { unsigned int i; - for(i = 0; !tsel[i]; i++); + for(i = 0; !seltag[i]; i++); arg->i = (i < ntags-1) ? i+1 : 0; view(arg); } @@ -266,7 +279,7 @@ viewprev(Arg *arg) { unsigned int i; - for(i = 0; !tsel[i]; i++); + for(i = 0; !seltag[i]; i++); arg->i = (i > 0) ? i-1 : ntags-1; view(arg); }