nixos-dotfiles

nixos-dotfiles

https://git.tonybtw.com/nixos-dotfiles.git git://git.tonybtw.com/nixos-dotfiles.git

Add 'config/dwm/' from commit '8cdcb04a3f713a104762dceb3d442cd071ccaf64'

Commit
c3f0a0b1e2f8637baf48fdd3d944461629b86b30
Parents
54dd2de 8cdcb04
Author
tonybanters <tonybanters@gmail.com>
Date
2026-01-28 08:04:21
git-subtree-dir: config/dwm
git-subtree-mainline: 54dd2dec8ae5b614a9d4d27b21f8367f75bc8611
git-subtree-split: 8cdcb04a3f713a104762dceb3d442cd071ccaf64

Diff

diff --cc config/dwm/.gitignore
index 0000000,0000000..72c4cc2
new file mode 100644
--- /dev/null
+++ b/config/dwm/.gitignore
@@@ -1,0 -1,0 +1,2 @@@
++dwm
++*.o
diff --cc config/dwm/LICENSE
index 0000000,995172f..995172f
mode 000000,100644..100644
--- a/config/dwm/LICENSE
+++ b/config/dwm/LICENSE
diff --cc config/dwm/Makefile
index 0000000,ffa69b4..ffa69b4
mode 000000,100644..100644
--- a/config/dwm/Makefile
+++ b/config/dwm/Makefile
diff --cc config/dwm/README.md
index 0000000,30bccc8..30bccc8
mode 000000,100644..100644
--- a/config/dwm/README.md
+++ b/config/dwm/README.md
diff --cc config/dwm/config.def.h
index 0000000,ec9eecc..ec9eecc
mode 000000,100644..100644
--- a/config/dwm/config.def.h
+++ b/config/dwm/config.def.h
diff --cc config/dwm/config.def.h.orig
index 0000000,fdad6a7..fdad6a7
mode 000000,100644..100644
--- a/config/dwm/config.def.h.orig
+++ b/config/dwm/config.def.h.orig
diff --cc config/dwm/config.def.h.rej
index 0000000,26f404b..26f404b
mode 000000,100644..100644
--- a/config/dwm/config.def.h.rej
+++ b/config/dwm/config.def.h.rej
diff --cc config/dwm/config.h
index 0000000,7416186..7416186
mode 000000,100644..100644
--- a/config/dwm/config.h
+++ b/config/dwm/config.h
diff --cc config/dwm/config.mk
index 0000000,8efca9a..8efca9a
mode 000000,100644..100644
--- a/config/dwm/config.mk
+++ b/config/dwm/config.mk
diff --cc config/dwm/drw.c
index 0000000,0000000..c41e6af
new file mode 100644
--- /dev/null
+++ b/config/dwm/drw.c
@@@ -1,0 -1,0 +1,448 @@@
++/* See LICENSE file for copyright and license details. */
++#include <stdio.h>
++#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
++
++static int
++utf8decode(const char *s_in, long *u, int *err)
++{
++	static const unsigned char lens[] = {
++		/* 0XXXX */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
++		/* 10XXX */ 0, 0, 0, 0, 0, 0, 0, 0,  /* invalid */
++		/* 110XX */ 2, 2, 2, 2,
++		/* 1110X */ 3, 3,
++		/* 11110 */ 4,
++		/* 11111 */ 0,  /* invalid */
++	};
++	static const unsigned char leading_mask[] = { 0x7F, 0x1F, 0x0F, 0x07 };
++	static const unsigned int overlong[] = { 0x0, 0x80, 0x0800, 0x10000 };
++
++	const unsigned char *s = (const unsigned char *)s_in;
++	int len = lens[*s >> 3];
++	*u = UTF_INVALID;
++	*err = 1;
++	if (len == 0)
++		return 1;
++
++	long cp = s[0] & leading_mask[len - 1];
++	for (int i = 1; i < len; ++i) {
++		if (s[i] == '\0' || (s[i] & 0xC0) != 0x80)
++			return i;
++		cp = (cp << 6) | (s[i] & 0x3F);
++	}
++	/* out of range, surrogate, overlong encoding */
++	if (cp > 0x10FFFF || (cp >> 11) == 0x1B || cp < overlong[len - 1])
++		return len;
++
++	*err = 0;
++	*u = cp;
++	return len;
++}
++
++Drw *
++drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h)
++{
++	Drw *drw = ecalloc(1, sizeof(Drw));
++
++	drw->dpy = dpy;
++	drw->screen = screen;
++	drw->root = root;
++	drw->w = w;
++	drw->h = h;
++	drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen));
++	drw->gc = XCreateGC(dpy, root, 0, NULL);
++	XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
++
++	return drw;
++}
++
++void
++drw_resize(Drw *drw, unsigned int w, unsigned int h)
++{
++	if (!drw)
++		return;
++
++	drw->w = w;
++	drw->h = h;
++	if (drw->drawable)
++		XFreePixmap(drw->dpy, drw->drawable);
++	drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen));
++}
++
++void
++drw_free(Drw *drw)
++{
++	XFreePixmap(drw->dpy, drw->drawable);
++	XFreeGC(drw->dpy, drw->gc);
++	drw_fontset_free(drw->fonts);
++	free(drw);
++}
++
++/* This function is an implementation detail. Library users should use
++ * drw_fontset_create instead.
++ */
++static Fnt *
++xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern)
++{
++	Fnt *font;
++	XftFont *xfont = NULL;
++	FcPattern *pattern = NULL;
++
++	if (fontname) {
++		/* Using the pattern found at font->xfont->pattern does not yield 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 (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) {
++			fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname);
++			return NULL;
++		}
++		if (!(pattern = FcNameParse((FcChar8 *) fontname))) {
++			fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname);
++			XftFontClose(drw->dpy, xfont);
++			return NULL;
++		}
++	} else if (fontpattern) {
++		if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) {
++			fprintf(stderr, "error, cannot load font from pattern.\n");
++			return NULL;
++		}
++	} else {
++		die("no font specified.");
++	}
++
++	font = ecalloc(1, sizeof(Fnt));
++	font->xfont = xfont;
++	font->pattern = pattern;
++	font->h = xfont->ascent + xfont->descent;
++	font->dpy = drw->dpy;
++
++	return font;
++}
++
++static void
++xfont_free(Fnt *font)
++{
++	if (!font)
++		return;
++	if (font->pattern)
++		FcPatternDestroy(font->pattern);
++	XftFontClose(font->dpy, font->xfont);
++	free(font);
++}
++
++Fnt*
++drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount)
++{
++	Fnt *cur, *ret = NULL;
++	size_t i;
++
++	if (!drw || !fonts)
++		return NULL;
++
++	for (i = 1; i <= fontcount; i++) {
++		if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) {
++			cur->next = ret;
++			ret = cur;
++		}
++	}
++	return (drw->fonts = ret);
++}
++
++void
++drw_fontset_free(Fnt *font)
++{
++	if (font) {
++		drw_fontset_free(font->next);
++		xfont_free(font);
++	}
++}
++
++void
++drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
++{
++	if (!drw || !dest || !clrname)
++		return;
++
++	if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
++	                       DefaultColormap(drw->dpy, drw->screen),
++	                       clrname, dest))
++		die("error, cannot allocate color '%s'", clrname);
++}
++
++/* Wrapper to create color schemes. The caller has to call free(3) on the
++ * returned color scheme when done using it. */
++Clr *
++drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
++{
++	size_t i;
++	Clr *ret;
++
++	/* need at least two colors for a scheme */
++	if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor))))
++		return NULL;
++
++	for (i = 0; i < clrcount; i++)
++		drw_clr_create(drw, &ret[i], clrnames[i]);
++	return ret;
++}
++
++void
++drw_setfontset(Drw *drw, Fnt *set)
++{
++	if (drw)
++		drw->fonts = set;
++}
++
++void
++drw_setscheme(Drw *drw, Clr *scm)
++{
++	if (drw)
++		drw->scheme = scm;
++}
++
++void
++drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert)
++{
++	if (!drw || !drw->scheme)
++		return;
++	XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel);
++	if (filled)
++		XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
++	else
++		XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1);
++}
++
++int
++drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert)
++{
++	int ty, ellipsis_x = 0;
++	unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len, hash, h0, h1;
++	XftDraw *d = NULL;
++	Fnt *usedfont, *curfont, *nextfont;
++	int utf8strlen, utf8charlen, utf8err, render = x || y || w || h;
++	long utf8codepoint = 0;
++	const char *utf8str;
++	FcCharSet *fccharset;
++	FcPattern *fcpattern;
++	FcPattern *match;
++	XftResult result;
++	int charexists = 0, overflow = 0;
++	/* keep track of a couple codepoints for which we have no match. */
++	static unsigned int nomatches[128], ellipsis_width, invalid_width;
++	static const char invalid[] = "�";
++
++	if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts)
++		return 0;
++
++	if (!render) {
++		w = invert ? invert : ~invert;
++	} else {
++		XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
++		XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
++		if (w < lpad)
++			return x + w;
++		d = XftDrawCreate(drw->dpy, drw->drawable,
++		                  DefaultVisual(drw->dpy, drw->screen),
++		                  DefaultColormap(drw->dpy, drw->screen));
++		x += lpad;
++		w -= lpad;
++	}
++
++	usedfont = drw->fonts;
++	if (!ellipsis_width && render)
++		ellipsis_width = drw_fontset_getwidth(drw, "...");
++	if (!invalid_width && render)
++		invalid_width = drw_fontset_getwidth(drw, invalid);
++	while (1) {
++		ew = ellipsis_len = utf8err = utf8charlen = utf8strlen = 0;
++		utf8str = text;
++		nextfont = NULL;
++		while (*text) {
++			utf8charlen = utf8decode(text, &utf8codepoint, &utf8err);
++			for (curfont = drw->fonts; curfont; curfont = curfont->next) {
++				charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint);
++				if (charexists) {
++					drw_font_getexts(curfont, text, utf8charlen, &tmpw, NULL);
++					if (ew + ellipsis_width <= w) {
++						/* keep track where the ellipsis still fits */
++						ellipsis_x = x + ew;
++						ellipsis_w = w - ew;
++						ellipsis_len = utf8strlen;
++					}
++
++					if (ew + tmpw > w) {
++						overflow = 1;
++						/* called from drw_fontset_getwidth_clamp():
++						 * it wants the width AFTER the overflow
++						 */
++						if (!render)
++							x += tmpw;
++						else
++							utf8strlen = ellipsis_len;
++					} else if (curfont == usedfont) {
++						text += utf8charlen;
++						utf8strlen += utf8err ? 0 : utf8charlen;
++						ew += utf8err ? 0 : tmpw;
++					} else {
++						nextfont = curfont;
++					}
++					break;
++				}
++			}
++
++			if (overflow || !charexists || nextfont || utf8err)
++				break;
++			else
++				charexists = 0;
++		}
++
++		if (utf8strlen) {
++			if (render) {
++				ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent;
++				XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg],
++				                  usedfont->xfont, x, ty, (XftChar8 *)utf8str, utf8strlen);
++			}
++			x += ew;
++			w -= ew;
++		}
++		if (utf8err && (!render || invalid_width < w)) {
++			if (render)
++				drw_text(drw, x, y, w, h, 0, invalid, invert);
++			x += invalid_width;
++			w -= invalid_width;
++		}
++		if (render && overflow)
++			drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", invert);
++
++		if (!*text || overflow) {
++			break;
++		} else if (nextfont) {
++			charexists = 0;
++			usedfont = nextfont;
++		} else {
++			/* Regardless of whether or not a fallback font is found, the
++			 * character must be drawn. */
++			charexists = 1;
++
++			hash = (unsigned int)utf8codepoint;
++			hash = ((hash >> 16) ^ hash) * 0x21F0AAAD;
++			hash = ((hash >> 15) ^ hash) * 0xD35A2D97;
++			h0 = ((hash >> 15) ^ hash) % LENGTH(nomatches);
++			h1 = (hash >> 17) % LENGTH(nomatches);
++			/* avoid expensive XftFontMatch call when we know we won't find a match */
++			if (nomatches[h0] == utf8codepoint || nomatches[h1] == utf8codepoint)
++				goto no_match;
++
++			fccharset = FcCharSetCreate();
++			FcCharSetAddChar(fccharset, utf8codepoint);
++
++			if (!drw->fonts->pattern) {
++				/* Refer to the comment in xfont_create for more information. */
++				die("the first font in the cache must be loaded from a font string.");
++			}
++
++			fcpattern = FcPatternDuplicate(drw->fonts->pattern);
++			FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset);
++			FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue);
++
++			FcConfigSubstitute(NULL, fcpattern, FcMatchPattern);
++			FcDefaultSubstitute(fcpattern);
++			match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result);
++
++			FcCharSetDestroy(fccharset);
++			FcPatternDestroy(fcpattern);
++
++			if (match) {
++				usedfont = xfont_create(drw, NULL, match);
++				if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) {
++					for (curfont = drw->fonts; curfont->next; curfont = curfont->next)
++						; /* NOP */
++					curfont->next = usedfont;
++				} else {
++					xfont_free(usedfont);
++					nomatches[nomatches[h0] ? h1 : h0] = utf8codepoint;
++no_match:
++					usedfont = drw->fonts;
++				}
++			}
++		}
++	}
++	if (d)
++		XftDrawDestroy(d);
++
++	return x + (render ? w : 0);
++}
++
++void
++drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h)
++{
++	if (!drw)
++		return;
++
++	XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y);
++	XSync(drw->dpy, False);
++}
++
++unsigned int
++drw_fontset_getwidth(Drw *drw, const char *text)
++{
++	if (!drw || !drw->fonts || !text)
++		return 0;
++	return drw_text(drw, 0, 0, 0, 0, 0, text, 0);
++}
++
++unsigned int
++drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n)
++{
++	unsigned int tmp = 0;
++	if (drw && drw->fonts && text && n)
++		tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n);
++	return MIN(n, tmp);
++}
++
++void
++drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h)
++{
++	XGlyphInfo ext;
++
++	if (!font || !text)
++		return;
++
++	XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext);
++	if (w)
++		*w = ext.xOff;
++	if (h)
++		*h = font->h;
++}
++
++Cur *
++drw_cur_create(Drw *drw, int shape)
++{
++	Cur *cur;
++
++	if (!drw || !(cur = ecalloc(1, sizeof(Cur))))
++		return NULL;
++
++	cur->cursor = XCreateFontCursor(drw->dpy, shape);
++
++	return cur;
++}
++
++void
++drw_cur_free(Drw *drw, Cur *cursor)
++{
++	if (!cursor)
++		return;
++
++	XFreeCursor(drw->dpy, cursor->cursor);
++	free(cursor);
++}
diff --cc config/dwm/drw.h
index 0000000,6471431..6471431
mode 000000,100644..100644
--- a/config/dwm/drw.h
+++ b/config/dwm/drw.h
diff --cc config/dwm/dwm.1
index 0000000,7b6cadb..7b6cadb
mode 000000,100644..100644
--- a/config/dwm/dwm.1
+++ b/config/dwm/dwm.1
diff --cc config/dwm/dwm.c
index 0000000,ab2d072..ab2d072
mode 000000,100644..100644
--- a/config/dwm/dwm.c
+++ b/config/dwm/dwm.c
diff --cc config/dwm/dwm.c.orig
index 0000000,857fda1..857fda1
mode 000000,100644..100644
--- a/config/dwm/dwm.c.orig
+++ b/config/dwm/dwm.c.orig
diff --cc config/dwm/dwm.c.rej
index 0000000,d381116..d381116
mode 000000,100644..100644
--- a/config/dwm/dwm.c.rej
+++ b/config/dwm/dwm.c.rej
diff --cc config/dwm/dwm.png
index 0000000,b1f9ba7..b1f9ba7
mode 000000,100644..100644
Binary files differ
diff --cc config/dwm/fibonacci.c
index 0000000,fce0a57..fce0a57
mode 000000,100644..100644
--- a/config/dwm/fibonacci.c
+++ b/config/dwm/fibonacci.c
diff --cc config/dwm/patches/alwaysontop-6.2.diff
index 0000000,6a4f72e..6a4f72e
mode 000000,100644..100644
--- a/config/dwm/patches/alwaysontop-6.2.diff
+++ b/config/dwm/patches/alwaysontop-6.2.diff
diff --cc config/dwm/patches/dwm-attachaside-6.4.diff
index 0000000,17be6b5..17be6b5
mode 000000,100644..100644
--- a/config/dwm/patches/dwm-attachaside-6.4.diff
+++ b/config/dwm/patches/dwm-attachaside-6.4.diff
diff --cc config/dwm/patches/dwm-barpadding-20211020-a786211.diff
index 0000000,7842181..7842181
mode 000000,100644..100644
--- a/config/dwm/patches/dwm-barpadding-20211020-a786211.diff
+++ b/config/dwm/patches/dwm-barpadding-20211020-a786211.diff
diff --cc config/dwm/patches/dwm-barpadding-6.2.diff
index 0000000,4c26e46..4c26e46
mode 000000,100644..100644
--- a/config/dwm/patches/dwm-barpadding-6.2.diff
+++ b/config/dwm/patches/dwm-barpadding-6.2.diff
diff --cc config/dwm/patches/dwm-fibonacci-5.8.2.diff
index 0000000,78664c8..78664c8
mode 000000,100644..100644
--- a/config/dwm/patches/dwm-fibonacci-5.8.2.diff
+++ b/config/dwm/patches/dwm-fibonacci-5.8.2.diff
diff --cc config/dwm/patches/dwm-fullscreen-6.2.diff
index 0000000,36e3140..36e3140
mode 000000,100644..100644
--- a/config/dwm/patches/dwm-fullscreen-6.2.diff
+++ b/config/dwm/patches/dwm-fullscreen-6.2.diff
diff --cc config/dwm/patches/dwm-hide_vacant_tags-6.4.diff
index 0000000,42d9c05..42d9c05
mode 000000,100644..100644
--- a/config/dwm/patches/dwm-hide_vacant_tags-6.4.diff
+++ b/config/dwm/patches/dwm-hide_vacant_tags-6.4.diff
diff --cc config/dwm/patches/dwm-keychord-6.4.diff
index 0000000,96d6145..96d6145
mode 000000,100644..100644
--- a/config/dwm/patches/dwm-keychord-6.4.diff
+++ b/config/dwm/patches/dwm-keychord-6.4.diff
diff --cc config/dwm/patches/dwm-notitle-6.2.diff
index 0000000,efd5ebc..efd5ebc
mode 000000,100644..100644
--- a/config/dwm/patches/dwm-notitle-6.2.diff
+++ b/config/dwm/patches/dwm-notitle-6.2.diff
diff --cc config/dwm/patches/dwm-restartsig-20180523-6.2.diff
index 0000000,f1f8680..f1f8680
mode 000000,100644..100644
--- a/config/dwm/patches/dwm-restartsig-20180523-6.2.diff
+++ b/config/dwm/patches/dwm-restartsig-20180523-6.2.diff
diff --cc config/dwm/patches/dwm-vanitygaps-6.2.diff
index 0000000,18cbd6d..18cbd6d
mode 000000,100644..100644
--- a/config/dwm/patches/dwm-vanitygaps-6.2.diff
+++ b/config/dwm/patches/dwm-vanitygaps-6.2.diff
diff --cc config/dwm/transient.c
index 0000000,040adb5..040adb5
mode 000000,100644..100644
--- a/config/dwm/transient.c
+++ b/config/dwm/transient.c
diff --cc config/dwm/util.c
index 0000000,0000000..8e26a51
new file mode 100644
--- /dev/null
+++ b/config/dwm/util.c
@@@ -1,0 -1,0 +1,37 @@@
++/* See LICENSE file for copyright and license details. */
++#include <errno.h>
++#include <stdarg.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++#include "util.h"
++
++void
++die(const char *fmt, ...)
++{
++	va_list ap;
++	int saved_errno;
++
++	saved_errno = errno;
++
++	va_start(ap, fmt);
++	vfprintf(stderr, fmt, ap);
++	va_end(ap);
++
++	if (fmt[0] && fmt[strlen(fmt)-1] == ':')
++		fprintf(stderr, " %s", strerror(saved_errno));
++	fputc('\n', stderr);
++
++	exit(1);
++}
++
++void *
++ecalloc(size_t nmemb, size_t size)
++{
++	void *p;
++
++	if (!(p = calloc(nmemb, size)))
++		die("calloc:");
++	return p;
++}
diff --cc config/dwm/util.h
index 0000000,0000000..c0a50d4
new file mode 100644
--- /dev/null
+++ b/config/dwm/util.h
@@@ -1,0 -1,0 +1,9 @@@
++/* See LICENSE file for copyright and license details. */
++
++#define MAX(A, B)               ((A) > (B) ? (A) : (B))
++#define MIN(A, B)               ((A) < (B) ? (A) : (B))
++#define BETWEEN(X, A, B)        ((A) <= (X) && (X) <= (B))
++#define LENGTH(X)               (sizeof (X) / sizeof (X)[0])
++
++void die(const char *fmt, ...);
++void *ecalloc(size_t nmemb, size_t size);
diff --cc config/dwm/vanitygaps.c
index 0000000,e8b2ce8..e8b2ce8
mode 000000,100644..100644
--- a/config/dwm/vanitygaps.c
+++ b/config/dwm/vanitygaps.c