From afe7f928e1661de422cb3620b724dd3ffcf63f60 Mon Sep 17 00:00:00 2001 From: philw Date: Sun, 18 Feb 2024 12:50:42 +0100 Subject: Update dwm --- drw.c | 172 +++++++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 97 insertions(+), 75 deletions(-) (limited to 'drw.c') diff --git a/drw.c b/drw.c index a58a2b4..7d7b41b 100644 --- a/drw.c +++ b/drw.c @@ -11,13 +11,14 @@ #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) +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]) @@ -25,18 +26,15 @@ utf8decodebyte(const char c, size_t *i) return 0; } -static size_t -utf8validate(long *u, size_t i) +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) - ; + for (i = 1; *u > utfmax[i]; ++i) ; return i; } -static size_t -utf8decode(const char *c, long *u, size_t clen) +static size_t utf8decode(const char *c, long *u, size_t clen) { size_t i, j, len, type; long udecoded; @@ -60,8 +58,8 @@ utf8decode(const char *c, long *u, size_t clen) return len; } -Drw * -drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h) +Drw *drw_create(Display *dpy, int screen, Window root, unsigned int w, + unsigned int h) { Drw *drw = ecalloc(1, sizeof(Drw)); @@ -70,15 +68,15 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h drw->root = root; drw->w = w; drw->h = h; - drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); + 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) +void drw_resize(Drw *drw, unsigned int w, unsigned int h) { if (!drw) return; @@ -87,11 +85,12 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h) 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)); + drw->drawable = + XCreatePixmap(drw->dpy, drw->root, w, h, + DefaultDepth(drw->dpy, drw->screen)); } -void -drw_free(Drw *drw) +void drw_free(Drw *drw) { XFreePixmap(drw->dpy, drw->drawable); XFreeGC(drw->dpy, drw->gc); @@ -102,8 +101,7 @@ drw_free(Drw *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) +static Fnt *xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) { Fnt *font; XftFont *xfont = NULL; @@ -116,17 +114,22 @@ xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) * 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); + 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); + 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"); + fprintf(stderr, + "error, cannot load font from pattern.\n"); return NULL; } } else { @@ -142,8 +145,7 @@ xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern) return font; } -static void -xfont_free(Fnt *font) +static void xfont_free(Fnt *font) { if (!font) return; @@ -153,8 +155,7 @@ xfont_free(Fnt *font) free(font); } -Fnt* -drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) +Fnt *drw_fontset_create(Drw *drw, const char *fonts[], size_t fontcount) { Fnt *cur, *ret = NULL; size_t i; @@ -171,8 +172,7 @@ drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount) return (drw->fonts = ret); } -void -drw_fontset_free(Fnt *font) +void drw_fontset_free(Fnt *font) { if (font) { drw_fontset_free(font->next); @@ -180,28 +180,27 @@ drw_fontset_free(Fnt *font) } } -void -drw_clr_create(Drw *drw, Clr *dest, const char *clrname) +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)) + 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) +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)))) + if (!drw || !clrnames || clrcount < 2 + || !(ret = ecalloc(clrcount, sizeof(XftColor)))) return NULL; for (i = 0; i < clrcount; i++) @@ -209,34 +208,37 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) return ret; } -void -drw_setfontset(Drw *drw, Fnt *set) +void drw_setfontset(Drw *drw, Fnt *set) { if (drw) drw->fonts = set; } -void -drw_setscheme(Drw *drw, Clr *scm) +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) +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); + 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); + 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) +drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, + unsigned int lpad, const char *text, int invert) { int i, ty, ellipsis_x = 0; unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len; @@ -252,7 +254,10 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp int charexists = 0, overflow = 0; /* keep track of a couple codepoints for which we have no match. */ enum { nomatches_len = 64 }; - static struct { long codepoint[nomatches_len]; unsigned int idx; } nomatches; + static struct { + long codepoint[nomatches_len]; + unsigned int idx; + } nomatches; static unsigned int ellipsis_width = 0; if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts) @@ -261,11 +266,12 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp if (!render) { w = invert ? invert : ~invert; } else { - XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel); + XSetForeground(drw->dpy, drw->gc, + drw->scheme[invert ? ColFg : ColBg].pixel); XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); d = XftDrawCreate(drw->dpy, drw->drawable, - DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen)); + DefaultVisual(drw->dpy, drw->screen), + DefaultColormap(drw->dpy, drw->screen)); x += lpad; w -= lpad; } @@ -279,10 +285,15 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp nextfont = NULL; while (*text) { utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ); - for (curfont = drw->fonts; curfont; curfont = curfont->next) { - charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); + 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); + drw_font_getexts(curfont, text, + utf8charlen, &tmpw, + NULL); if (ew + ellipsis_width <= w) { /* keep track where the ellipsis still fits */ ellipsis_x = x + ew; @@ -298,7 +309,8 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp if (!render) x += tmpw; else - utf8strlen = ellipsis_len; + utf8strlen = + ellipsis_len; } else if (curfont == usedfont) { utf8strlen += utf8charlen; text += utf8charlen; @@ -318,15 +330,22 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp 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); + 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 (render && overflow) - drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", invert); + drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", + invert); if (!*text || overflow) { break; @@ -358,21 +377,26 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp FcConfigSubstitute(NULL, fcpattern, FcMatchPattern); FcDefaultSubstitute(fcpattern); - match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result); + 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 */ + 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.codepoint[++nomatches.idx % nomatches_len] = utf8codepoint; -no_match: + nomatches.codepoint[++nomatches.idx % + nomatches_len] = + utf8codepoint; + no_match: usedfont = drw->fonts; } } @@ -384,8 +408,7 @@ no_match: return x + (render ? w : 0); } -void -drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) +void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) { if (!drw) return; @@ -394,8 +417,7 @@ drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h) XSync(drw->dpy, False); } -unsigned int -drw_fontset_getwidth(Drw *drw, const char *text) +unsigned int drw_fontset_getwidth(Drw *drw, const char *text) { if (!drw || !drw->fonts || !text) return 0; @@ -412,22 +434,23 @@ drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n) } void -drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h) +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); + 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 *drw_cur_create(Drw *drw, int shape) { Cur *cur; @@ -439,8 +462,7 @@ drw_cur_create(Drw *drw, int shape) return cur; } -void -drw_cur_free(Drw *drw, Cur *cursor) +void drw_cur_free(Drw *drw, Cur *cursor) { if (!cursor) return; -- cgit v1.2.3