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] = '