-- - 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