From 66054700cb58d97f3f333317db18b24e0f39ef2c Mon Sep 17 00:00:00 2001
From: "Devin J. Pohly" <djpohly@gmail.com>
Date: Thu, 23 Apr 2020 20:02:17 -0500
Subject: add toggletag and toggleview

---
 config.def.h |  4 +++-
 dwl.c        | 27 +++++++++++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/config.def.h b/config.def.h
index f4720a8..71d67e9 100644
--- a/config.def.h
+++ b/config.def.h
@@ -32,7 +32,9 @@ static const struct xkb_rule_names xkb_rules = {
 #define MODKEY WLR_MODIFIER_ALT
 #define TAGKEYS(KEY,SKEY,TAG) \
 	{ MODKEY,                    KEY,            view,            {.ui = 1 << TAG} }, \
-	{ MODKEY|WLR_MODIFIER_SHIFT, SKEY,           tag,             {.ui = 1 << TAG} }
+	{ MODKEY|WLR_MODIFIER_CTRL,  KEY,            toggleview,      {.ui = 1 << TAG} }, \
+	{ MODKEY|WLR_MODIFIER_SHIFT, SKEY,           tag,             {.ui = 1 << TAG} }, \
+	{ MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,SKEY,toggletag, {.ui = 1 << TAG} }
 
 /* commands */
 static const char *termcmd[]  = { "kitty", "-o", "linux_display_server=wayland", NULL };
diff --git a/dwl.c b/dwl.c
index df72eef..c58a7e0 100644
--- a/dwl.c
+++ b/dwl.c
@@ -154,6 +154,8 @@ static void spawn(const Arg *arg);
 static void tag(const Arg *arg);
 static void tile(Monitor *m);
 static void togglefloating(const Arg *arg);
+static void toggletag(const Arg *arg);
+static void toggleview(const Arg *arg);
 static void unmapnotify(struct wl_listener *listener, void *data);
 static void view(const Arg *arg);
 static Client *xytoclient(double x, double y,
@@ -1116,6 +1118,31 @@ togglefloating(const Arg *arg)
 	sel->isfloating = !sel->isfloating /* || sel->isfixed */;
 }
 
+void
+toggletag(const Arg *arg)
+{
+	unsigned int newtags;
+	Client *sel = selclient();
+	if (!sel)
+		return;
+	newtags = sel->tags ^ (arg->ui & TAGMASK);
+	if (newtags) {
+		sel->tags = newtags;
+		focus(NULL, NULL);
+	}
+}
+
+void
+toggleview(const Arg *arg)
+{
+	unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);
+
+	if (newtagset) {
+		selmon->tagset[selmon->seltags] = newtagset;
+		focus(NULL, NULL);
+	}
+}
+
 void
 unmapnotify(struct wl_listener *listener, void *data)
 {
-- 
cgit v1.2.3