commit c26279b4c56d6c8dfdb9dc93a5731cb03d4db540
Author: Ivan Tham <[email protected]>
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
@@ -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
@@ -12,7 +12,7 @@ area instead of always becoming the new master. It's 
basically an
        |                 |       |
        |                 |   P   |
        |                 |       |
-       |        N        +-------|
+       |        N        +-------+
        |                 |       |
        |                 |       |
        |                 |       |
@@ -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
@@ -1,63 +0,0 @@
-Author: Jan Christoph Ebersbach <[email protected]>
-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
-@@ -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);
-@@ -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;
-@@ -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);
-@@ -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);
-@@ -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
@@ -1,181 +0,0 @@
-Author: Jan Christoph Ebersbach <[email protected]>
-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
-@@ -124,6 +124,7 @@
-       void (*arrange)(Monitor *);
- } Layout;
- 
-+typedef struct Pertag Pertag;
- struct Monitor {
-       char ltsymbol[16];
-       float mfact;
-@@ -143,6 +144,7 @@
-       Monitor *next;
-       Window barwin;
-       const Layout *lt[2];
-+      Pertag *pertag;
- };
- 
- typedef struct {
-@@ -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]; };
- 
-@@ -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));
-@@ -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;
- }
- 
-@@ -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);
- }
- 
-@@ -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);
-@@ -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);
- }
- 
-@@ -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);
-@@ -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);
-       }
-@@ -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
@@ -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
-@@ -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
@@ -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
-@@ -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);
-@@ -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
-@@ -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
@@ -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
-@@ -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);
-@@ -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;
-@@ -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
@@ -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
-@@ -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);
-@@ -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;
-@@ -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
@@ -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
-@@ -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
-@@ -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
@@ -1,180 +0,0 @@
-diff --git a/dwm.c b/dwm.c
---- a/dwm.c
-+++ b/dwm.c
-@@ -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;
-@@ -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]; };
- 
-@@ -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));
-@@ -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;
- }
- 
-@@ -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);
-@@ -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);
- }
- 
-@@ -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 */
-@@ -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);
-@@ -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);
-       }
- }
-@@ -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
@@ -1,165 +0,0 @@
-diff --git a/dwm.c b/dwm.c
---- a/dwm.c
-+++ b/dwm.c
-@@ -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;
-@@ -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]; };
- 
-@@ -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));
-@@ -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;
- }
- 
-@@ -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);
-@@ -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);
- }
- 
-@@ -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 */
-@@ -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);
-       }
- }
-@@ -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
@@ -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
-@@ -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
-@@ -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
-@@ -39,6 +39,7 @@
- #ifdef XINERAMA
- #include <X11/extensions/Xinerama.h>
- #endif /* XINERAMA */
-+#include <X11/Xft/Xft.h>
- 
- /* macros */
- #define BUTTONMASK              (ButtonPressMask|ButtonReleaseMask)
-@@ -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 */
- 
-@@ -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);
-@@ -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);
-@@ -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) {
-@@ -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);
-@@ -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;
-@@ -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
-@@ -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
-@@ -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
-@@ -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;
- }
- 
-@@ -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);
-@@ -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();
-@@ -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
-@@ -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
@@ -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
-@@ -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";
-@@ -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
-@@ -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
-@@ -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));
-@@ -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;
- }
-@@ -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);
- }
- 
-@@ -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;
-@@ -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;
- }
- 
-@@ -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;
- }
- 
-@@ -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] = '

Reply via email to