summaryrefslogtreecommitdiff
path: root/drw.c
diff options
context:
space:
mode:
authorProsperousPotato <ProsperousPotato@users.noreply.github.com>2025-06-17 17:47:59 +0100
committerProsperousPotato <ProsperousPotato@users.noreply.github.com>2025-06-17 17:47:59 +0100
commitfbc7e6ddb8617683dff6e9cba96ae4b8d33d18ef (patch)
tree68a7a95a9294aeb7d9cd539a56c8a58386e58606 /drw.c
parentbb1b2fe60ac3cc6e8a494f6b57c806c0f24d06ea (diff)
remove most of bar, remove patches
Diffstat (limited to 'drw.c')
-rw-r--r--drw.c250
1 files changed, 0 insertions, 250 deletions
diff --git a/drw.c b/drw.c
index 9aa5f24..58a2760 100644
--- a/drw.c
+++ b/drw.c
@@ -10,42 +10,6 @@
#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)
{
@@ -198,220 +162,6 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
}
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;