JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
implemented viewextend and added M-S-C-n shortcuts for extending the current view...
authorAnselm R.Garbe <arg@10ksloc.org>
Fri, 11 Aug 2006 17:26:12 +0000 (19:26 +0200)
committerAnselm R.Garbe <arg@10ksloc.org>
Fri, 11 Aug 2006 17:26:12 +0000 (19:26 +0200)
config.arg.h
config.default.h
draw.c
dwm.1
dwm.h
event.c
main.c
tag.c

index 9bee102..aed8ad6 100644 (file)
@@ -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 \
index 3847ff8..ab9f6e8 100644 (file)
@@ -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
index bdbe85a..3b6967c 100644 (file)
--- 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
index ac5a7cc..47fceeb 100644 (file)
--- 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
index 41b1c36..1d6e43c 100644 (file)
--- 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
index 05b42f0..e452167 100644 (file)
--- 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
index fec7ea8..906505c 100644 (file)
--- 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
index 3e89569..51dda03 100644 (file)
--- 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);
 }