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[] = { \
 
 #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`" } }, \
                { .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-*'" } }, \
                { .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 \
 };
 
 #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[] = { \
 
 #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 \
 };
 
 #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)
                dc.x += dc.w;
                dc.w = textw(tags[i]);
                if(istile)
-                       drawtext(tags[i], tsel[i]);
+                       drawtext(tags[i], seltag[i]);
                else
                else
-                       drawtext(tags[i], !tsel[i]);
+                       drawtext(tags[i], !seltag[i]);
        }
        x = dc.x + dc.w;
        dc.w = textw(stext);
        }
        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 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]
 .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]
 .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
 .SS Keyboard commands
 .TP
 .B Mod1-Return
@@ -108,6 +115,12 @@ Append
 .B nth tag
 to current
 .B window.
 .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
 .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 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;
 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 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);
 
 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) {
                        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;
                                        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];
 /* 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];
 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++);
        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);
 
        /* 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++)
        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;
 }
                        return True;
        return False;
 }
@@ -229,7 +229,7 @@ settags(Client *c)
        }
        if(!matched)
                for(i = 0; i < ntags; i++)
        }
        if(!matched)
                for(i = 0; i < ntags; i++)
-                       c->tags[i] = tsel[i];
+                       c->tags[i] = seltag[i];
 }
 
 void
 }
 
 void
@@ -245,8 +245,21 @@ view(Arg *arg)
        unsigned int i;
 
        for(i = 0; i < ntags; i++)
        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();
 }
        arrange(NULL);
        drawall();
 }
@@ -256,7 +269,7 @@ viewnext(Arg *arg)
 {
        unsigned int i;
 
 {
        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);
 }
        arg->i = (i < ntags-1) ? i+1 : 0;
        view(arg);
 }
@@ -266,7 +279,7 @@ viewprev(Arg *arg)
 {
        unsigned int i;
 
 {
        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);
 }
        arg->i = (i > 0) ? i-1 : ntags-1;
        view(arg);
 }