about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--config.arg.h45
-rw-r--r--config.default.h57
-rw-r--r--draw.c4
-rw-r--r--dwm.121
-rw-r--r--dwm.h3
-rw-r--r--event.c7
-rw-r--r--main.c6
-rw-r--r--tag.c25
8 files changed, 100 insertions, 68 deletions
diff --git a/config.arg.h b/config.arg.h
index 9bee102..aed8ad6 100644
--- 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
index 3847ff8..ab9f6e8 100644
--- 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
index bdbe85a..3b6967c 100644
--- 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
--- 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
--- 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
--- 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
--- 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
--- 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);
 }
a id='n695' href='#n695'>695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781