dmenu alpha: cleanup patch, Making Alpha Small Again (MASA) - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
 (DIR) commit 71387457ea0b25cece475a7809621fc8c44f26fd
 (DIR) parent 8206a952238a89090a96bb7851e647e69774ce04
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Tue, 18 Nov 2025 20:08:49 +0100
       
       dmenu alpha: cleanup patch, Making Alpha Small Again (MASA)
       
       Removed ".orig", ".rej" and patching leftovers...
       
       Other:
       
       - Change the default value from 0xff to 0xee to have some effect.
       - Fix correctly initialize alpha values:
               scheme[j] = drw_scm_create(drw, colors[j], 2, alphas[j]);
       
               used to be uninitialized:
       
               scheme[j] = drw_scm_create(drw, colors[j], 2, alphas[i]); (wrong)
       - Change order of drw_scm_create() arguments (no difference intended).
       - Small code-style changes.
       
       index.md: Sort index from most recent to old (top to bottom).
       
       Provided from the goodness/evilness of my heart.
       I do not use this patch or am going to maintain it.
       
       Diffstat:
         A tools.suckless.org/dmenu/patches/a… |     276 ++++++++++++++++++++++++++++++
         M tools.suckless.org/dmenu/patches/a… |       7 +++++--
       
       2 files changed, 281 insertions(+), 2 deletions(-)
       ---
 (DIR) diff --git a/tools.suckless.org/dmenu/patches/alpha/dmenu-alpha-20251118-8b48986.diff b/tools.suckless.org/dmenu/patches/alpha/dmenu-alpha-20251118-8b48986.diff
       @@ -0,0 +1,276 @@
       +diff --git a/config.def.h b/config.def.h
       +index 1edb647..a2cb342 100644
       +--- a/config.def.h
       ++++ b/config.def.h
       +@@ -2,6 +2,7 @@
       + /* Default settings; can be overriden by command line. */
       + 
       + static int topbar = 1;                      /* -b  option; if 0, dmenu appears at bottom     */
       ++static const unsigned int alpha = 0xee;     /* Amount of opacity. 0xff is opaque             */
       + /* -fn option overrides fonts[0]; default X11 font or font set */
       + static const char *fonts[] = {
       +         "monospace:size=10"
       +@@ -13,6 +14,12 @@ static const char *colors[SchemeLast][2] = {
       +         [SchemeSel] = { "#eeeeee", "#005577" },
       +         [SchemeOut] = { "#000000", "#00ffff" },
       + };
       ++
       ++static const unsigned int alphas[SchemeLast][2] = {
       ++        [SchemeNorm] = { OPAQUE, alpha },
       ++        [SchemeSel] = { OPAQUE, alpha },
       ++        [SchemeOut] = { OPAQUE, alpha },
       ++};
       + /* -l option; if nonzero, dmenu uses vertical list with given number of lines */
       + static unsigned int lines      = 0;
       + 
       +diff --git a/config.mk b/config.mk
       +index dcc5bb3..2166055 100644
       +--- a/config.mk
       ++++ b/config.mk
       +@@ -21,7 +21,7 @@ FREETYPEINC = /usr/include/freetype2
       + 
       + # includes and libs
       + INCS = -I$(X11INC) -I$(FREETYPEINC)
       +-LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS)
       ++LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) -lXrender
       + 
       + # flags
       + CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS)
       +diff --git a/dmenu.c b/dmenu.c
       +index 9577b37..22e4a4b 100644
       +--- a/dmenu.c
       ++++ b/dmenu.c
       +@@ -10,10 +10,12 @@
       + 
       + #include <X11/Xlib.h>
       + #include <X11/Xatom.h>
       ++#include <X11/Xproto.h>
       + #include <X11/Xutil.h>
       + #ifdef XINERAMA
       + #include <X11/extensions/Xinerama.h>
       + #endif
       ++#include <X11/extensions/Xrender.h>
       + #include <X11/Xft/Xft.h>
       + 
       + #include "drw.h"
       +@@ -24,6 +26,8 @@
       +                              * MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org)))
       + #define TEXTW(X)              (drw_fontset_getwidth(drw, (X)) + lrpad)
       + 
       ++#define OPAQUE                0xffu
       ++
       + /* enums */
       + enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */
       + 
       +@@ -52,10 +56,16 @@ static XIC xic;
       + static Drw *drw;
       + static Clr *scheme[SchemeLast];
       + 
       ++static int useargb = 0;
       ++static Visual *visual;
       ++static int depth;
       ++static Colormap cmap;
       ++
       + #include "config.h"
       + 
       + static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
       + static char *(*fstrstr)(const char *, const char *) = strstr;
       ++static void xinitvisual(void);
       + 
       + static unsigned int
       + textw_clamp(const char *str, unsigned int n)
       +@@ -627,7 +637,7 @@ setup(void)
       + #endif
       +         /* init appearance */
       +         for (j = 0; j < SchemeLast; j++)
       +-                scheme[j] = drw_scm_create(drw, colors[j], 2);
       ++                scheme[j] = drw_scm_create(drw, colors[j], 2, alphas[j]);
       + 
       +         clip = XInternAtom(dpy, "CLIPBOARD",   False);
       +         utf8 = XInternAtom(dpy, "UTF8_STRING", False);
       +@@ -682,11 +692,12 @@ setup(void)
       + 
       +         /* create menu window */
       +         swa.override_redirect = True;
       +-        swa.background_pixel = scheme[SchemeNorm][ColBg].pixel;
       ++        swa.border_pixel = 0;
       ++        swa.colormap = cmap;
       +         swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask;
       +         win = XCreateWindow(dpy, root, x, y, mw, mh, 0,
       +-                            CopyFromParent, CopyFromParent, CopyFromParent,
       +-                            CWOverrideRedirect | CWBackPixel | CWEventMask, &swa);
       ++                            depth, CopyFromParent, visual,
       ++                            CWOverrideRedirect | CWBackPixel | CWBorderPixel | CWColormap | CWEventMask, &swa);
       +         XSetClassHint(dpy, win, &ch);
       + 
       +         /* input methods */
       +@@ -771,7 +782,8 @@ main(int argc, char *argv[])
       +         if (!XGetWindowAttributes(dpy, parentwin, &wa))
       +                 die("could not get embedding window attributes: 0x%lx",
       +                     parentwin);
       +-        drw = drw_create(dpy, screen, root, wa.width, wa.height);
       ++        xinitvisual();
       ++        drw = drw_create(dpy, screen, root, wa.width, wa.height, visual, depth, cmap);
       +         if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
       +                 die("no fonts could be loaded.");
       +         lrpad = drw->fonts->h;
       +@@ -793,3 +805,40 @@ main(int argc, char *argv[])
       + 
       +         return 1; /* unreachable */
       + }
       ++
       ++void
       ++xinitvisual(void)
       ++{
       ++        XVisualInfo *infos;
       ++        XRenderPictFormat *fmt;
       ++        int nitems;
       ++        int i;
       ++
       ++        XVisualInfo tpl = {
       ++                .screen = screen,
       ++                .depth = 32,
       ++                .class = TrueColor
       ++        };
       ++        long masks = VisualScreenMask | VisualDepthMask | VisualClassMask;
       ++
       ++        infos = XGetVisualInfo(dpy, masks, &tpl, &nitems);
       ++        visual = NULL;
       ++        for(i = 0; i < nitems; i ++) {
       ++                fmt = XRenderFindVisualFormat(dpy, infos[i].visual);
       ++                if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) {
       ++                         visual = infos[i].visual;
       ++                         depth = infos[i].depth;
       ++                         cmap = XCreateColormap(dpy, root, visual, AllocNone);
       ++                         useargb = 1;
       ++                         break;
       ++                }
       ++        }
       ++
       ++        XFree(infos);
       ++
       ++        if (!visual) {
       ++                visual = DefaultVisual(dpy, screen);
       ++                depth = DefaultDepth(dpy, screen);
       ++                cmap = DefaultColormap(dpy, screen);
       ++        }
       ++}
       +diff --git a/drw.c b/drw.c
       +index 9fdd1a4..a4a01e8 100644
       +--- a/drw.c
       ++++ b/drw.c
       +@@ -47,7 +47,7 @@ utf8decode(const char *s_in, long *u, int *err)
       + }
       + 
       + Drw *
       +-drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h)
       ++drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap)
       + {
       +         Drw *drw = ecalloc(1, sizeof(Drw));
       + 
       +@@ -56,8 +56,11 @@ 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->gc = XCreateGC(dpy, root, 0, NULL);
       ++        drw->visual = visual;
       ++        drw->depth = depth;
       ++        drw->cmap = cmap;
       ++        drw->drawable = XCreatePixmap(dpy, root, w, h, depth);
       ++        drw->gc = XCreateGC(dpy, drw->drawable, 0, NULL);
       +         XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
       + 
       +         return drw;
       +@@ -73,7 +76,7 @@ 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, drw->depth);
       + }
       + 
       + void
       +@@ -167,20 +170,21 @@ drw_fontset_free(Fnt *font)
       + }
       + 
       + void
       +-drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
       ++drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha)
       + {
       +         if (!drw || !dest || !clrname)
       +                 return;
       + 
       +-        if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
       +-                               DefaultColormap(drw->dpy, drw->screen),
       ++        if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap,
       +                                clrname, dest))
       +                 die("error, cannot allocate color '%s'", clrname);
       ++
       ++        dest->pixel = (dest->pixel & 0x00ffffffU) | (alpha << 24);
       + }
       + 
       + /* Create color schemes. */
       + Clr *
       +-drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
       ++drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount, const unsigned int alphas[])
       + {
       +         size_t i;
       +         Clr *ret;
       +@@ -190,7 +194,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
       +                 return NULL;
       + 
       +         for (i = 0; i < clrcount; i++)
       +-                drw_clr_create(drw, &ret[i], clrnames[i]);
       ++                drw_clr_create(drw, &ret[i], clrnames[i], alphas[i]);
       +         return ret;
       + }
       + 
       +@@ -271,11 +275,9 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
       +         } else {
       +                 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, drw->visual, drw->cmap);
       +                 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;
       +         }
       +diff --git a/drw.h b/drw.h
       +index 2ed77be..5a0d7d7 100644
       +--- a/drw.h
       ++++ b/drw.h
       +@@ -20,6 +20,9 @@ typedef struct {
       +         Display *dpy;
       +         int screen;
       +         Window root;
       ++        Visual *visual;
       ++        unsigned int depth;
       ++        Colormap cmap;
       +         Drawable drawable;
       +         GC gc;
       +         Clr *scheme;
       +@@ -27,7 +30,7 @@ typedef struct {
       + } Drw;
       + 
       + /* Drawable abstraction */
       +-Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h);
       ++Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h, Visual*, unsigned int, Colormap);
       + void drw_resize(Drw *drw, unsigned int w, unsigned int h);
       + void drw_free(Drw *drw);
       + 
       +@@ -39,9 +42,9 @@ unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int
       + void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h);
       + 
       + /* Colorscheme abstraction */
       +-void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
       ++void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha);
       + void drw_clr_free(Drw *drw, Clr *c);
       +-Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
       ++Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount, const unsigned int alphas[]);
       + void drw_scm_free(Drw *drw, Clr *scm, size_t clrcount);
       + 
       + /* Cursor abstraction */
 (DIR) diff --git a/tools.suckless.org/dmenu/patches/alpha/index.md b/tools.suckless.org/dmenu/patches/alpha/index.md
       @@ -10,9 +10,12 @@ it opaque, just like the alpha patch for [alpha-patch for st](//st.suckless.org/
        
        Download
        --------
       -* [dmenu-alpha-20210605-1a13d04.diff](dmenu-alpha-20210605-1a13d04.diff) (2021-06-05)
       -* [dmenu-alpha-20230110-5.2.diff](dmenu-alpha-20230110-5.2.diff) (2023-01-10)
       +
       +* [dmenu-alpha-20251118-8b48986.diff](dmenu-alpha-20251118-8b48986.diff) (2025-11-18)
        * [dmenu-alpha-20250614-b1e217b.diff](dmenu-alpha-20250614-b1e217b.diff) (2025-06-14)
       +* [dmenu-alpha-20230110-5.2.diff](dmenu-alpha-20230110-5.2.diff) (2023-01-10)
       +* [dmenu-alpha-20210605-1a13d04.diff](dmenu-alpha-20210605-1a13d04.diff) (2021-06-05)
       +
        
        Authors
        -------