--
- typedef struct {
- const char *class;
- const char *instance;
-_AT_@ -278,6 +258,31 @@ static Window root;
- /* configuration, allows nested code to access above variables */
- #include "config.h"
-
-+struct Monitor {
-+ char ltsymbol[16];
-+ float mfact;
-+ int num;
-+ int by; /* bar geometry */
-+ int mx, my, mw, mh; /* screen size */
-+ int wx, wy, ww, wh; /* window area */
-+ unsigned int seltags;
-+ unsigned int sellt;
-+ unsigned int tagset[2];
-+ Bool showbar;
-+ Bool topbar;
-+ Client *clients;
-+ Client *sel;
-+ Client *stack;
-+ Monitor *next;
-+ Window barwin;
-+ const Layout *lt[2];
-+ int curtag;
-+ int prevtag;
-+ const Layout *lts[LENGTH(tags) + 1];
-+ double mfacts[LENGTH(tags) + 1];
-+ Bool showbars[LENGTH(tags) + 1];
-+};
-+
- /* compile-time check if all tags fit into an unsigned int bit array. */
- struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
-
-_AT_@ -609,6 +614,7 @@ configurerequest(XEvent *e) {
- Monitor *
- createmon(void) {
- Monitor *m;
-+ unsigned int i;
-
- if(!(m = (Monitor *)calloc(1, sizeof(Monitor))))
- die("fatal: could not malloc() %u bytes
", sizeof(Monitor));
-_AT_@ -619,6 +625,15 @@ createmon(void) {
- m->lt[0] = &layouts[0];
- m->lt[1] = &layouts[1 % LENGTH(layouts)];
- strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
-+
-+ /* pertag init */
-+ m->curtag = m->prevtag = 1;
-+ for(i=0; i < LENGTH(tags) + 1 ; i++) {
-+ m->mfacts[i] = mfact;
-+ m->lts[i] = &layouts[0];
-+ m->showbars[i] = m->showbar;
-+ }
-+
- return m;
- }
-
-_AT_@ -1486,7 +1501,7 @@ setlayout(const Arg *arg) {
- if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
- selmon->sellt ^= 1;
- if(arg && arg->v)
-- selmon->lt[selmon->sellt] = (Layout *)arg->v;
-+ selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag] = (Layout *)arg->v;
- strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
- if(selmon->sel)
- arrange(selmon);
-_AT_@ -1504,7 +1519,7 @@ setmfact(const Arg *arg) {
- f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
- if(f < 0.1 || f > 0.9)
- return;
-- selmon->mfact = f;
-+ selmon->mfact = selmon->mfacts[selmon->curtag] = f;
- arrange(selmon);
- }
-
-_AT_@ -1547,7 +1562,6 @@ setup(void) {
- XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
- if(!dc.font.set)
- XSetFont(dpy, dc.gc, dc.font.xfont->fid);
-- /* init bars */
- updatebars();
- updatestatus();
- /* EWMH support per view */
-_AT_@ -1658,7 +1672,7 @@ tile(Monitor *m) {
-
- void
- togglebar(const Arg *arg) {
-- selmon->showbar = !selmon->showbar;
-+ selmon->showbar = selmon->showbars[selmon->curtag] = !selmon->showbar;
- updatebarpos(selmon);
- XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
- arrange(selmon);
-_AT_@ -1678,12 +1692,27 @@ togglefloating(const Arg *arg) {
- void
- toggletag(const Arg *arg) {
- unsigned int newtags;
-+ unsigned int i;
-
- if(!selmon->sel)
- return;
- newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
- if(newtags) {
- selmon->sel->tags = newtags;
-+ if(newtags == ~0) {
-+ selmon->prevtag = selmon->curtag;
-+ selmon->curtag = 0;
-+ }
-+ if(!(newtags & 1 << (selmon->curtag - 1))) {
-+ selmon->prevtag = selmon->curtag;
-+ for (i=0; !(newtags & 1 << i); i++);
-+ selmon->curtag = i + 1;
-+ }
-+ selmon->sel->tags = newtags;
-+ selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
-+ selmon->mfact = selmon->mfacts[selmon->curtag];
-+ if (selmon->showbar != selmon->showbars[selmon->curtag])
-+ togglebar(NULL);
- arrange(selmon);
- }
- }
-_AT_@ -1950,11 +1979,29 @@ updatewmhints(Client *c) {
-
- void
- view(const Arg *arg) {
-+ unsigned int i;
-+
- if((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
- return;
- selmon->seltags ^= 1; /* toggle sel tagset */
-- if(arg->ui & TAGMASK)
-+ if(arg->ui & TAGMASK) {
- selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
-+ selmon->prevtag = selmon->curtag;
-+ if(arg->ui == ~0)
-+ selmon->curtag = 0;
-+ else {
-+ for (i=0; !(arg->ui & 1 << i); i++);
-+ selmon->curtag = i + 1;
-+ }
-+ } else {
-+ selmon->prevtag= selmon->curtag ^ selmon->prevtag;
-+ selmon->curtag^= selmon->prevtag;
-+ selmon->prevtag= selmon->curtag ^ selmon->prevtag;
-+ }
-+ selmon->lt[selmon->sellt]= selmon->lts[selmon->curtag];
-+ selmon->mfact = selmon->mfacts[selmon->curtag];
-+ if(selmon->showbar != selmon->showbars[selmon->curtag])
-+ togglebar(NULL);
- arrange(selmon);
- }
-
diff --git a/dwm.suckless.org/patches/dwm-5.8.2-pertag_without_bar.diff b/dwm.suckless.org/patches/dwm-5.8.2-pertag_without_bar.diff
deleted file mode 100644
index d7a30ec..0000000
--- a/dwm.suckless.org/patches/dwm-5.8.2-pertag_without_bar.diff
+++ /dev/null
_AT_@ -1,165 +0,0 @@
-diff --git a/dwm.c b/dwm.c
---- a/dwm.c
-+++ b/dwm.c
-_AT_@ -122,26 +122,6 @@ typedef struct {
- void (*arrange)(Monitor *);
- } Layout;
-
--struct Monitor {
-- char ltsymbol[16];
-- float mfact;
-- int num;
-- int by; /* bar geometry */
-- int mx, my, mw, mh; /* screen size */
-- int wx, wy, ww, wh; /* window area */
-- unsigned int seltags;
-- unsigned int sellt;
-- unsigned int tagset[2];
-- Bool showbar;
-- Bool topbar;
-- Client *clients;
-- Client *sel;
-- Client *stack;
-- Monitor *next;
-- Window barwin;
-- const Layout *lt[2];
--};
--
- typedef struct {
- const char *class;
- const char *instance;
-_AT_@ -278,6 +258,30 @@ static Window root;
- /* configuration, allows nested code to access above variables */
- #include "config.h"
-
-+struct Monitor {
-+ char ltsymbol[16];
-+ float mfact;
-+ int num;
-+ int by; /* bar geometry */
-+ int mx, my, mw, mh; /* screen size */
-+ int wx, wy, ww, wh; /* window area */
-+ unsigned int seltags;
-+ unsigned int sellt;
-+ unsigned int tagset[2];
-+ Bool showbar;
-+ Bool topbar;
-+ Client *clients;
-+ Client *sel;
-+ Client *stack;
-+ Monitor *next;
-+ Window barwin;
-+ const Layout *lt[2];
-+ int curtag;
-+ int prevtag;
-+ const Layout *lts[LENGTH(tags) + 1];
-+ double mfacts[LENGTH(tags) + 1];
-+};
-+
- /* compile-time check if all tags fit into an unsigned int bit array. */
- struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
-
-_AT_@ -609,6 +613,7 @@ configurerequest(XEvent *e) {
- Monitor *
- createmon(void) {
- Monitor *m;
-+ unsigned int i;
-
- if(!(m = (Monitor *)calloc(1, sizeof(Monitor))))
- die("fatal: could not malloc() %u bytes
", sizeof(Monitor));
-_AT_@ -619,6 +624,14 @@ createmon(void) {
- m->lt[0] = &layouts[0];
- m->lt[1] = &layouts[1 % LENGTH(layouts)];
- strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
-+
-+ /* pertag init */
-+ m->curtag = m->prevtag = 1;
-+ for(i=0; i < LENGTH(tags) + 1 ; i++) {
-+ m->mfacts[i] = mfact;
-+ m->lts[i] = &layouts[0];
-+ }
-+
- return m;
- }
-
-_AT_@ -1486,7 +1499,7 @@ setlayout(const Arg *arg) {
- if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
- selmon->sellt ^= 1;
- if(arg && arg->v)
-- selmon->lt[selmon->sellt] = (Layout *)arg->v;
-+ selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag] = (Layout *)arg->v;
- strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
- if(selmon->sel)
- arrange(selmon);
-_AT_@ -1504,7 +1517,7 @@ setmfact(const Arg *arg) {
- f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
- if(f < 0.1 || f > 0.9)
- return;
-- selmon->mfact = f;
-+ selmon->mfact = selmon->mfacts[selmon->curtag] = f;
- arrange(selmon);
- }
-
-_AT_@ -1547,7 +1560,6 @@ setup(void) {
- XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
- if(!dc.font.set)
- XSetFont(dpy, dc.gc, dc.font.xfont->fid);
-- /* init bars */
- updatebars();
- updatestatus();
- /* EWMH support per view */
-_AT_@ -1678,12 +1690,25 @@ togglefloating(const Arg *arg) {
- void
- toggletag(const Arg *arg) {
- unsigned int newtags;
-+ unsigned int i;
-
- if(!selmon->sel)
- return;
- newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
- if(newtags) {
- selmon->sel->tags = newtags;
-+ if(newtags == ~0) {
-+ selmon->prevtag = selmon->curtag;
-+ selmon->curtag = 0;
-+ }
-+ if(!(newtags & 1 << (selmon->curtag - 1))) {
-+ selmon->prevtag = selmon->curtag;
-+ for (i=0; !(newtags & 1 << i); i++);
-+ selmon->curtag = i + 1;
-+ }
-+ selmon->sel->tags = newtags;
-+ selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
-+ selmon->mfact = selmon->mfacts[selmon->curtag];
- arrange(selmon);
- }
- }
-_AT_@ -1950,11 +1975,27 @@ updatewmhints(Client *c) {
-
- void
- view(const Arg *arg) {
-+ unsigned int i;
-+
- if((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
- return;
- selmon->seltags ^= 1; /* toggle sel tagset */
-- if(arg->ui & TAGMASK)
-+ if(arg->ui & TAGMASK) {
- selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
-+ selmon->prevtag = selmon->curtag;
-+ if(arg->ui == ~0)
-+ selmon->curtag = 0;
-+ else {
-+ for (i=0; !(arg->ui & 1 << i); i++);
-+ selmon->curtag = i + 1;
-+ }
-+ } else {
-+ selmon->prevtag= selmon->curtag ^ selmon->prevtag;
-+ selmon->curtag^= selmon->prevtag;
-+ selmon->prevtag= selmon->curtag ^ selmon->prevtag;
-+ }
-+ selmon->lt[selmon->sellt]= selmon->lts[selmon->curtag];
-+ selmon->mfact = selmon->mfacts[selmon->curtag];
- arrange(selmon);
- }
-
diff --git a/dwm.suckless.org/patches/dwm-6.0-xft.diff b/dwm.suckless.org/patches/dwm-6.0-xft.diff
deleted file mode 100644
index fe7fd89..0000000
--- a/dwm.suckless.org/patches/dwm-6.0-xft.diff
+++ /dev/null
_AT_@ -1,259 +0,0 @@
-diff --git a/config.def.h b/config.def.h
-index 77ff358..a355bf0 100644
---- a/config.def.h
-+++ b/config.def.h
-_AT_@ -1,7 +1,7 @@
- /* See LICENSE file for copyright and license details. */
-
- /* appearance */
--static const char font[] = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
-+static const char font[] = "monospace-9";
- static const char normbordercolor[] = "#444444";
- static const char normbgcolor[] = "#222222";
- static const char normfgcolor[] = "#bbbbbb";
-diff --git a/config.mk b/config.mk
-index 484554a..a09be79 100644
---- a/config.mk
-+++ b/config.mk
-_AT_@ -15,8 +15,8 @@ XINERAMALIBS = -L${X11LIB} -lXinerama
- XINERAMAFLAGS = -DXINERAMA
-
- # includes and libs
--INCS = -I. -I/usr/include -I${X11INC}
--LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS}
-+INCS = -I. -I/usr/include -I${X11INC} -I/usr/include/freetype2
-+LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS} -lfontconfig -lXft
-
- # flags
- CPPFLAGS = -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
-diff --git a/dwm.c b/dwm.c
-index 1d78655..9587e77 100644
---- a/dwm.c
-+++ b/dwm.c
-_AT_@ -39,6 +39,7 @@
- #ifdef XINERAMA
- #include <X11/extensions/Xinerama.h>
- #endif /* XINERAMA */
-+#include <X11/Xft/Xft.h>
-
- /* macros */
- #define BUTTONMASK (ButtonPressMask|ButtonReleaseMask)
-_AT_@ -99,16 +100,15 @@ struct Client {
-
- typedef struct {
- int x, y, w, h;
-- unsigned long norm[ColLast];
-- unsigned long sel[ColLast];
-+ XftColor norm[ColLast];
-+ XftColor sel[ColLast];
- Drawable drawable;
- GC gc;
- struct {
- int ascent;
- int descent;
- int height;
-- XFontSet set;
-- XFontStruct *xfont;
-+ XftFont *xfont;
- } font;
- } DC; /* draw context */
-
-_AT_@ -178,15 +178,15 @@ static void die(const char *errstr, ...);
- static Monitor *dirtomon(int dir);
- static void drawbar(Monitor *m);
- static void drawbars(void);
--static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
--static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
-+static void drawsquare(Bool filled, Bool empty, Bool invert, XftColor col[ColLast]);
-+static void drawtext(const char *text, XftColor col[ColLast], Bool invert);
- static void enternotify(XEvent *e);
- static void expose(XEvent *e);
- static void focus(Client *c);
- static void focusin(XEvent *e);
- static void focusmon(const Arg *arg);
- static void focusstack(const Arg *arg);
--static unsigned long getcolor(const char *colstr);
-+static XftColor getcolor(const char *colstr);
- static Bool getrootptr(int *x, int *y);
- static long getstate(Window w);
- static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
-_AT_@ -485,10 +485,6 @@ cleanup(void) {
- for(m = mons; m; m = m->next)
- while(m->stack)
- unmanage(m->stack, False);
-- if(dc.font.set)
-- XFreeFontSet(dpy, dc.font.set);
-- else
-- XFreeFont(dpy, dc.font.xfont);
- XUngrabKey(dpy, AnyKey, AnyModifier, root);
- XFreePixmap(dpy, dc.drawable);
- XFreeGC(dpy, dc.gc);
-_AT_@ -719,7 +715,7 @@ void
- drawbar(Monitor *m) {
- int x;
- unsigned int i, occ = 0, urg = 0;
-- unsigned long *col;
-+ XftColor *col;
- Client *c;
-
- for(c = m->clients; c; c = c->next) {
-_AT_@ -774,10 +770,10 @@ drawbars(void) {
- }
-
- void
--drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
-+drawsquare(Bool filled, Bool empty, Bool invert, XftColor col[ColLast]) {
- int x;
-
-- XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
-+ XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG].pixel);
- x = (dc.font.ascent + dc.font.descent + 2) / 4;
- if(filled)
- XFillRectangle(dpy, dc.drawable, dc.gc, dc.x+1, dc.y+1, x+1, x+1);
-_AT_@ -786,11 +782,12 @@ drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
- }
-
- void
--drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
-+drawtext(const char *text, XftColor col[ColLast], Bool invert) {
- char buf[256];
- int i, x, y, h, len, olen;
-+ XftDraw *d;
-
-- XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]);
-+ XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG].pixel);
- XFillRectangle(dpy, dc.drawable, dc.gc, dc.x, dc.y, dc.w, dc.h);
- if(!text)
- return;
-_AT_@ -805,11 +802,11 @@ drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
- memcpy(buf, text, len);
- if(len < olen)
- for(i = len; i && i > len - 3; buf[--i] = '.');
-- XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
-- if(dc.font.set)
-- XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
-- else
-- XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
-+
-+ d = XftDrawCreate(dpy, dc.drawable, DefaultVisual(dpy, screen), DefaultColormap(dpy,screen));
-+
-+ XftDrawStringUtf8(d, &col[invert ? ColBG : ColFG], dc.font.xfont, x, y, (XftChar8 *) buf, len);
-+ XftDrawDestroy(d);
- }
-
- void
-_AT_@ -855,7 +852,7 @@ focus(Client *c) {
- detachstack(c);
- attachstack(c);
- grabbuttons(c, True);
-- XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
-+ XSetWindowBorder(dpy, c->win, dc.sel[ColBorder].pixel);
- setfocus(c);
- }
- else
-_AT_@ -926,14 +923,14 @@ getatomprop(Client *c, Atom prop) {
- return atom;
- }
-
--unsigned long
-+XftColor
- getcolor(const char *colstr) {
-- Colormap cmap = DefaultColormap(dpy, screen);
-- XColor color;
-+ XftColor color;
-
-- if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
-+ if(!XftColorAllocName(dpy, DefaultVisual(dpy, screen), DefaultColormap(dpy, screen), colstr, &color))
- die("error, cannot allocate color '%s'
", colstr);
-- return color.pixel;
-+
-+ return color;
- }
-
- Bool
-_AT_@ -1034,35 +1031,13 @@ incnmaster(const Arg *arg) {
-
- void
- initfont(const char *fontstr) {
-- char *def, **missing;
-- int n;
-
-- dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
-- if(missing) {
-- while(n--)
-- fprintf(stderr, "dwm: missing fontset: %s
", missing[n]);
-- XFreeStringList(missing);
-- }
-- if(dc.font.set) {
-- XFontStruct **xfonts;
-- char **font_names;
--
-- dc.font.ascent = dc.font.descent = 0;
-- XExtentsOfFontSet(dc.font.set);
-- n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
-- while(n--) {
-- dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent);
-- dc.font.descent = MAX(dc.font.descent,(*xfonts)->descent);
-- xfonts++;
-- }
-- }
-- else {
-- if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr))
-- && !(dc.font.xfont = XLoadQueryFont(dpy, "fixed")))
-- die("error, cannot load font: '%s'
", fontstr);
-- dc.font.ascent = dc.font.xfont->ascent;
-- dc.font.descent = dc.font.xfont->descent;
-- }
-+ if(!(dc.font.xfont = XftFontOpenName(dpy,screen,fontstr))
-+ && !(dc.font.xfont = XftFontOpenName(dpy,screen,"fixed")))
-+ die("error, cannot load font: '%s'
", fontstr);
-+
-+ dc.font.ascent = dc.font.xfont->ascent;
-+ dc.font.descent = dc.font.xfont->descent;
- dc.font.height = dc.font.ascent + dc.font.descent;
- }
-
-_AT_@ -1144,7 +1119,7 @@ manage(Window w, XWindowAttributes *wa) {
-
- wc.border_width = c->bw;
- XConfigureWindow(dpy, w, CWBorderWidth, &wc);
-- XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
-+ XSetWindowBorder(dpy, w, dc.norm[ColBorder].pixel);
- configure(c); /* propagates border_width, if size doesn't change */
- updatewindowtype(c);
- updatesizehints(c);
-_AT_@ -1621,8 +1596,6 @@ setup(void) {
- dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen));
- dc.gc = XCreateGC(dpy, root, 0, NULL);
- XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
-- if(!dc.font.set)
-- XSetFont(dpy, dc.gc, dc.font.xfont->fid);
- /* init bars */
- updatebars();
- updatestatus();
-_AT_@ -1692,13 +1665,9 @@ tagmon(const Arg *arg) {
-
- int
- textnw(const char *text, unsigned int len) {
-- XRectangle r;
--
-- if(dc.font.set) {
-- XmbTextExtents(dc.font.set, text, len, NULL, &r);
-- return r.width;
-- }
-- return XTextWidth(dc.font.xfont, text, len);
-+ XGlyphInfo ext;
-+ XftTextExtentsUtf8(dpy, dc.font.xfont, (XftChar8 *) text, len, &ext);
-+ return ext.xOff;
- }
-
- void
-_AT_@ -1776,7 +1745,7 @@ unfocus(Client *c, Bool setfocus) {
- if(!c)
- return;
- grabbuttons(c, False);
-- XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]);
-+ XSetWindowBorder(dpy, c->win, dc.norm[ColBorder].pixel);
- if(setfocus)
- XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
- }
diff --git a/dwm.suckless.org/patches/dwm-6.1-fancybarclickable.diff b/dwm.suckless.org/patches/dwm-6.1-fancybarclickable.diff
old mode 100755
new mode 100644
diff --git a/dwm.suckless.org/patches/dwm-6.1-xft-with-fallback-font.diff b/dwm.suckless.org/patches/dwm-6.1-xft-with-fallback-font.diff
deleted file mode 100644
index 0e90117..0000000
--- a/dwm.suckless.org/patches/dwm-6.1-xft-with-fallback-font.diff
+++ /dev/null
_AT_@ -1,657 +0,0 @@
-Author: Eric Pruitt, https://github.com/ericpruitt/
-Description: Xft with fallback font support built on top of the Xft patch
-written by Quentin (http://lists.suckless.org/dev/1311/18279.html). The utf8*
-functions were written by Damian Okrasa for the MIT/X licensed
-(http://opensource.org/licenses/MIT) terminal emulator st
-(http://st.suckless.org/).
-
-With this patch, the "font" variable in config.h is superseded by the "fonts"
-variable which is a priority-ordered list of fonts that should be used to
-render text. Here's an example "fonts" definition:
-
- static const char *fonts[] = {
- "Sans:size=10.5",
- "VL Gothic:size=10.5",
- "WenQuanYi Micro Hei:size=10.5",
- };
-
-At least one font must be specified, and a maximum of DRW_FONT_CACHE_SIZE fonts
-can be used.
-
-diff --git a/config.def.h b/config.def.h
-index 875885b..eaae8f3 100644
---- a/config.def.h
-+++ b/config.def.h
-_AT_@ -1,7 +1,12 @@
- /* See LICENSE file for copyright and license details. */
-
- /* appearance */
--static const char font[] = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
-+static const char *fonts[] = {
-+ "Sans:size=10.5",
-+ "VL Gothic:size=10.5",
-+ "WenQuanYi Micro Hei:size=10.5",
-+};
-+static const char dmenufont[] = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
- static const char normbordercolor[] = "#444444";
- static const char normbgcolor[] = "#222222";
- static const char normfgcolor[] = "#bbbbbb";
-_AT_@ -51,7 +56,7 @@ static const Layout layouts[] = {
-
- /* commands */
- static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
--static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
-+static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
- static const char *termcmd[] = { "st", NULL };
-
- static Key keys[] = {
-diff --git a/config.mk b/config.mk
-index bc3d80e..50b2175 100644
---- a/config.mk
-+++ b/config.mk
-_AT_@ -11,12 +11,12 @@ X11INC = /usr/X11R6/include
- X11LIB = /usr/X11R6/lib
-
- # Xinerama, comment if you don't want it
--XINERAMALIBS = -lXinerama
--XINERAMAFLAGS = -DXINERAMA
-+#XINERAMALIBS = -lXinerama
-+#XINERAMAFLAGS = -DXINERAMA
-
- # includes and libs
--INCS = -I${X11INC}
--LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS}
-+INCS = -I${X11INC} -I/usr/include/freetype2
-+LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} -lfontconfig -lXft
-
- # flags
- CPPFLAGS = -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
-diff --git a/drw.c b/drw.c
-index b130405..36cf992 100644
---- a/drw.c
-+++ b/drw.c
-_AT_@ -3,10 +3,59 @@
- #include <stdlib.h>
- #include <string.h>
- #include <X11/Xlib.h>
-+#include <X11/Xft/Xft.h>
-
- #include "drw.h"
- #include "util.h"
-
-+#define UTF_INVALID 0xFFFD
-+#define UTF_SIZ 4
-+
-+static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0};
-+static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
-+static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000};
-+static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
-+
-+static long
-+utf8decodebyte(const char c, size_t *i) {
-+ for(*i = 0; *i < (UTF_SIZ + 1); ++(*i))
-+ if(((unsigned char)c & utfmask[*i]) == utfbyte[*i])
-+ return (unsigned char)c & ~utfmask[*i];
-+ return 0;
-+}
-+
-+static size_t
-+utf8validate(long *u, size_t i) {
-+ if(!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF))
-+ *u = UTF_INVALID;
-+ for(i = 1; *u > utfmax[i]; ++i)
-+ ;
-+ return i;
-+}
-+
-+static size_t
-+utf8decode(const char *c, long *u, size_t clen) {
-+ size_t i, j, len, type;
-+ long udecoded;
-+
-+ *u = UTF_INVALID;
-+ if(!clen)
-+ return 0;
-+ udecoded = utf8decodebyte(c[0], &len);
-+ if(!BETWEEN(len, 1, UTF_SIZ))
-+ return 1;
-+ for(i = 1, j = 1; i < clen && j < len; ++i, ++j) {
-+ udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type);
-+ if(type != 0)
-+ return j;
-+ }
-+ if(j < len)
-+ return 0;
-+ *u = udecoded;
-+ utf8validate(u, len);
-+ return len;
-+}
-+
- Drw *
- drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) {
- Drw *drw = (Drw *)calloc(1, sizeof(Drw));
-_AT_@ -19,6 +68,7 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h
- drw->h = h;
- drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen));
- drw->gc = XCreateGC(dpy, root, 0, NULL);
-+ drw->fontcount = 0;
- XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
- return drw;
- }
-_AT_@ -36,56 +86,79 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h) {
-
- void
- drw_free(Drw *drw) {
-+ size_t i;
-+ for (i = 0; i < drw->fontcount; i++) {
-+ drw_font_free(drw->fonts[i]);
-+ }
- XFreePixmap(drw->dpy, drw->drawable);
- XFreeGC(drw->dpy, drw->gc);
- free(drw);
- }
-
- Fnt *
--drw_font_create(Display *dpy, const char *fontname) {
-+drw_font_create(Drw *drw, const char *fontname, FcPattern *fontpattern) {
- Fnt *font;
-- char *def, **missing;
-- int n;
-
-- font = (Fnt *)calloc(1, sizeof(Fnt));
-- if(!font)
-+ if (!(fontname || fontpattern))
-+ die("No font specified.
");
-+
-+ if (!(font = (Fnt *)calloc(1, sizeof(Fnt))))
- return NULL;
-- font->set = XCreateFontSet(dpy, fontname, &missing, &n, &def);
-- if(missing) {
-- while(n--)
-- fprintf(stderr, "drw: missing fontset: %s
", missing[n]);
-- XFreeStringList(missing);
-- }
-- if(font->set) {
-- XFontStruct **xfonts;
-- char **font_names;
-- XExtentsOfFontSet(font->set);
-- n = XFontsOfFontSet(font->set, &xfonts, &font_names);
-- while(n--) {
-- font->ascent = MAX(font->ascent, (*xfonts)->ascent);
-- font->descent = MAX(font->descent,(*xfonts)->descent);
-- xfonts++;
-+
-+ if (fontname) {
-+ // Using the pattern found at font->xfont->pattern does not yield same
-+ // the same substitution results as using the pattern returned by
-+ // FcNameParse; using the latter results in the desired fallback
-+ // behaviour whereas the former just results in
-+ // missing-character-rectangles being drawn, at least with some fonts.
-+ if (!(font->xfont = XftFontOpenName(drw->dpy, drw->screen, fontname)) ||
-+ !(font->pattern = FcNameParse((FcChar8 *) fontname))) {
-+ if (font->xfont)
-+ XftFontClose(font->dpy, font->xfont);
-+ fprintf(stderr, "error, cannot load font: '%s'
", fontname);
-+ }
-+ } else if (fontpattern) {
-+ if (!(font->xfont = XftFontOpenPattern(drw->dpy, fontpattern))) {
-+ fprintf(stderr, "error, cannot load font pattern.
");
-+ } else {
-+ font->pattern = NULL;
- }
- }
-- else {
-- if(!(font->xfont = XLoadQueryFont(dpy, fontname))
-- && !(font->xfont = XLoadQueryFont(dpy, "fixed")))
-- die("error, cannot load font: '%s'
", fontname);
-- font->ascent = font->xfont->ascent;
-- font->descent = font->xfont->descent;
-+
-+ if (!font->xfont) {
-+ free(font);
-+ return NULL;
- }
-+
-+ font->ascent = font->xfont->ascent;
-+ font->descent = font->xfont->descent;
- font->h = font->ascent + font->descent;
-+ font->dpy = drw->dpy;
- return font;
- }
-
- void
--drw_font_free(Display *dpy, Fnt *font) {
-+drw_load_fonts(Drw* drw, const char *fonts[], size_t fontcount) {
-+ size_t i;
-+ Fnt *font;
-+ for (i = 0; i < fontcount && drw->fontcount < DRW_FONT_CACHE_SIZE; i++) {
-+ if ((font = drw_font_create(drw, fonts[i], NULL))) {
-+ drw->fonts[drw->fontcount++] = font;
-+ }
-+ }
-+
-+ if (i != fontcount) {
-+ die("Font cache exhausted.
");
-+ }
-+}
-+
-+void
-+drw_font_free(Fnt *font) {
- if(!font)
- return;
-- if(font->set)
-- XFreeFontSet(dpy, font->set);
-- else
-- XFreeFont(dpy, font->xfont);
-+ if(font->pattern)
-+ FcPatternDestroy(font->pattern);
-+ XftFontClose(font->dpy, font->xfont);
- free(font);
- }
-
-_AT_@ -93,7 +166,7 @@ Clr *
- drw_clr_create(Drw *drw, const char *clrname) {
- Clr *clr;
- Colormap cmap;
-- XColor color;
-+ Visual *vis;
-
- if(!drw)
- return NULL;
-_AT_@ -101,9 +174,10 @@ drw_clr_create(Drw *drw, const char *clrname) {
- if(!clr)
- return NULL;
- cmap = DefaultColormap(drw->dpy, drw->screen);
-- if(!XAllocNamedColor(drw->dpy, cmap, clrname, &color, &color))
-+ vis = DefaultVisual(drw->dpy, drw->screen);
-+ if(!XftColorAllocName(drw->dpy, vis, cmap, clrname, &clr->rgb))
- die("error, cannot allocate color '%s'
", clrname);
-- clr->rgb = color.pixel;
-+ clr->pix = clr->rgb.pixel;
- return clr;
- }
-
-_AT_@ -114,14 +188,8 @@ drw_clr_free(Clr *clr) {
- }
-
- void
--drw_setfont(Drw *drw, Fnt *font) {
-- if(drw)
-- drw->font = font;
--}
--
--void
- drw_setscheme(Drw *drw, ClrScheme *scheme) {
-- if(drw && scheme)
-+ if(drw && scheme)
- drw->scheme = scheme;
- }
-
-_AT_@ -129,46 +197,158 @@ void
- drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int empty, int invert) {
- int dx;
-
-- if(!drw || !drw->font || !drw->scheme)
-+ if(!drw || !drw->fontcount || !drw->scheme)
- return;
-- XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme->bg->rgb : drw->scheme->fg->rgb);
-- dx = (drw->font->ascent + drw->font->descent + 2) / 4;
-+ XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme->bg->pix : drw->scheme->fg->pix);
-+ dx = (drw->fonts[0]->ascent + drw->fonts[0]->descent + 2) / 4;
- if(filled)
- XFillRectangle(drw->dpy, drw->drawable, drw->gc, x+1, y+1, dx+1, dx+1);
- else if(empty)
- XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x+1, y+1, dx, dx);
- }
-
--void
-+int
- drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, const char *text, int invert) {
-- char buf[256];
-- int i, tx, ty, th, len, olen;
-+ char buf[1024];
-+ int tx, ty, th;
- Extnts tex;
-+ Colormap cmap;
-+ Visual *vis;
-+ XftDraw *d;
-+ Fnt *curfont, *nextfont;
-+ size_t i, len;
-+ int utf8strlen, utf8charlen, render;
-+ long utf8codepoint = 0;
-+ const char *utf8str;
-+ FcCharSet *fccharset;
-+ FcPattern *fcpattern;
-+ FcPattern *match;
-+ XftResult result;
-+ int charexists = 0;
-
-- if(!drw || !drw->scheme)
-- return;
-- XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme->fg->rgb : drw->scheme->bg->rgb);
-- XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
-- if(!text || !drw->font)
-- return;
-- olen = strlen(text);
-- drw_font_getexts(drw->font, text, olen, &tex);
-- th = drw->font->ascent + drw->font->descent;
-- ty = y + (h / 2) - (th / 2) + drw->font->ascent;
-- tx = x + (h / 2);
-- /* shorten text if necessary */
-- for(len = MIN(olen, sizeof buf); len && (tex.w > w - tex.h || w < tex.h); len--)
-- drw_font_getexts(drw->font, text, len, &tex);
-- if(!len)
-- return;
-- memcpy(buf, text, len);
-- if(len < olen)
-- for(i = len; i && i > len - 3; buf[--i] = '.');
-- XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme->bg->rgb : drw->scheme->fg->rgb);
-- if(drw->font->set)
-- XmbDrawString(drw->dpy, drw->drawable, drw->font->set, drw->gc, tx, ty, buf, len);
-- else
-- XDrawString(drw->dpy, drw->drawable, drw->gc, tx, ty, buf, len);
-+ if (!(render = x || y || w || h)) {
-+ w = ~w;
-+ }
-+
-+ if (!drw || !drw->scheme) {
-+ return 0;
-+ } else if (render) {
-+ XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme->fg->pix : drw->scheme->bg->pix);
-+ XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
-+ }
-+
-+ if (!text || !drw->fontcount) {
-+ return 0;
-+ } else if (render) {
-+ cmap = DefaultColormap(drw->dpy, drw->screen);
-+ vis = DefaultVisual(drw->dpy, drw->screen);
-+ d = XftDrawCreate(drw->dpy, drw->drawable, vis, cmap);
-+ }
-+
-+ curfont = drw->fonts[0];
-+ while (1) {
-+ utf8strlen = 0;
-+ utf8str = text;
-+ nextfont = NULL;
-+ while (*text) {
-+ utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ);
-+ for (i = 0; i < drw->fontcount; i++) {
-+ charexists = charexists || XftCharExists(drw->dpy, drw->fonts[i]->xfont, utf8codepoint);
-+ if (charexists) {
-+ if (drw->fonts[i] == curfont) {
-+ utf8strlen += utf8charlen;
-+ text += utf8charlen;
-+ } else {
-+ nextfont = drw->fonts[i];
-+ }
-+ break;
-+ }
-+ }
-+
-+ if (!charexists || (nextfont && nextfont != curfont)) {
-+ break;
-+ } else {
-+ charexists = 0;
-+ }
-+ }
-+
-+ if (utf8strlen) {
-+ drw_font_getexts(curfont, utf8str, utf8strlen, &tex);
-+ /* shorten text if necessary */
-+ for(len = MIN(utf8strlen, (sizeof buf) - 1); len && (tex.w > w - drw->fonts[0]->h || w < drw->fonts[0]->h); len--)
-+ drw_font_getexts(curfont, utf8str, len, &tex);
-+
-+ if (len) {
-+ memcpy(buf, utf8str, len);
-+ buf[len] = '
Received on Tue Nov 10 2015 - 08:31:59 CET
This archive was generated by hypermail 2.3.0 : Tue Nov 10 2015 - 08:36:12 CET