commit 0333cebb10bb3e8a04fabfe144cd4b19f29705ea
parent b2d5e8d916e5e1048d0ef784b8bdb24a2ee19624
Author: Jack Bird <jack.bird@durham.ac.uk>
Date:   Sun, 29 Aug 2021 17:51:08 +0100
[dwm][patch][alternativetags] Added momentary switch and update for ed3ab64
There is now a config option to only change to the alttags while the keys are
being held down. And the patch can be cleanly applied from ed3ab64 onwards.
Diffstat:
3 files changed, 192 insertions(+), 23 deletions(-)
diff --git a/dwm.suckless.org/patches/alternativetags/dwm-alternativetags-20210829-ed3ab6b4.diff b/dwm.suckless.org/patches/alternativetags/dwm-alternativetags-20210829-ed3ab6b4.diff
@@ -0,0 +1,130 @@
+From 65a6751d45f142760c981ed5fe034dbb640fef63 Mon Sep 17 00:00:00 2001
+From: Jack Bird <jack.bird@durham.ac.uk>
+Date: Sun, 29 Aug 2021 17:17:30 +0100
+Subject: [PATCH] Updated alttags for ed3ab6b4
+
+---
+ config.def.h |  3 +++
+ dwm.c        | 35 +++++++++++++++++++++++++++++++++--
+ 2 files changed, 36 insertions(+), 2 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index a2ac963..80df7db 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -20,6 +20,8 @@ static const char *colors[][3]      = {
+ 
+ /* tagging */
+ static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
++static const char *tagsalt[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
++static const int momentaryalttags = 0; /* 1 means alttags will show only when key is held down*/
+ 
+ static const Rule rules[] = {
+ 	/* xprop(1):
+@@ -85,6 +87,7 @@ static Key keys[] = {
+ 	{ MODKEY,                       XK_period, focusmon,       {.i = +1 } },
+ 	{ MODKEY|ShiftMask,             XK_comma,  tagmon,         {.i = -1 } },
+ 	{ MODKEY|ShiftMask,             XK_period, tagmon,         {.i = +1 } },
++	{ MODKEY,                       XK_n,      togglealttag,   {0} },
+ 	TAGKEYS(                        XK_1,                      0)
+ 	TAGKEYS(                        XK_2,                      1)
+ 	TAGKEYS(                        XK_3,                      2)
+diff --git a/dwm.c b/dwm.c
+index 5e4d494..5312b7e 100644
+--- a/dwm.c
++++ b/dwm.c
+@@ -130,6 +130,7 @@ struct Monitor {
+ 	Monitor *next;
+ 	Window barwin;
+ 	const Layout *lt[2];
++	unsigned int alttag;
+ };
+ 
+ typedef struct {
+@@ -177,6 +178,7 @@ static void grabbuttons(Client *c, int focused);
+ static void grabkeys(void);
+ static void incnmaster(const Arg *arg);
+ static void keypress(XEvent *e);
++static void keyrelease(XEvent *e);
+ static void killclient(const Arg *arg);
+ static void manage(Window w, XWindowAttributes *wa);
+ static void mappingnotify(XEvent *e);
+@@ -210,6 +212,7 @@ static void spawn(const Arg *arg);
+ static void tag(const Arg *arg);
+ static void tagmon(const Arg *arg);
+ static void tile(Monitor *);
++static void togglealttag();
+ static void togglebar(const Arg *arg);
+ static void togglefloating(const Arg *arg);
+ static void toggletag(const Arg *arg);
+@@ -254,6 +257,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
+ 	[Expose] = expose,
+ 	[FocusIn] = focusin,
+ 	[KeyPress] = keypress,
++    [KeyRelease] = keyrelease,
+ 	[MappingNotify] = mappingnotify,
+ 	[MapRequest] = maprequest,
+ 	[MotionNotify] = motionnotify,
+@@ -696,7 +700,7 @@ dirtomon(int dir)
+ void
+ drawbar(Monitor *m)
+ {
+-	int x, w, tw = 0;
++	int x, w, wdelta, tw = 0;
+ 	int boxs = drw->fonts->h / 9;
+ 	int boxw = drw->fonts->h / 6 + 2;
+ 	unsigned int i, occ = 0, urg = 0;
+@@ -717,8 +721,9 @@ drawbar(Monitor *m)
+ 	x = 0;
+ 	for (i = 0; i < LENGTH(tags); i++) {
+ 		w = TEXTW(tags[i]);
++		wdelta = selmon->alttag ? abs(TEXTW(tags[i]) - TEXTW(tagsalt[i])) / 2 : 0;
+ 		drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
+-		drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i);
++		drw_text(drw, x, 0, w, bh, wdelta + lrpad / 2, (selmon->alttag ? tagsalt[i] : tags[i]), urg & 1 << i);
+ 		if (occ & 1 << i)
+ 			drw_rect(drw, x + boxs, boxs, boxw, boxw,
+ 				m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
+@@ -999,6 +1004,25 @@ keypress(XEvent *e)
+ 			keys[i].func(&(keys[i].arg));
+ }
+ 
++void
++keyrelease(XEvent *e)
++{
++	unsigned int i;
++	KeySym keysym;
++	XKeyEvent *ev;
++
++	ev = &e->xkey;
++	keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
++
++    for (i = 0; i < LENGTH(keys); i++)
++        if (momentaryalttags
++        && keys[i].func && keys[i].func == togglealttag
++        && selmon->alttag
++        && (keysym == keys[i].keysym
++        || CLEANMASK(keys[i].mod) == CLEANMASK(ev->state)))
++            keys[i].func(&(keys[i].arg));
++}
++
+ void
+ killclient(const Arg *arg)
+ {
+@@ -1699,6 +1723,13 @@ tile(Monitor *m)
+ 		}
+ }
+ 
++void
++togglealttag()
++{
++	selmon->alttag = !selmon->alttag;
++	drawbar(selmon);
++}
++
+ void
+ togglebar(const Arg *arg)
+ {
+-- 
+2.33.0
+
diff --git a/dwm.suckless.org/patches/alternativetags/dwm-alternativetags-6.2.diff b/dwm.suckless.org/patches/alternativetags/dwm-alternativetags-6.2.diff
@@ -1,32 +1,27 @@
-From 25aa44b5998a2aac840a0eecf9d8a479695b2577 Mon Sep 17 00:00:00 2001
-From: Piyush Pangtey <gokuvsvegita@gmail.com>
-Date: Sat, 13 Apr 2019 00:24:23 +0530
-Subject: [PATCH] alternative tags
+From b55c4bc2efa0331a6fb521d41169e8ddf8bc9b13 Mon Sep 17 00:00:00 2001
+From: Jack Bird <jack.bird@durham.ac.uk>
+Date: Sun, 29 Aug 2021 17:30:40 +0100
+Subject: [PATCH] Added momentary config option
 
-Having icons as tags sure makes dwm look awesome, but having tags number
-simplifies tags related operations. This patch introduces alternative
-tags which can be switched on the fly for the sole purpose of providing
-visual aid.
-
-Signed-off-by: Piyush Pangtey <gokuvsvegita@gmail.com>
 ---
- config.def.h |  2 ++
- dwm.c        | 14 ++++++++++++--
- 2 files changed, 14 insertions(+), 2 deletions(-)
+ config.def.h |  3 +++
+ dwm.c        | 35 +++++++++++++++++++++++++++++++++--
+ 2 files changed, 36 insertions(+), 2 deletions(-)
 
 diff --git a/config.def.h b/config.def.h
-index 1c0b587..e6c2565 100644
+index 1c0b587..4cfcef1 100644
 --- a/config.def.h
 +++ b/config.def.h
-@@ -20,6 +20,7 @@ static const char *colors[][3]      = {
+@@ -20,6 +20,8 @@ static const char *colors[][3]      = {
  
  /* tagging */
  static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
 +static const char *tagsalt[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
++static const int momentaryalttags = 0; /* 1 means alttags will show only when key is held down*/
  
  static const Rule rules[] = {
  	/* xprop(1):
-@@ -84,6 +85,7 @@ static Key keys[] = {
+@@ -84,6 +86,7 @@ static Key keys[] = {
  	{ MODKEY,                       XK_period, focusmon,       {.i = +1 } },
  	{ MODKEY|ShiftMask,             XK_comma,  tagmon,         {.i = -1 } },
  	{ MODKEY|ShiftMask,             XK_period, tagmon,         {.i = +1 } },
@@ -35,7 +30,7 @@ index 1c0b587..e6c2565 100644
  	TAGKEYS(                        XK_2,                      1)
  	TAGKEYS(                        XK_3,                      2)
 diff --git a/dwm.c b/dwm.c
-index 4465af1..ee292e1 100644
+index 4465af1..1e6e6f3 100644
 --- a/dwm.c
 +++ b/dwm.c
 @@ -130,6 +130,7 @@ struct Monitor {
@@ -46,7 +41,15 @@ index 4465af1..ee292e1 100644
  };
  
  typedef struct {
-@@ -209,6 +210,7 @@ static void spawn(const Arg *arg);
+@@ -176,6 +177,7 @@ static void grabbuttons(Client *c, int focused);
+ static void grabkeys(void);
+ static void incnmaster(const Arg *arg);
+ static void keypress(XEvent *e);
++static void keyrelease(XEvent *e);
+ static void killclient(const Arg *arg);
+ static void manage(Window w, XWindowAttributes *wa);
+ static void mappingnotify(XEvent *e);
+@@ -209,6 +211,7 @@ static void spawn(const Arg *arg);
  static void tag(const Arg *arg);
  static void tagmon(const Arg *arg);
  static void tile(Monitor *);
@@ -54,7 +57,15 @@ index 4465af1..ee292e1 100644
  static void togglebar(const Arg *arg);
  static void togglefloating(const Arg *arg);
  static void toggletag(const Arg *arg);
-@@ -695,7 +697,7 @@ dirtomon(int dir)
+@@ -253,6 +256,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
+ 	[Expose] = expose,
+ 	[FocusIn] = focusin,
+ 	[KeyPress] = keypress,
++    [KeyRelease] = keyrelease,
+ 	[MappingNotify] = mappingnotify,
+ 	[MapRequest] = maprequest,
+ 	[MotionNotify] = motionnotify,
+@@ -695,7 +699,7 @@ dirtomon(int dir)
  void
  drawbar(Monitor *m)
  {
@@ -63,7 +74,7 @@ index 4465af1..ee292e1 100644
  	int boxs = drw->fonts->h / 9;
  	int boxw = drw->fonts->h / 6 + 2;
  	unsigned int i, occ = 0, urg = 0;
-@@ -716,8 +718,9 @@ drawbar(Monitor *m)
+@@ -716,8 +720,9 @@ drawbar(Monitor *m)
  	x = 0;
  	for (i = 0; i < LENGTH(tags); i++) {
  		w = TEXTW(tags[i]);
@@ -74,7 +85,33 @@ index 4465af1..ee292e1 100644
  		if (occ & 1 << i)
  			drw_rect(drw, x + boxs, boxs, boxw, boxw,
  				m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
-@@ -1696,6 +1699,13 @@ tile(Monitor *m)
+@@ -998,6 +1003,25 @@ keypress(XEvent *e)
+ 			keys[i].func(&(keys[i].arg));
+ }
+ 
++void
++keyrelease(XEvent *e)
++{
++	unsigned int i;
++	KeySym keysym;
++	XKeyEvent *ev;
++
++	ev = &e->xkey;
++	keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
++
++    for (i = 0; i < LENGTH(keys); i++)
++        if (momentaryalttags
++        && keys[i].func && keys[i].func == togglealttag
++        && selmon->alttag
++        && (keysym == keys[i].keysym
++        || CLEANMASK(keys[i].mod) == CLEANMASK(ev->state)))
++            keys[i].func(&(keys[i].arg));
++}
++
+ void
+ killclient(const Arg *arg)
+ {
+@@ -1696,6 +1720,13 @@ tile(Monitor *m)
  		}
  }
  
@@ -89,5 +126,5 @@ index 4465af1..ee292e1 100644
  togglebar(const Arg *arg)
  {
 -- 
-2.21.0
+2.33.0
 
diff --git a/dwm.suckless.org/patches/alternativetags/index.md b/dwm.suckless.org/patches/alternativetags/index.md
@@ -17,8 +17,10 @@ Alternative tags
 
 Download
 --------
-* [dwm-alternativetags-6.2.diff](dwm-alternativetags-6.2.diff) (2019-04-13)
+* [dwm-alternativetags-6.2.diff](dwm-alternativetags-6.2.diff) (2021-08-29)
+* [dwm-alternativetags-20210829-ed3ab6b4.diff](dwm-alternativetags-20210829-ed3ab6b4.diff) (2021-08-29)
 
 Author
 -------
 * Piyush Pangtey <gokuvsvegita@gmail.com>
+* Jack Bird <jack.bird@dur.ac.uk> (momentary switch)