diff --git a/dmenu-flexipatch/Makefile b/dmenu-flexipatch/Makefile index f4be9d1..a71a856 100644 --- a/dmenu-flexipatch/Makefile +++ b/dmenu-flexipatch/Makefile @@ -6,13 +6,7 @@ include config.mk SRC = drw.c dmenu.c stest.c util.c OBJ = $(SRC:.c=.o) -all: options dmenu stest - -options: - @echo dmenu build options: - @echo "CFLAGS = $(CFLAGS)" - @echo "LDFLAGS = $(LDFLAGS)" - @echo "CC = $(CC)" +all: dmenu stest .c.o: $(CC) -c $(CFLAGS) $< @@ -64,4 +58,4 @@ uninstall: $(DESTDIR)$(MANPREFIX)/man1/dmenu.1\ $(DESTDIR)$(MANPREFIX)/man1/stest.1 -.PHONY: all options clean dist install uninstall +.PHONY: all clean dist install uninstall diff --git a/dmenu-flexipatch/README.md b/dmenu-flexipatch/README.md index be2c349..9e1bff7 100644 --- a/dmenu-flexipatch/README.md +++ b/dmenu-flexipatch/README.md @@ -1,5 +1,5 @@ -Similar to [dwm-flexipatch](https://github.com/bakkeby/dwm-flexipatch) this dmenu 5.2 (0fe460d, -2023-04-05) project has a different take on patching. It uses preprocessor directives to decide +Similar to [dwm-flexipatch](https://github.com/bakkeby/dwm-flexipatch) this dmenu 5.2 (8df553e, +2023-09-22) project has a different take on patching. It uses preprocessor directives to decide whether or not to include a patch during build time. Essentially this means that this build, for better or worse, contains both the patched _and_ the original code. The aim being that you can select which patches to include and the build will contain that code and nothing more. diff --git a/dmenu-flexipatch/dmenu.c b/dmenu-flexipatch/dmenu.c index 5d20ed8..0bcafd1 100644 --- a/dmenu-flexipatch/dmenu.c +++ b/dmenu-flexipatch/dmenu.c @@ -33,7 +33,6 @@ /* macros */ #define INTERSECT(x,y,w,h,r) (MAX(0, MIN((x)+(w),(r).x_org+(r).width) - MAX((x),(r).x_org)) \ * MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org))) -#define LENGTH(X) (sizeof X / sizeof X[0]) #if PANGO_PATCH #define TEXTW(X) (drw_font_getwidth(drw, (X), False) + lrpad) #define TEXTWM(X) (drw_font_getwidth(drw, (X), True) + lrpad) diff --git a/dmenu-flexipatch/drw.c b/dmenu-flexipatch/drw.c index 62096d1..41857e5 100644 --- a/dmenu-flexipatch/drw.c +++ b/dmenu-flexipatch/drw.c @@ -430,8 +430,8 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp int 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; + 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, render = x || y || w || h; @@ -443,10 +443,8 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp XftResult result; 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 unsigned int nomatches[128], ellipsis_width; const char *ellipsis = "..."; - static unsigned int ellipsis_width = 0; if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts) return 0; @@ -535,11 +533,14 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp * character must be drawn. */ charexists = 1; - for (i = 0; i < nomatches_len; ++i) { - /* avoid calling XftFontMatch if we know we won't find a match */ - if (utf8codepoint == nomatches.codepoint[i]) - goto no_match; - } + 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); @@ -571,7 +572,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp curfont->next = usedfont; } else { xfont_free(usedfont); - nomatches.codepoint[++nomatches.idx % nomatches_len] = utf8codepoint; + nomatches[nomatches[h0] ? h1 : h0] = utf8codepoint; no_match: usedfont = drw->fonts; } diff --git a/dmenu-flexipatch/patch/scroll.c b/dmenu-flexipatch/patch/scroll.c index 9021edf..3a8d2d8 100644 --- a/dmenu-flexipatch/patch/scroll.c +++ b/dmenu-flexipatch/patch/scroll.c @@ -36,9 +36,13 @@ drw_text_align(Drw *drw, int x, int y, unsigned int w, unsigned int h, const cha } else { XSetForeground(drw->dpy, drw->gc, drw->scheme[ColBg].pixel); XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); + #if ALPHA_PATCH + d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap); + #else d = XftDrawCreate(drw->dpy, drw->drawable, DefaultVisual(drw->dpy, drw->screen), DefaultColormap(drw->dpy, drw->screen)); + #endif // ALPHA_PATCH } usedfont = drw->fonts; diff --git a/dmenu-flexipatch/patches.def.h b/dmenu-flexipatch/patches.def.h index cd31cbd..ab29f07 100644 --- a/dmenu-flexipatch/patches.def.h +++ b/dmenu-flexipatch/patches.def.h @@ -299,7 +299,7 @@ * it can handle long text. * https://tools.suckless.org/dmenu/patches/scroll/ */ -#define SCROLL_PATCH 0 +#define SCROLL_PATCH 1 /* This patch adds -d and -D flags which separates the input into two halves; one half to be * displayed in dmenu and the other to be printed to stdout. This patch takes precedence over diff --git a/dmenu-flexipatch/util.h b/dmenu-flexipatch/util.h index 531ab25..2922d77 100644 --- a/dmenu-flexipatch/util.h +++ b/dmenu-flexipatch/util.h @@ -7,6 +7,7 @@ #define MIN(A, B) ((A) < (B) ? (A) : (B)) #endif #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);