From 08f67f647771076926ec959a0fd45e340cb7c372 Mon Sep 17 00:00:00 2001 From: lucy Date: Fri, 27 Feb 2026 21:35:34 +0100 Subject: [PATCH] add fixborders patch --- drw.c | 2 + drw.c.orig | 471 +++++++++++++++++++++++++++++++++++++++++++++++++++++ drw.o | Bin 11848 -> 11872 bytes dwm | Bin 89272 -> 89272 bytes 4 files changed, 473 insertions(+) create mode 100644 drw.c.orig diff --git a/drw.c b/drw.c index 9fdd1a4..8bea9e0 100644 --- a/drw.c +++ b/drw.c @@ -176,6 +176,8 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname) DefaultColormap(drw->dpy, drw->screen), clrname, dest)) die("error, cannot allocate color '%s'", clrname); + + dest->pixel |= 0xff << 24; } /* Create color schemes. */ diff --git a/drw.c.orig b/drw.c.orig new file mode 100644 index 0000000..9fdd1a4 --- /dev/null +++ b/drw.c.orig @@ -0,0 +1,471 @@ +/* See LICENSE file for copyright and license details. */ +#include +#include +#include +#include +#include + +#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); +} + +/* Create color schemes. */ +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(Clr)))) + return NULL; + + for (i = 0; i < clrcount; i++) + drw_clr_create(drw, &ret[i], clrnames[i]); + return ret; +} + +void +drw_clr_free(Drw *drw, Clr *c) +{ + if (!drw || !c) + return; + + /* c is typedef XftColor Clr */ + XftColorFree(drw->dpy, DefaultVisual(drw->dpy, drw->screen), + DefaultColormap(drw->dpy, drw->screen), c); +} + +void +drw_scm_free(Drw *drw, Clr *scm, size_t clrcount) +{ + size_t i; + + if (!drw || !scm) + return; + + for (i = 0; i < clrcount; i++) + drw_clr_free(drw, &scm[i]); + free(scm); +} + +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 --git a/drw.o b/drw.o index af6027a2a5af5207816f5eb2c07c5b60b5ff283d..5e851b9036e2df3ff0677e0a915426664b585b0b 100644 GIT binary patch delta 1765 zcmZ{kZD>jg$)@>N5}SQ zT6}>Z>f-;)7!w+CogemLZ5$}u7)2O@3@pAN?2AE=%7$7*Y_X$zp4@Zg81RATxyk=` z{?9r0+;i`>!Fz+>G|RDk%u_#LA732#V8G7a{?N`o?cZ^-uQHvzYiA$Y`%*PXdK&6h z+Sy0;sdog$3>SO!4XTT~J{~FzdpfJ+>B4#ML0KULW_=BXcHci0@n#yZQSx9R4siL% zS97AG*B3nM>GiGUA4y+L(pQod|F+n_n)ph(5H)kHY{i6 zJP}^tqJCUmm>{}UQ}*&Ha=o`oieO&&TaHjy%x^hSxl;VN5qExw}+PK}MA|UQK2Sp8b7F zx6faQM^mzh9F1vbNWqsNr90*}rieZ@=thHXz-&~>JE&^@!bez8jr0l delta 1793 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 delta 16077 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