[wiki] [sites] [dwm] Major clean up for some patches || Ivan Tham

From: <git_AT_suckless.org>
Date: Tue, 10 Nov 2015 08:31:59 +0100

commit c26279b4c56d6c8dfdb9dc93a5731cb03d4db540
Author: Ivan Tham <pickfire_AT_riseup.net>
Date: Tue Nov 10 15:28:58 2015 +0800

    [dwm] Major clean up for some patches
    
            - remove some broken links
            - version < 6.0 moved to historical
            - rename files to dwm-git-YYYYMMDD-NAME.diff
            - etc.

diff --git a/dwm.suckless.org/patches/attachabove.md b/dwm.suckless.org/patches/attachabove.md
index 8640037..e8df87b 100644
--- a/dwm.suckless.org/patches/attachabove.md
+++ b/dwm.suckless.org/patches/attachabove.md
_AT_@ -12,9 +12,9 @@ Patches against different versions of dwm are available at
 [dwm-clean-patches](https://github.com/jceb/dwm-clean-patches).
 
  * [dwm-6.1-attachabove.diff](dwm-6.1-attachabove.diff) (1786b) (20140209)
- * [dwm-10e232f9ace7-attachabove.diff](dwm-10e232f9ace7-attachabove.diff) (1709b) (20120406)
+ * [dwm-git-20120406-attachabove.diff](dwm-git-20120406-attachabove.diff) (1709b)
  * [dwm-6.0-attachabove.diff](dwm-6.0-attachabove.diff) (1707b) (20120406)
- * [dwm-5.6.1-attachabove.diff](dwm-5.6.1-attachabove.diff) (1.1K) (20090817)
+ * [dwm-5.6.1-attachabove.diff](historical/dwm-5.6.1-attachabove.diff) (1.1K) (20090817)
 
 Author
 ------
diff --git a/dwm.suckless.org/patches/attachaside.md b/dwm.suckless.org/patches/attachaside.md
index caf1bf8..26a7a31 100644
--- a/dwm.suckless.org/patches/attachaside.md
+++ b/dwm.suckless.org/patches/attachaside.md
_AT_@ -12,7 +12,7 @@ area instead of always becoming the new master. It's basically an
         | | |
         | | P |
         | | |
- | N +-------|
+ | N +-------+
         | | |
         | | |
         | | |
_AT_@ -55,8 +55,8 @@ improved to also attach to the stack on unfocused tags.
 ### Original
 
 * [dwm-6.0-attachaside.diff](dwm-6.0-attachaside.diff) (1,6K) (20140412)
-* [dwm-5.7.2-attachaside.diff](dwm-5.7.2-attachaside.diff) (1.1K) (20091215)
-* [dwm-5.6.1-attachaside.diff](dwm-5.6.1-attachaside.diff) (1.1K) (20090915)
+* [dwm-5.7.2-attachaside.diff](historical/dwm-5.7.2-attachaside.diff) (1.1K) (20091215)
+* [dwm-5.6.1-attachaside.diff](historical/dwm-5.6.1-attachaside.diff) (1.1K) (20090915)
 
 Authors
 -------
diff --git a/dwm.suckless.org/patches/dwm-10e232f9ace7-attachabove.diff b/dwm.suckless.org/patches/dwm-10e232f9ace7-attachabove.diff
deleted file mode 100644
index d38da88..0000000
--- a/dwm.suckless.org/patches/dwm-10e232f9ace7-attachabove.diff
+++ /dev/null
_AT_@ -1,63 +0,0 @@
-Author: Jan Christoph Ebersbach <jceb_AT_e-jc.de>
-URL: http://dwm.suckless.org/patches/attachabove
-attachabove makes new clients attach above the selected client (instead of
-always becoming the new master) – basically how Xmonad does it.
-
-diff -r 10e232f9ace7 dwm.c
---- a/dwm.c Sun Mar 25 17:49:35 2012 +0200
-+++ b/dwm.c Fri Apr 06 08:16:37 2012 +0200
-_AT_@ -160,6 +160,7 @@
- static void arrange(Monitor *m);
- static void arrangemon(Monitor *m);
- static void attach(Client *c);
-+static void attachabove(Client *c);
- static void attachstack(Client *c);
- static void buttonpress(XEvent *e);
- static void checkotherwm(void);
-_AT_@ -419,6 +420,19 @@
- }
-
- void
-+attachabove(Client *c) {
-+ if(c->mon->sel == NULL || c->mon->sel == c->mon->clients || c->mon->sel->isfloating) {
-+ attach(c);
-+ return;
-+ }
-+
-+ Client *at;
-+ for(at = c->mon->clients; at->next != c->mon->sel; at = at->next);
-+ c->next = at->next;
-+ at->next = c;
-+}
-+
-+void
- attachstack(Client *c) {
- c->snext = c->mon->stack;
- c->mon->stack = c;
-_AT_@ -1159,7 +1173,7 @@
- c->isfloating = c->oldstate = trans != None || c->isfixed;
- if(c->isfloating)
- XRaiseWindow(dpy, c->win);
-- attach(c);
-+ attachabove(c);
- attachstack(c);
- XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
- (unsigned char *) &(c->win), 1);
-_AT_@ -1493,7 +1507,7 @@
- detachstack(c);
- c->mon = m;
- c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
-- attach(c);
-+ attachabove(c);
- attachstack(c);
- focus(NULL);
- arrange(NULL);
-_AT_@ -1939,7 +1953,7 @@
- m->clients = c->next;
- detachstack(c);
- c->mon = mons;
-- attach(c);
-+ attachabove(c);
- attachstack(c);
- }
- if(m == selmon)
diff --git a/dwm.suckless.org/patches/dwm-10e232f9ace7-pertag.diff b/dwm.suckless.org/patches/dwm-10e232f9ace7-pertag.diff
deleted file mode 100644
index 258c81e..0000000
--- a/dwm.suckless.org/patches/dwm-10e232f9ace7-pertag.diff
+++ /dev/null
_AT_@ -1,181 +0,0 @@
-Author: Jan Christoph Ebersbach <jceb_AT_e-jc.de>
-URL: http://dwm.suckless.org/patches/pertag
-This patch keeps layout, mwfact, barpos and nmaster per tag.
-
-diff -r 10e232f9ace7 dwm.c
---- a/dwm.c Sun Mar 25 17:49:35 2012 +0200
-+++ b/dwm.c Fri Apr 06 08:16:31 2012 +0200
-_AT_@ -124,6 +124,7 @@
- void (*arrange)(Monitor *);
- } Layout;
-
-+typedef struct Pertag Pertag;
- struct Monitor {
- char ltsymbol[16];
- float mfact;
-_AT_@ -143,6 +144,7 @@
- Monitor *next;
- Window barwin;
- const Layout *lt[2];
-+ Pertag *pertag;
- };
-
- typedef struct {
-_AT_@ -288,6 +290,15 @@
- /* configuration, allows nested code to access above variables */
- #include "config.h"
-
-+struct Pertag {
-+ unsigned int curtag, prevtag; /* current and previous tag */
-+ int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */
-+ float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */
-+ unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */
-+ const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes */
-+ Bool showbars[LENGTH(tags) + 1]; /* display bar for the current tag */
-+};
-+
- /* compile-time check if all tags fit into an unsigned int bit array. */
- struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
-
-_AT_@ -648,6 +659,7 @@
- Monitor *
- createmon(void) {
- Monitor *m;
-+ int i;
-
- if(!(m = (Monitor *)calloc(1, sizeof(Monitor))))
- die("fatal: could not malloc() %u bytes
", sizeof(Monitor));
-_AT_@ -659,6 +671,24 @@
- m->lt[0] = &layouts[0];
- m->lt[1] = &layouts[1 % LENGTH(layouts)];
- strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
-+ if(!(m->pertag = (Pertag *)calloc(1, sizeof(Pertag))))
-+ die("fatal: could not malloc() %u bytes
", sizeof(Pertag));
-+ m->pertag->curtag = m->pertag->prevtag = 1;
-+ for(i=0; i <= LENGTH(tags); i++) {
-+ /* init nmaster */
-+ m->pertag->nmasters[i] = m->nmaster;
-+
-+ /* init mfacts */
-+ m->pertag->mfacts[i] = m->mfact;
-+
-+ /* init layouts */
-+ m->pertag->ltidxs[i][0] = m->lt[0];
-+ m->pertag->ltidxs[i][1] = m->lt[1];
-+ m->pertag->sellts[i] = m->sellt;
-+
-+ /* init showbar */
-+ m->pertag->showbars[i] = m->showbar;
-+ }
- return m;
- }
-
-_AT_@ -1032,7 +1062,7 @@
-
- void
- incnmaster(const Arg *arg) {
-- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0);
-+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag] = MAX(selmon->nmaster + arg->i, 0);
- arrange(selmon);
- }
-
-_AT_@ -1572,10 +1602,13 @@
-
- void
- setlayout(const Arg *arg) {
-- if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
-- selmon->sellt ^= 1;
-+ if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) {
-+ selmon->pertag->sellts[selmon->pertag->curtag] ^= 1;
-+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
-+ }
- if(arg && arg->v)
-- selmon->lt[selmon->sellt] = (Layout *)arg->v;
-+ selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt] = (Layout *)arg->v;
-+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
- strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
- if(selmon->sel)
- arrange(selmon);
-_AT_@ -1593,7 +1626,7 @@
- f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
- if(f < 0.1 || f > 0.9)
- return;
-- selmon->mfact = f;
-+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag] = f;
- arrange(selmon);
- }
-
-_AT_@ -1748,7 +1781,7 @@
-
- void
- togglebar(const Arg *arg) {
-- selmon->showbar = !selmon->showbar;
-+ selmon->showbar = selmon->pertag->showbars[selmon->pertag->curtag] = !selmon->showbar;
- updatebarpos(selmon);
- XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
- arrange(selmon);
-_AT_@ -1784,9 +1817,29 @@
- void
- toggleview(const Arg *arg) {
- unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);
-+ int i;
-
- if(newtagset) {
-+ if(newtagset == ~0) {
-+ selmon->pertag->prevtag = selmon->pertag->curtag;
-+ selmon->pertag->curtag = 0;
-+ }
-+ /* test if the user did not select the same tag */
-+ if(!(newtagset & 1 << (selmon->pertag->curtag - 1))) {
-+ selmon->pertag->prevtag = selmon->pertag->curtag;
-+ for (i=0; !(newtagset & 1 << i); i++) ;
-+ selmon->pertag->curtag = i + 1;
-+ }
- selmon->tagset[selmon->seltags] = newtagset;
-+
-+ /* apply settings for this view */
-+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
-+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
-+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
-+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
-+ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
-+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
-+ togglebar(NULL);
- focus(NULL);
- arrange(selmon);
- }
-_AT_@ -2081,11 +2134,33 @@
-
- void
- view(const Arg *arg) {
-+ int i;
-+ unsigned int tmptag;
-+
- if((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
- return;
- selmon->seltags ^= 1; /* toggle sel tagset */
-- if(arg->ui & TAGMASK)
-+ if(arg->ui & TAGMASK) {
-+ selmon->pertag->prevtag = selmon->pertag->curtag;
- selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
-+ if(arg->ui == ~0)
-+ selmon->pertag->curtag = 0;
-+ else {
-+ for (i=0; !(arg->ui & 1 << i); i++) ;
-+ selmon->pertag->curtag = i + 1;
-+ }
-+ } else {
-+ tmptag = selmon->pertag->prevtag;
-+ selmon->pertag->prevtag = selmon->pertag->curtag;
-+ selmon->pertag->curtag = tmptag;
-+ }
-+ selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
-+ selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
-+ selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
-+ selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
-+ selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
-+ if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
-+ togglebar(NULL);
- focus(NULL);
- arrange(selmon);
- }
diff --git a/dwm.suckless.org/patches/dwm-10e232f9ace7-push.diff b/dwm.suckless.org/patches/dwm-10e232f9ace7-push.diff
deleted file mode 100644
index bee858f..0000000
--- a/dwm.suckless.org/patches/dwm-10e232f9ace7-push.diff
+++ /dev/null
_AT_@ -1,65 +0,0 @@
-URL: http://dwm.suckless.org/patches/push
-pushup and pushdown provide a way to move clients inside the clients list.
-
-diff -r 10e232f9ace7 push.c
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/push.c Fri Apr 06 08:16:39 2012 +0200
-_AT_@ -0,0 +1,58 @@
-+static Client *
-+prevtiled(Client *c) {
-+ Client *p, *r;
-+
-+ for(p = selmon->clients, r = NULL; p && p != c; p = p->next)
-+ if(!p->isfloating && ISVISIBLE(p))
-+ r = p;
-+ return r;
-+}
-+
-+static void
-+pushup(const Arg *arg) {
-+ Client *sel = selmon->sel;
-+ Client *c;
-+
-+ if(!sel || sel->isfloating)
-+ return;
-+ if((c = prevtiled(sel))) {
-+ /* attach before c */
-+ detach(sel);
-+ sel->next = c;
-+ if(selmon->clients == c)
-+ selmon->clients = sel;
-+ else {
-+ for(c = selmon->clients; c->next != sel->next; c = c->next);
-+ c->next = sel;
-+ }
-+ } else {
-+ /* move to the end */
-+ for(c = sel; c->next; c = c->next);
-+ detach(sel);
-+ sel->next = NULL;
-+ c->next = sel;
-+ }
-+ focus(sel);
-+ arrange(selmon);
-+}
-+
-+static void
-+pushdown(const Arg *arg) {
-+ Client *sel = selmon->sel;
-+ Client *c;
-+
-+ if(!sel || sel->isfloating)
-+ return;
-+ if((c = nexttiled(sel->next))) {
-+ /* attach after c */
-+ detach(sel);
-+ sel->next = c->next;
-+ c->next = sel;
-+ } else {
-+ /* move to the front */
-+ detach(sel);
-+ attach(sel);
-+ }
-+ focus(sel);
-+ arrange(selmon);
-+}
diff --git a/dwm.suckless.org/patches/dwm-5.6.1-attachabove.diff b/dwm.suckless.org/patches/dwm-5.6.1-attachabove.diff
deleted file mode 100644
index d9e99a4..0000000
--- a/dwm.suckless.org/patches/dwm-5.6.1-attachabove.diff
+++ /dev/null
_AT_@ -1,40 +0,0 @@
-diff -r e47a47bd3ed4 dwm.c
---- a/dwm.c Tue Jul 21 10:57:54 2009 +0100
-+++ b/dwm.c Mon Aug 17 15:03:36 2009 +0200
-_AT_@ -153,6 +153,7 @@
- static Bool applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact);
- static void arrange(void);
- static void attach(Client *c);
-+static void attachabove(Client *c);
- static void attachstack(Client *c);
- static void buttonpress(XEvent *e);
- static void checkotherwm(void);
-_AT_@ -394,6 +395,19 @@
- attach(Client *c) {
- c->next = c->mon->clients;
- c->mon->clients = c;
-+}
-+
-+void
-+attachabove(Client *c) {
-+ if(c->mon->sel == NULL || c->mon->sel == c->mon->clients || c->mon->sel->isfloating) {
-+ attach(c);
-+ return;
-+ }
-+
-+ Client *at;
-+ for (at = c->mon->clients; at->next != c->mon->sel; at = at->next);
-+ c->next = at->next;
-+ at->next = c;
- }
-
- void
-_AT_@ -1098,7 +1112,7 @@
- c->isfloating = trans != None || c->isfixed;
- if(c->isfloating)
- XRaiseWindow(dpy, c->win);
-- attach(c);
-+ attachabove(c);
- attachstack(c);
- XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */
- XMapWindow(dpy, c->win);
diff --git a/dwm.suckless.org/patches/dwm-5.6.1-attachaside.diff b/dwm.suckless.org/patches/dwm-5.6.1-attachaside.diff
deleted file mode 100644
index 52ea58f..0000000
--- a/dwm.suckless.org/patches/dwm-5.6.1-attachaside.diff
+++ /dev/null
_AT_@ -1,38 +0,0 @@
-diff -r 9f79d36bd5e0 dwm.c
---- a/dwm.c Tue Sep 08 13:33:58 2009 +0100
-+++ b/dwm.c Tue Sep 15 14:19:26 2009 +0200
-_AT_@ -153,6 +153,7 @@
- static Bool applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact);
- static void arrange(void);
- static void attach(Client *c);
-+static void attachaside(Client *c);
- static void attachstack(Client *c);
- static void buttonpress(XEvent *e);
- static void checkotherwm(void);
-_AT_@ -397,6 +398,17 @@
- }
-
- void
-+attachaside(Client *c) {
-+ Client *at = nexttiled(c->mon->clients);;
-+ if(c->mon->sel == NULL || c->mon->sel->isfloating || !at) {
-+ attach(c);
-+ return;
-+ }
-+ c->next = at->next;
-+ at->next = c;
-+}
-+
-+void
- attachstack(Client *c) {
- c->snext = c->mon->stack;
- c->mon->stack = c;
-_AT_@ -1105,7 +1117,7 @@
- c->isfloating = trans != None || c->isfixed;
- if(c->isfloating)
- XRaiseWindow(dpy, c->win);
-- attach(c);
-+ attachaside(c);
- attachstack(c);
- XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */
- XMapWindow(dpy, c->win);
diff --git a/dwm.suckless.org/patches/dwm-5.7.2-attachaside.diff b/dwm.suckless.org/patches/dwm-5.7.2-attachaside.diff
deleted file mode 100644
index 52ea58f..0000000
--- a/dwm.suckless.org/patches/dwm-5.7.2-attachaside.diff
+++ /dev/null
_AT_@ -1,38 +0,0 @@
-diff -r 9f79d36bd5e0 dwm.c
---- a/dwm.c Tue Sep 08 13:33:58 2009 +0100
-+++ b/dwm.c Tue Sep 15 14:19:26 2009 +0200
-_AT_@ -153,6 +153,7 @@
- static Bool applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact);
- static void arrange(void);
- static void attach(Client *c);
-+static void attachaside(Client *c);
- static void attachstack(Client *c);
- static void buttonpress(XEvent *e);
- static void checkotherwm(void);
-_AT_@ -397,6 +398,17 @@
- }
-
- void
-+attachaside(Client *c) {
-+ Client *at = nexttiled(c->mon->clients);;
-+ if(c->mon->sel == NULL || c->mon->sel->isfloating || !at) {
-+ attach(c);
-+ return;
-+ }
-+ c->next = at->next;
-+ at->next = c;
-+}
-+
-+void
- attachstack(Client *c) {
- c->snext = c->mon->stack;
- c->mon->stack = c;
-_AT_@ -1105,7 +1117,7 @@
- c->isfloating = trans != None || c->isfixed;
- if(c->isfloating)
- XRaiseWindow(dpy, c->win);
-- attach(c);
-+ attachaside(c);
- attachstack(c);
- XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */
- XMapWindow(dpy, c->win);
diff --git a/dwm.suckless.org/patches/dwm-5.8.2-focusonclick.diff b/dwm.suckless.org/patches/dwm-5.8.2-focusonclick.diff
deleted file mode 100644
index 08e6123..0000000
--- a/dwm.suckless.org/patches/dwm-5.8.2-focusonclick.diff
+++ /dev/null
_AT_@ -1,38 +0,0 @@
-diff -r 72e52c5333ef config.def.h
---- a/config.def.h Wed Nov 25 13:56:17 2009 +0000
-+++ b/config.def.h Sun Mar 21 00:38:45 2010 +0100
-_AT_@ -12,6 +12,7 @@
- static const unsigned int snap = 32; /* snap pixel */
- static const Bool showbar = True; /* False means no bar */
- static const Bool topbar = True; /* False means bottom bar */
-+static const Bool focusonclick = True; /* Change focus only on click */
-
- /* tagging */
- static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
-diff -r 72e52c5333ef dwm.c
---- a/dwm.c Wed Nov 25 13:56:17 2009 +0000
-+++ b/dwm.c Sun Mar 21 00:38:45 2010 +0100
-_AT_@ -791,14 +791,16 @@
-
- if((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root)
- return;
-- if((m = wintomon(ev->window)) && m != selmon) {
-- unfocus(selmon->sel);
-- selmon = m;
-+ if (!focusonclick) {
-+ if((m = wintomon(ev->window)) && m != selmon) {
-+ unfocus(selmon->sel, False);
-+ selmon = m;
-+ }
-+ if((c = wintoclient(ev->window)))
-+ focus(c);
-+ else
-+ focus(NULL);
- }
-- if((c = wintoclient(ev->window)))
-- focus(c);
-- else
-- focus(NULL);
- }
-
- void
diff --git a/dwm.suckless.org/patches/dwm-5.8.2-pertag.diff b/dwm.suckless.org/patches/dwm-5.8.2-pertag.diff
deleted file mode 100644
index 5dd9252..0000000
--- a/dwm.suckless.org/patches/dwm-5.8.2-pertag.diff
+++ /dev/null
_AT_@ -1,180 +0,0 @@
-diff --git a/dwm.c b/dwm.c
---- a/dwm.c
-+++ b/dwm.c
-_AT_@ -122,26 +122,6 @@ typedef struct {
- void (*arrange)(Monitor *);
- } Layout;
-
--struct Monitor {
-- char ltsymbol[16];
-- float mfact;
-- int num;
-- int by; /* bar geometry */
-- int mx, my, mw, mh; /* screen size */
-- int wx, wy, ww, wh; /* window area */
-- unsigned int seltags;
-- unsigned int sellt;
-- unsigned int tagset[2];
-- Bool showbar;
-- Bool topbar;
-- Client *clients;
-- Client *sel;
-- Client *stack;
-- Monitor *next;
-- Window barwin;
-- const Layout *lt[2];
--};
--
- typedef struct {
- 	const char *class;
- 	const char *instance;
-_AT_@ -278,6 +258,31 @@ static Window root;
- /* configuration, allows nested code to access above variables */
- #include "config.h"
- 
-+struct Monitor {
-+	char ltsymbol[16];
-+	float mfact;
-+	int num;
-+	int by;               /* bar geometry */
-+	int mx, my, mw, mh;   /* screen size */
-+	int wx, wy, ww, wh;   /* window area  */
-+	unsigned int seltags;
-+	unsigned int sellt;
-+	unsigned int tagset[2];
-+	Bool showbar;
-+	Bool topbar;
-+	Client *clients;
-+	Client *sel;
-+	Client *stack;
-+	Monitor *next;
-+	Window barwin;
-+	const Layout *lt[2];
-+	int curtag;
-+	int prevtag;
-+	const Layout *lts[LENGTH(tags) + 1];
-+	double mfacts[LENGTH(tags) + 1];
-+	Bool showbars[LENGTH(tags) + 1];
-+};
-+
- /* compile-time check if all tags fit into an unsigned int bit array. */
- struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
- 
-_AT_@ -609,6 +614,7 @@ configurerequest(XEvent *e) {
- Monitor *
- createmon(void) {
- 	Monitor *m;
-+	unsigned int i;
- 
- 	if(!(m = (Monitor *)calloc(1, sizeof(Monitor))))
- 		die("fatal: could not malloc() %u bytes
", sizeof(Monitor));
-_AT_@ -619,6 +625,15 @@ createmon(void) {
- 	m->lt[0] = &layouts[0];
- 	m->lt[1] = &layouts[1 % LENGTH(layouts)];
- 	strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
-+
-+	/* pertag init */
-+	m->curtag = m->prevtag = 1;
-+	for(i=0; i < LENGTH(tags) + 1 ; i++) {
-+		m->mfacts[i] = mfact;
-+		m->lts[i] = &layouts[0];
-+		m->showbars[i] = m->showbar;
-+	}
-+
- 	return m;
- }
- 
-_AT_@ -1486,7 +1501,7 @@ setlayout(const Arg *arg) {
- 	if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
- 		selmon->sellt ^= 1;
- 	if(arg && arg->v)
--		selmon->lt[selmon->sellt] = (Layout *)arg->v;
-+		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag] = (Layout *)arg->v;
- 	strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
- 	if(selmon->sel)
- 		arrange(selmon);
-_AT_@ -1504,7 +1519,7 @@ setmfact(const Arg *arg) {
- 	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
- 	if(f < 0.1 || f > 0.9)
- 		return;
--	selmon->mfact = f;
-+	selmon->mfact = selmon->mfacts[selmon->curtag] = f;
- 	arrange(selmon);
- }
- 
-_AT_@ -1547,7 +1562,6 @@ setup(void) {
- 	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
- 	if(!dc.font.set)
- 		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
--	/* init bars */
- 	updatebars();
- 	updatestatus();
- 	/* EWMH support per view */
-_AT_@ -1658,7 +1672,7 @@ tile(Monitor *m) {
- 
- void
- togglebar(const Arg *arg) {
--	selmon->showbar = !selmon->showbar;
-+	selmon->showbar = selmon->showbars[selmon->curtag] = !selmon->showbar;
- 	updatebarpos(selmon);
- 	XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
- 	arrange(selmon);
-_AT_@ -1678,12 +1692,27 @@ togglefloating(const Arg *arg) {
- void
- toggletag(const Arg *arg) {
- 	unsigned int newtags;
-+	unsigned int i;
- 
- 	if(!selmon->sel)
- 		return;
- 	newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
- 	if(newtags) {
- 		selmon->sel->tags = newtags;
-+		if(newtags == ~0) {
-+			selmon->prevtag = selmon->curtag;
-+			selmon->curtag = 0;
-+		}
-+		if(!(newtags & 1 << (selmon->curtag - 1))) {
-+			selmon->prevtag = selmon->curtag;
-+			for (i=0; !(newtags & 1 << i); i++);
-+			selmon->curtag = i + 1;
-+		}
-+		selmon->sel->tags = newtags;
-+		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
-+		selmon->mfact = selmon->mfacts[selmon->curtag];
-+		if (selmon->showbar != selmon->showbars[selmon->curtag])
-+			togglebar(NULL);
- 		arrange(selmon);
- 	}
- }
-_AT_@ -1950,11 +1979,29 @@ updatewmhints(Client *c) {
- 
- void
- view(const Arg *arg) {
-+	unsigned int i;
-+
- 	if((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
- 		return;
- 	selmon->seltags ^= 1; /* toggle sel tagset */
--	if(arg->ui & TAGMASK)
-+	if(arg->ui & TAGMASK) {
- 		selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
-+		selmon->prevtag = selmon->curtag;
-+		if(arg->ui == ~0)
-+			selmon->curtag = 0;
-+		else {
-+			for (i=0; !(arg->ui & 1 << i); i++);
-+			selmon->curtag = i + 1;
-+		}
-+	} else {
-+		selmon->prevtag= selmon->curtag ^ selmon->prevtag;
-+		selmon->curtag^= selmon->prevtag;
-+		selmon->prevtag= selmon->curtag ^ selmon->prevtag;
-+	}
-+	selmon->lt[selmon->sellt]= selmon->lts[selmon->curtag];
-+	selmon->mfact = selmon->mfacts[selmon->curtag];
-+	if(selmon->showbar != selmon->showbars[selmon->curtag])
-+		togglebar(NULL);
- 	arrange(selmon);
- }
- 
diff --git a/dwm.suckless.org/patches/dwm-5.8.2-pertag_without_bar.diff b/dwm.suckless.org/patches/dwm-5.8.2-pertag_without_bar.diff
deleted file mode 100644
index d7a30ec..0000000
--- a/dwm.suckless.org/patches/dwm-5.8.2-pertag_without_bar.diff
+++ /dev/null
_AT_@ -1,165 +0,0 @@
-diff --git a/dwm.c b/dwm.c
---- a/dwm.c
-+++ b/dwm.c
-_AT_@ -122,26 +122,6 @@ typedef struct {
- 	void (*arrange)(Monitor *);
- } Layout;
- 
--struct Monitor {
--	char ltsymbol[16];
--	float mfact;
--	int num;
--	int by;               /* bar geometry */
--	int mx, my, mw, mh;   /* screen size */
--	int wx, wy, ww, wh;   /* window area  */
--	unsigned int seltags;
--	unsigned int sellt;
--	unsigned int tagset[2];
--	Bool showbar;
--	Bool topbar;
--	Client *clients;
--	Client *sel;
--	Client *stack;
--	Monitor *next;
--	Window barwin;
--	const Layout *lt[2];
--};
--
- typedef struct {
- 	const char *class;
- 	const char *instance;
-_AT_@ -278,6 +258,30 @@ static Window root;
- /* configuration, allows nested code to access above variables */
- #include "config.h"
- 
-+struct Monitor {
-+	char ltsymbol[16];
-+	float mfact;
-+	int num;
-+	int by;               /* bar geometry */
-+	int mx, my, mw, mh;   /* screen size */
-+	int wx, wy, ww, wh;   /* window area  */
-+	unsigned int seltags;
-+	unsigned int sellt;
-+	unsigned int tagset[2];
-+	Bool showbar;
-+	Bool topbar;
-+	Client *clients;
-+	Client *sel;
-+	Client *stack;
-+	Monitor *next;
-+	Window barwin;
-+	const Layout *lt[2];
-+	int curtag;
-+	int prevtag;
-+	const Layout *lts[LENGTH(tags) + 1];
-+	double mfacts[LENGTH(tags) + 1];
-+};
-+
- /* compile-time check if all tags fit into an unsigned int bit array. */
- struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
- 
-_AT_@ -609,6 +613,7 @@ configurerequest(XEvent *e) {
- Monitor *
- createmon(void) {
- 	Monitor *m;
-+	unsigned int i;
- 
- 	if(!(m = (Monitor *)calloc(1, sizeof(Monitor))))
- 		die("fatal: could not malloc() %u bytes
", sizeof(Monitor));
-_AT_@ -619,6 +624,14 @@ createmon(void) {
- 	m->lt[0] = &layouts[0];
- 	m->lt[1] = &layouts[1 % LENGTH(layouts)];
- 	strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
-+
-+	/* pertag init */
-+	m->curtag = m->prevtag = 1;
-+	for(i=0; i < LENGTH(tags) + 1 ; i++) {
-+		m->mfacts[i] = mfact;
-+		m->lts[i] = &layouts[0];
-+	}
-+
- 	return m;
- }
- 
-_AT_@ -1486,7 +1499,7 @@ setlayout(const Arg *arg) {
- 	if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
- 		selmon->sellt ^= 1;
- 	if(arg && arg->v)
--		selmon->lt[selmon->sellt] = (Layout *)arg->v;
-+		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag] = (Layout *)arg->v;
- 	strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
- 	if(selmon->sel)
- 		arrange(selmon);
-_AT_@ -1504,7 +1517,7 @@ setmfact(const Arg *arg) {
- 	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
- 	if(f < 0.1 || f > 0.9)
- 		return;
--	selmon->mfact = f;
-+	selmon->mfact = selmon->mfacts[selmon->curtag] = f;
- 	arrange(selmon);
- }
- 
-_AT_@ -1547,7 +1560,6 @@ setup(void) {
- 	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
- 	if(!dc.font.set)
- 		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
--	/* init bars */
- 	updatebars();
- 	updatestatus();
- 	/* EWMH support per view */
-_AT_@ -1678,12 +1690,25 @@ togglefloating(const Arg *arg) {
- void
- toggletag(const Arg *arg) {
- 	unsigned int newtags;
-+	unsigned int i;
- 
- 	if(!selmon->sel)
- 		return;
- 	newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
- 	if(newtags) {
- 		selmon->sel->tags = newtags;
-+		if(newtags == ~0) {
-+			selmon->prevtag = selmon->curtag;
-+			selmon->curtag = 0;
-+		}
-+		if(!(newtags & 1 << (selmon->curtag - 1))) {
-+			selmon->prevtag = selmon->curtag;
-+			for (i=0; !(newtags & 1 << i); i++);
-+			selmon->curtag = i + 1;
-+		}
-+		selmon->sel->tags = newtags;
-+		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
-+		selmon->mfact = selmon->mfacts[selmon->curtag];
- 		arrange(selmon);
- 	}
- }
-_AT_@ -1950,11 +1975,27 @@ updatewmhints(Client *c) {
- 
- void
- view(const Arg *arg) {
-+	unsigned int i;
-+
- 	if((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
- 		return;
- 	selmon->seltags ^= 1; /* toggle sel tagset */
--	if(arg->ui & TAGMASK)
-+	if(arg->ui & TAGMASK) {
- 		selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
-+		selmon->prevtag = selmon->curtag;
-+		if(arg->ui == ~0)
-+			selmon->curtag = 0;
-+		else {
-+			for (i=0; !(arg->ui & 1 << i); i++);
-+			selmon->curtag = i + 1;
-+		}
-+	} else {
-+		selmon->prevtag= selmon->curtag ^ selmon->prevtag;
-+		selmon->curtag^= selmon->prevtag;
-+		selmon->prevtag= selmon->curtag ^ selmon->prevtag;
-+	}
-+	selmon->lt[selmon->sellt]= selmon->lts[selmon->curtag];
-+	selmon->mfact = selmon->mfacts[selmon->curtag];
- 	arrange(selmon);
- }
- 
diff --git a/dwm.suckless.org/patches/dwm-6.0-xft.diff b/dwm.suckless.org/patches/dwm-6.0-xft.diff
deleted file mode 100644
index fe7fd89..0000000
--- a/dwm.suckless.org/patches/dwm-6.0-xft.diff
+++ /dev/null
_AT_@ -1,259 +0,0 @@
-diff --git a/config.def.h b/config.def.h
-index 77ff358..a355bf0 100644
---- a/config.def.h
-+++ b/config.def.h
-_AT_@ -1,7 +1,7 @@
- /* See LICENSE file for copyright and license details. */
- 
- /* appearance */
--static const char font[]            = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
-+static const char font[]            = "monospace-9";
- static const char normbordercolor[] = "#444444";
- static const char normbgcolor[]     = "#222222";
- static const char normfgcolor[]     = "#bbbbbb";
-diff --git a/config.mk b/config.mk
-index 484554a..a09be79 100644
---- a/config.mk
-+++ b/config.mk
-_AT_@ -15,8 +15,8 @@ XINERAMALIBS = -L${X11LIB} -lXinerama
- XINERAMAFLAGS = -DXINERAMA
- 
- # includes and libs
--INCS = -I. -I/usr/include -I${X11INC}
--LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS}
-+INCS = -I. -I/usr/include -I${X11INC} -I/usr/include/freetype2
-+LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS} -lfontconfig -lXft
- 
- # flags
- CPPFLAGS = -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
-diff --git a/dwm.c b/dwm.c
-index 1d78655..9587e77 100644
---- a/dwm.c
-+++ b/dwm.c
-_AT_@ -39,6 +39,7 @@
- #ifdef XINERAMA
- #include <X11/extensions/Xinerama.h>
- #endif /* XINERAMA */
-+#include <X11/Xft/Xft.h>
- 
- /* macros */
- #define BUTTONMASK              (ButtonPressMask|ButtonReleaseMask)
-_AT_@ -99,16 +100,15 @@ struct Client {
- 
- typedef struct {
- 	int x, y, w, h;
--	unsigned long norm[ColLast];
--	unsigned long sel[ColLast];
-+	XftColor norm[ColLast];
-+	XftColor sel[ColLast];
- 	Drawable drawable;
- 	GC gc;
- 	struct {
- 		int ascent;
- 		int descent;
- 		int height;
--		XFontSet set;
--		XFontStruct *xfont;
-+		XftFont *xfont;
- 	} font;
- } DC; /* draw context */
- 
-_AT_@ -178,15 +178,15 @@ static void die(const char *errstr, ...);
- static Monitor *dirtomon(int dir);
- static void drawbar(Monitor *m);
- static void drawbars(void);
--static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
--static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
-+static void drawsquare(Bool filled, Bool empty, Bool invert, XftColor col[ColLast]);
-+static void drawtext(const char *text, XftColor col[ColLast], Bool invert);
- static void enternotify(XEvent *e);
- static void expose(XEvent *e);
- static void focus(Client *c);
- static void focusin(XEvent *e);
- static void focusmon(const Arg *arg);
- static void focusstack(const Arg *arg);
--static unsigned long getcolor(const char *colstr);
-+static XftColor getcolor(const char *colstr);
- static Bool getrootptr(int *x, int *y);
- static long getstate(Window w);
- static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
-_AT_@ -485,10 +485,6 @@ cleanup(void) {
- 	for(m = mons; m; m = m->next)
- 		while(m->stack)
- 			unmanage(m->stack, False);
--	if(dc.font.set)
--		XFreeFontSet(dpy, dc.font.set);
--	else
--		XFreeFont(dpy, dc.font.xfont);
- 	XUngrabKey(dpy, AnyKey, AnyModifier, root);
- 	XFreePixmap(dpy, dc.drawable);
- 	XFreeGC(dpy, dc.gc);
-_AT_@ -719,7 +715,7 @@ void
- drawbar(Monitor *m) {
- 	int x;
- 	unsigned int i, occ = 0, urg = 0;
--	unsigned long *col;
-+	XftColor *col;
- 	Client *c;
- 
- 	for(c = m->clients; c; c = c->next) {
-_AT_@ -774,10 +770,10 @@ drawbars(void) {
- }
- 
- void
--drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
-+drawsquare(Bool filled, Bool empty, Bool invert, XftColor col[ColLast]) {
- 	int x;
- 
--	XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
-+	XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG].pixel);
- 	x = (dc.font.ascent + dc.font.descent + 2) / 4;
- 	if(filled)
- 		XFillRectangle(dpy, dc.drawable, dc.gc, dc.x+1, dc.y+1, x+1, x+1);
-_AT_@ -786,11 +782,12 @@ drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
- }
- 
- void
--drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
-+drawtext(const char *text, XftColor col[ColLast], Bool invert) {
- 	char buf[256];
- 	int i, x, y, h, len, olen;
-+	XftDraw *d;
- 
--	XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]);
-+	XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG].pixel);
- 	XFillRectangle(dpy, dc.drawable, dc.gc, dc.x, dc.y, dc.w, dc.h);
- 	if(!text)
- 		return;
-_AT_@ -805,11 +802,11 @@ drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
- 	memcpy(buf, text, len);
- 	if(len < olen)
- 		for(i = len; i && i > len - 3; buf[--i] = '.');
--	XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
--	if(dc.font.set)
--		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
--	else
--		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
-+
-+	d = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy, screen), DefaultColormap(dpy,screen));
-+
-+	XftDrawStringUtf8(d, &col[invert ? ColBG : ColFG], dc.font.xfont, x, y, (XftChar8 *) buf, len);
-+	XftDrawDestroy(d);
- }
- 
- void
-_AT_@ -855,7 +852,7 @@ focus(Client *c) {
- 		detachstack(c);
- 		attachstack(c);
- 		grabbuttons(c, True);
--		XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
-+		XSetWindowBorder(dpy, c->win, dc.sel[ColBorder].pixel);
- 		setfocus(c);
- 	}
- 	else
-_AT_@ -926,14 +923,14 @@ getatomprop(Client *c, Atom prop) {
- 	return atom;
- }
- 
--unsigned long
-+XftColor 
- getcolor(const char *colstr) {
--	Colormap cmap = DefaultColormap(dpy, screen);
--	XColor color;
-+	XftColor color;
- 
--	if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
-+	if(!XftColorAllocName(dpy, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen), colstr, &color))
- 		die("error, cannot allocate color '%s'
", colstr);
--	return color.pixel;
-+
-+	return color;
- }
- 
- Bool
-_AT_@ -1034,35 +1031,13 @@ incnmaster(const Arg *arg) {
- 
- void
- initfont(const char *fontstr) {
--	char *def, **missing;
--	int n;
- 
--	dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
--	if(missing) {
--		while(n--)
--			fprintf(stderr, "dwm: missing fontset: %s
", missing[n]);
--		XFreeStringList(missing);
--	}
--	if(dc.font.set) {
--		XFontStruct **xfonts;
--		char **font_names;
--
--		dc.font.ascent = dc.font.descent = 0;
--		XExtentsOfFontSet(dc.font.set);
--		n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
--		while(n--) {
--			dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent);
--			dc.font.descent = MAX(dc.font.descent,(*xfonts)->descent);
--			xfonts++;
--		}
--	}
--	else {
--		if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr))
--		&& !(dc.font.xfont = XLoadQueryFont(dpy, "fixed")))
--			die("error, cannot load font: '%s'
", fontstr);
--		dc.font.ascent = dc.font.xfont->ascent;
--		dc.font.descent = dc.font.xfont->descent;
--	}
-+	if(!(dc.font.xfont = XftFontOpenName(dpy,screen,fontstr))
-+	&& !(dc.font.xfont = XftFontOpenName(dpy,screen,"fixed")))
-+		die("error, cannot load font: '%s'
", fontstr);
-+
-+	dc.font.ascent = dc.font.xfont->ascent;
-+	dc.font.descent = dc.font.xfont->descent;
- 	dc.font.height = dc.font.ascent + dc.font.descent;
- }
- 
-_AT_@ -1144,7 +1119,7 @@ manage(Window w, XWindowAttributes *wa) {
- 
- 	wc.border_width = c->bw;
- 	XConfigureWindow(dpy, w, CWBorderWidth, &wc);
--	XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
-+	XSetWindowBorder(dpy, w, dc.norm[ColBorder].pixel);
- 	configure(c); /* propagates border_width, if size doesn't change */
- 	updatewindowtype(c);
- 	updatesizehints(c);
-_AT_@ -1621,8 +1596,6 @@ setup(void) {
- 	dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));
- 	dc.gc = XCreateGC(dpy, root, 0, NULL);
- 	XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
--	if(!dc.font.set)
--		XSetFont(dpy, dc.gc, dc.font.xfont->fid);
- 	/* init bars */
- 	updatebars();
- 	updatestatus();
-_AT_@ -1692,13 +1665,9 @@ tagmon(const Arg *arg) {
- 
- int
- textnw(const char *text, unsigned int len) {
--	XRectangle r;
--
--	if(dc.font.set) {
--		XmbTextExtents(dc.font.set, text, len, NULL, &r);
--		return r.width;
--	}
--	return XTextWidth(dc.font.xfont, text, len);
-+	XGlyphInfo ext;
-+	XftTextExtentsUtf8(dpy, dc.font.xfont, (XftChar8 *) text, len, &ext);
-+	return ext.xOff;
- }
- 
- void
-_AT_@ -1776,7 +1745,7 @@ unfocus(Client *c, Bool setfocus) {
- 	if(!c)
- 		return;
- 	grabbuttons(c, False);
--	XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]);
-+	XSetWindowBorder(dpy, c->win, dc.norm[ColBorder].pixel);
- 	if(setfocus)
- 		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
- }
diff --git a/dwm.suckless.org/patches/dwm-6.1-fancybarclickable.diff b/dwm.suckless.org/patches/dwm-6.1-fancybarclickable.diff
old mode 100755
new mode 100644
diff --git a/dwm.suckless.org/patches/dwm-6.1-xft-with-fallback-font.diff b/dwm.suckless.org/patches/dwm-6.1-xft-with-fallback-font.diff
deleted file mode 100644
index 0e90117..0000000
--- a/dwm.suckless.org/patches/dwm-6.1-xft-with-fallback-font.diff
+++ /dev/null
_AT_@ -1,657 +0,0 @@
-Author: Eric Pruitt, https://github.com/ericpruitt/
-Description: Xft with fallback font support built on top of the Xft patch
-written by Quentin (http://lists.suckless.org/dev/1311/18279.html). The utf8*
-functions were written by Damian Okrasa for the MIT/X licensed
-(http://opensource.org/licenses/MIT) terminal emulator st
-(http://st.suckless.org/).
-
-With this patch, the "font" variable in config.h is superseded by the "fonts"
-variable which is a priority-ordered list of fonts that should be used to
-render text. Here's an example "fonts" definition:
-
-    static const char *fonts[] = {
-        "Sans:size=10.5",
-        "VL Gothic:size=10.5",
-        "WenQuanYi Micro Hei:size=10.5",
-    };
-
-At least one font must be specified, and a maximum of DRW_FONT_CACHE_SIZE fonts
-can be used.
-
-diff --git a/config.def.h b/config.def.h
-index 875885b..eaae8f3 100644
---- a/config.def.h
-+++ b/config.def.h
-_AT_@ -1,7 +1,12 @@
- /* See LICENSE file for copyright and license details. */
- 
- /* appearance */
--static const char font[]            = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
-+static const char *fonts[] = {
-+    "Sans:size=10.5",
-+    "VL Gothic:size=10.5",
-+    "WenQuanYi Micro Hei:size=10.5",
-+};
-+static const char dmenufont[] = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
- static const char normbordercolor[] = "#444444";
- static const char normbgcolor[]     = "#222222";
- static const char normfgcolor[]     = "#bbbbbb";
-_AT_@ -51,7 +56,7 @@ static const Layout layouts[] = {
- 
- /* commands */
- static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
--static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
-+static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
- static const char *termcmd[]  = { "st", NULL };
- 
- static Key keys[] = {
-diff --git a/config.mk b/config.mk
-index bc3d80e..50b2175 100644
---- a/config.mk
-+++ b/config.mk
-_AT_@ -11,12 +11,12 @@ X11INC = /usr/X11R6/include
- X11LIB = /usr/X11R6/lib
- 
- # Xinerama, comment if you don't want it
--XINERAMALIBS  = -lXinerama
--XINERAMAFLAGS = -DXINERAMA
-+#XINERAMALIBS  = -lXinerama
-+#XINERAMAFLAGS = -DXINERAMA
- 
- # includes and libs
--INCS = -I${X11INC}
--LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS}
-+INCS = -I${X11INC} -I/usr/include/freetype2
-+LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} -lfontconfig -lXft
- 
- # flags
- CPPFLAGS = -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
-diff --git a/drw.c b/drw.c
-index b130405..36cf992 100644
---- a/drw.c
-+++ b/drw.c
-_AT_@ -3,10 +3,59 @@
- #include <stdlib.h>
- #include <string.h>
- #include <X11/Xlib.h>
-+#include <X11/Xft/Xft.h>
- 
- #include "drw.h"
- #include "util.h"
- 
-+#define UTF_INVALID 0xFFFD
-+#define UTF_SIZ 4
-+
-+static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80,    0, 0xC0, 0xE0, 0xF0};
-+static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
-+static const long utfmin[UTF_SIZ + 1] = {       0,    0,  0x80,  0x800,  0x10000};
-+static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
-+
-+static long
-+utf8decodebyte(const char c, size_t *i) {
-+	for(*i = 0; *i < (UTF_SIZ + 1); ++(*i))
-+		if(((unsigned char)c & utfmask[*i]) == utfbyte[*i])
-+			return (unsigned char)c & ~utfmask[*i];
-+	return 0;
-+}
-+
-+static size_t
-+utf8validate(long *u, size_t i) {
-+	if(!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF))
-+		*u = UTF_INVALID;
-+	for(i = 1; *u > utfmax[i]; ++i)
-+		;
-+	return i;
-+}
-+
-+static size_t
-+utf8decode(const char *c, long *u, size_t clen) {
-+	size_t i, j, len, type;
-+	long udecoded;
-+
-+	*u = UTF_INVALID;
-+	if(!clen)
-+		return 0;
-+	udecoded = utf8decodebyte(c[0], &len);
-+	if(!BETWEEN(len, 1, UTF_SIZ))
-+		return 1;
-+	for(i = 1, j = 1; i < clen && j < len; ++i, ++j) {
-+		udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type);
-+		if(type != 0)
-+			return j;
-+	}
-+	if(j < len)
-+		return 0;
-+	*u = udecoded;
-+	utf8validate(u, len);
-+	return len;
-+}
-+
- Drw *
- drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) {
- 	Drw *drw = (Drw *)calloc(1, sizeof(Drw));
-_AT_@ -19,6 +68,7 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h
- 	drw->h = h;
- 	drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen));
- 	drw->gc = XCreateGC(dpy, root, 0, NULL);
-+	drw->fontcount = 0;
- 	XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
- 	return drw;
- }
-_AT_@ -36,56 +86,79 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h) {
- 
- void
- drw_free(Drw *drw) {
-+	size_t i;
-+	for (i = 0; i < drw->fontcount; i++) {
-+		drw_font_free(drw->fonts[i]);
-+	}
- 	XFreePixmap(drw->dpy, drw->drawable);
- 	XFreeGC(drw->dpy, drw->gc);
- 	free(drw);
- }
- 
- Fnt *
--drw_font_create(Display *dpy, const char *fontname) {
-+drw_font_create(Drw *drw, const char *fontname, FcPattern *fontpattern) {
- 	Fnt *font;
--	char *def, **missing;
--	int n;
- 
--	font = (Fnt *)calloc(1, sizeof(Fnt));
--	if(!font)
-+	if (!(fontname || fontpattern))
-+		die("No font specified.
");
-+
-+	if (!(font = (Fnt *)calloc(1, sizeof(Fnt))))
- 		return NULL;
--	font->set = XCreateFontSet(dpy, fontname, &missing, &n, &def);
--	if(missing) {
--		while(n--)
--			fprintf(stderr, "drw: missing fontset: %s
", missing[n]);
--		XFreeStringList(missing);
--	}
--	if(font->set) {
--		XFontStruct **xfonts;
--		char **font_names;
--		XExtentsOfFontSet(font->set);
--		n = XFontsOfFontSet(font->set, &xfonts, &font_names);
--		while(n--) {
--			font->ascent = MAX(font->ascent, (*xfonts)->ascent);
--			font->descent = MAX(font->descent,(*xfonts)->descent);
--			xfonts++;
-+
-+	if (fontname) {
-+		// Using the pattern found at font->xfont->pattern does not yield same
-+		// the same substitution results as using the pattern returned by
-+		// FcNameParse; using the latter results in the desired fallback
-+		// behaviour whereas the former just results in
-+		// missing-character-rectangles being drawn, at least with some fonts.
-+		if (!(font->xfont = XftFontOpenName(drw->dpy, drw->screen, fontname)) ||
-+		    !(font->pattern = FcNameParse((FcChar8 *) fontname))) {
-+			if (font->xfont)
-+				XftFontClose(font->dpy, font->xfont);
-+			fprintf(stderr, "error, cannot load font: '%s'
", fontname);
-+		}
-+	} else if (fontpattern) {
-+		if (!(font->xfont = XftFontOpenPattern(drw->dpy, fontpattern))) {
-+			fprintf(stderr, "error, cannot load font pattern.
");
-+		} else {
-+			font->pattern = NULL;
- 		}
- 	}
--	else {
--		if(!(font->xfont = XLoadQueryFont(dpy, fontname))
--		&& !(font->xfont = XLoadQueryFont(dpy, "fixed")))
--			die("error, cannot load font: '%s'
", fontname);
--		font->ascent = font->xfont->ascent;
--		font->descent = font->xfont->descent;
-+
-+	if (!font->xfont) {
-+		free(font);
-+		return NULL;
- 	}
-+
-+	font->ascent = font->xfont->ascent;
-+	font->descent = font->xfont->descent;
- 	font->h = font->ascent + font->descent;
-+	font->dpy = drw->dpy;
- 	return font;
- }
- 
- void
--drw_font_free(Display *dpy, Fnt *font) {
-+drw_load_fonts(Drw* drw, const char *fonts[], size_t fontcount) {
-+	size_t i;
-+	Fnt *font;
-+	for (i = 0; i < fontcount && drw->fontcount < DRW_FONT_CACHE_SIZE; i++) {
-+		if ((font = drw_font_create(drw, fonts[i], NULL))) {
-+			drw->fonts[drw->fontcount++] = font;
-+		}
-+	}
-+
-+	if (i != fontcount) {
-+		die("Font cache exhausted.
");
-+	}
-+}
-+
-+void
-+drw_font_free(Fnt *font) {
- 	if(!font)
- 		return;
--	if(font->set)
--		XFreeFontSet(dpy, font->set);
--	else
--		XFreeFont(dpy, font->xfont);
-+	if(font->pattern)
-+		FcPatternDestroy(font->pattern);
-+	XftFontClose(font->dpy, font->xfont);
- 	free(font);
- }
- 
-_AT_@ -93,7 +166,7 @@ Clr *
- drw_clr_create(Drw *drw, const char *clrname) {
- 	Clr *clr;
- 	Colormap cmap;
--	XColor color;
-+	Visual *vis;
- 
- 	if(!drw)
- 		return NULL;
-_AT_@ -101,9 +174,10 @@ drw_clr_create(Drw *drw, const char *clrname) {
- 	if(!clr)
- 		return NULL;
- 	cmap = DefaultColormap(drw->dpy, drw->screen);
--	if(!XAllocNamedColor(drw->dpy, cmap, clrname, &color, &color))
-+	vis = DefaultVisual(drw->dpy, drw->screen);
-+	if(!XftColorAllocName(drw->dpy, vis, cmap, clrname, &clr->rgb))
- 		die("error, cannot allocate color '%s'
", clrname);
--	clr->rgb = color.pixel;
-+	clr->pix = clr->rgb.pixel;
- 	return clr;
- }
- 
-_AT_@ -114,14 +188,8 @@ drw_clr_free(Clr *clr) {
- }
- 
- void
--drw_setfont(Drw *drw, Fnt *font) {
--	if(drw)
--		drw->font = font;
--}
--
--void
- drw_setscheme(Drw *drw, ClrScheme *scheme) {
--	if(drw && scheme) 
-+	if(drw && scheme)
- 		drw->scheme = scheme;
- }
- 
-_AT_@ -129,46 +197,158 @@ void
- drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int empty, int invert) {
- 	int dx;
- 
--	if(!drw || !drw->font || !drw->scheme)
-+	if(!drw || !drw->fontcount || !drw->scheme)
- 		return;
--	XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme->bg->rgb : drw->scheme->fg->rgb);
--	dx = (drw->font->ascent + drw->font->descent + 2) / 4;
-+	XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme->bg->pix : drw->scheme->fg->pix);
-+	dx = (drw->fonts[0]->ascent + drw->fonts[0]->descent + 2) / 4;
- 	if(filled)
- 		XFillRectangle(drw->dpy, drw->drawable, drw->gc, x+1, y+1, dx+1, dx+1);
- 	else if(empty)
- 		XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x+1, y+1, dx, dx);
- }
- 
--void
-+int
- drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, const char *text, int invert) {
--	char buf[256];
--	int i, tx, ty, th, len, olen;
-+	char buf[1024];
-+	int tx, ty, th;
- 	Extnts tex;
-+	Colormap cmap;
-+	Visual *vis;
-+	XftDraw *d;
-+	Fnt *curfont, *nextfont;
-+	size_t i, len;
-+	int utf8strlen, utf8charlen, render;
-+	long utf8codepoint = 0;
-+	const char *utf8str;
-+	FcCharSet *fccharset;
-+	FcPattern *fcpattern;
-+	FcPattern *match;
-+	XftResult result;
-+	int charexists = 0;
- 
--	if(!drw || !drw->scheme)
--		return;
--	XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme->fg->rgb : drw->scheme->bg->rgb);
--	XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
--	if(!text || !drw->font)
--		return;
--	olen = strlen(text);
--	drw_font_getexts(drw->font, text, olen, &tex);
--	th = drw->font->ascent + drw->font->descent;
--	ty = y + (h / 2) - (th / 2) + drw->font->ascent;
--	tx = x + (h / 2);
--	/* shorten text if necessary */
--	for(len = MIN(olen, sizeof buf); len && (tex.w > w - tex.h || w < tex.h); len--)
--		drw_font_getexts(drw->font, text, len, &tex);
--	if(!len)
--		return;
--	memcpy(buf, text, len);
--	if(len < olen)
--		for(i = len; i && i > len - 3; buf[--i] = '.');
--	XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme->bg->rgb : drw->scheme->fg->rgb);
--	if(drw->font->set)
--		XmbDrawString(drw->dpy, drw->drawable, drw->font->set, drw->gc, tx, ty, buf, len);
--	else
--		XDrawString(drw->dpy, drw->drawable, drw->gc, tx, ty, buf, len);
-+	if (!(render = x || y || w || h)) {
-+		w = ~w;
-+	}
-+
-+	if (!drw || !drw->scheme) {
-+		return 0;
-+	} else if (render) {
-+		XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme->fg->pix : drw->scheme->bg->pix);
-+		XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
-+	}
-+
-+	if (!text || !drw->fontcount) {
-+		return 0;
-+	} else if (render) {
-+		cmap = DefaultColormap(drw->dpy, drw->screen);
-+		vis = DefaultVisual(drw->dpy, drw->screen);
-+		d = XftDrawCreate(drw->dpy, drw->drawable, vis, cmap);
-+	}
-+
-+	curfont = drw->fonts[0];
-+	while (1) {
-+		utf8strlen = 0;
-+		utf8str = text;
-+		nextfont = NULL;
-+		while (*text) {
-+			utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ);
-+			for (i = 0; i < drw->fontcount; i++) {
-+				charexists = charexists || XftCharExists(drw->dpy, drw->fonts[i]->xfont, utf8codepoint);
-+				if (charexists) {
-+					if (drw->fonts[i] == curfont) {
-+						utf8strlen += utf8charlen;
-+						text += utf8charlen;
-+					} else {
-+						nextfont = drw->fonts[i];
-+					}
-+					break;
-+				}
-+			}
-+
-+			if (!charexists || (nextfont && nextfont != curfont)) {
-+				break;
-+			} else {
-+				charexists = 0;
-+			}
-+		}
-+
-+		if (utf8strlen) {
-+			drw_font_getexts(curfont, utf8str, utf8strlen, &tex);
-+			/* shorten text if necessary */
-+			for(len = MIN(utf8strlen, (sizeof buf) - 1); len && (tex.w > w - drw->fonts[0]->h || w < drw->fonts[0]->h); len--)
-+				drw_font_getexts(curfont, utf8str, len, &tex);
-+
-+			if (len) {
-+				memcpy(buf, utf8str, len);
-+				buf[len] = '
Received on Tue Nov 10 2015 - 08:31:59 CET

This archive was generated by hypermail 2.3.0 : Tue Nov 10 2015 - 08:36:12 CET