diff --git a/singletagset/singletagset.patch b/singletagset/singletagset.patch new file mode 100644 index 0000000..65daf09 --- /dev/null +++ b/singletagset/singletagset.patch @@ -0,0 +1,202 @@ +From 2311e2e20f533f1aae16581a6359ca871c7869cd Mon Sep 17 00:00:00 2001 +From: Ben Collerson +Date: Tue, 2 Jan 2024 10:22:31 +1000 +Subject: [PATCH] singletagset + +--- + dwl.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 79 insertions(+), 8 deletions(-) + +diff --git a/dwl.c b/dwl.c +index 4d19357f..f84c8a27 100644 +--- a/dwl.c ++++ b/dwl.c +@@ -236,6 +236,7 @@ static void arrange(Monitor *m); + static void arrangelayer(Monitor *m, struct wl_list *list, + struct wlr_box *usable_area, int exclusive); + static void arrangelayers(Monitor *m); ++static void attachclients(Monitor *m); + static void axisnotify(struct wl_listener *listener, void *data); + static void buttonpress(struct wl_listener *listener, void *data); + static void chvt(const Arg *arg); +@@ -269,6 +270,7 @@ static void focusmon(const Arg *arg); + static void focusstack(const Arg *arg); + static Client *focustop(Monitor *m); + static void fullscreennotify(struct wl_listener *listener, void *data); ++static size_t getunusedtag(void); + static void handlesig(int signo); + static void incnmaster(const Arg *arg); + static void inputdevice(struct wl_listener *listener, void *data); +@@ -533,6 +535,15 @@ arrangelayers(Monitor *m) + } + } + ++void ++attachclients(Monitor *m) ++{ ++ Client *c; ++ wl_list_for_each(c, &clients, link) ++ if (c->tags & m->tagset[m->seltags]) ++ setmon(c, m, c->tags); ++} ++ + void + axisnotify(struct wl_listener *listener, void *data) + { +@@ -856,7 +867,7 @@ createmon(struct wl_listener *listener, void *data) + + wlr_output_state_init(&state); + /* Initialize monitor state using configured rules */ +- m->tagset[0] = m->tagset[1] = 1; ++ m->tagset[0] = m->tagset[1] = (1<name || strstr(wlr_output->name, r->name)) { + m->m.x = r->x; +@@ -1311,6 +1322,22 @@ handlesig(int signo) + } + } + ++size_t ++getunusedtag(void) ++{ ++ size_t i = 0; ++ Monitor *m; ++ if (wl_list_empty(&mons)) ++ return i; ++ for (i=0; i < TAGCOUNT; i++) { ++ wl_list_for_each(m, &mons, link) { ++ if (!(m->tagset[m->seltags] & (1<mon != m) +- continue; + occ |= c->tags; + if (c->isurgent) + urg |= c->tags; +@@ -2431,6 +2456,7 @@ startdrag(struct wl_listener *listener, void *data) + void + tag(const Arg *arg) + { ++ Monitor *m; + Client *sel = focustop(selmon); + if (!sel || (arg->ui & TAGMASK) == 0) + return; +@@ -2438,15 +2464,25 @@ tag(const Arg *arg) + sel->tags = arg->ui & TAGMASK; + focusclient(focustop(selmon), 1); + arrange(selmon); ++ wl_list_for_each(m, &mons, link) { ++ attachclients(m); ++ arrange(m); ++ } + printstatus(); + } + + void + tagmon(const Arg *arg) + { ++ Monitor *m; + Client *sel = focustop(selmon); +- if (sel) ++ if (sel) { + setmon(sel, dirtomon(arg->i), 0); ++ wl_list_for_each(m, &mons, link) { ++ arrange(m); ++ } ++ focusclient(focustop(sel->mon), 1); ++ } + } + + void +@@ -2502,12 +2538,18 @@ togglefullscreen(const Arg *arg) + void + toggletag(const Arg *arg) + { ++ Monitor *m; + uint32_t newtags; + Client *sel = focustop(selmon); + if (!sel || !(newtags = sel->tags ^ (arg->ui & TAGMASK))) + return; + ++ wl_list_for_each(m, &mons, link) ++ if (m !=selmon && newtags & m->tagset[m->seltags]) ++ return; ++ + sel->tags = newtags; ++ attachclients(selmon); + focusclient(focustop(selmon), 1); + arrange(selmon); + printstatus(); +@@ -2516,11 +2558,17 @@ toggletag(const Arg *arg) + void + toggleview(const Arg *arg) + { ++ Monitor *m; + uint32_t newtagset; + if (!(newtagset = selmon ? selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK) : 0)) + return; + ++ wl_list_for_each(m, &mons, link) ++ if (m !=selmon && newtagset & m->tagset[m->seltags]) ++ return; ++ + selmon->tagset[selmon->seltags] = newtagset; ++ attachclients(selmon); + focusclient(focustop(selmon), 1); + arrange(selmon); + printstatus(); +@@ -2704,13 +2752,36 @@ urgent(struct wl_listener *listener, void *data) + void + view(const Arg *arg) + { ++ Monitor *m, *origm = selmon; ++ unsigned int newtags = selmon->tagset[selmon->seltags ^ 1]; ++ + if (!selmon || (arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) + return; +- selmon->seltags ^= 1; /* toggle sel tagset */ ++ ++ /* swap tags when trying to display a tag from another monitor */ + if (arg->ui & TAGMASK) +- selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; +- focusclient(focustop(selmon), 1); +- arrange(selmon); ++ newtags = arg->ui & TAGMASK; ++ wl_list_for_each(m, &mons, link) { ++ if (m != selmon && newtags & m->tagset[m->seltags]) { ++ /* prevent displaying all tags (MODKEY-0) when multiple monitors ++ * are connected */ ++ if (newtags & selmon->tagset[selmon->seltags]) ++ return; ++ m->seltags ^= 1; ++ m->tagset[m->seltags] = selmon->tagset[selmon->seltags]; ++ attachclients(m); ++ focusclient(focustop(m), 1); ++ arrange(m); ++ break; ++ } ++ } ++ ++ origm->seltags ^= 1; /* toggle sel tagset */ ++ if (arg->ui & TAGMASK) ++ origm->tagset[origm->seltags] = arg->ui & TAGMASK; ++ attachclients(origm); ++ focusclient(focustop(origm), 1); ++ arrange(origm); + printstatus(); + } + +-- +2.43.0 +