From f971f337620877369ca1eb84c1fda181ff7c4fcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yi=C4=9Fit=20=C3=87olako=C4=9Flu?= Date: Thu, 25 Mar 2021 22:58:50 +0300 Subject: [PATCH] Dmenu Alpha Patched Apply, Why was this so hard --- scripts/st-copyout | 2 +- scripts/st-urlhandler | 4 +- suckless/dmenu/.gitignore | 2 - suckless/dmenu/colors.h | 12 + suckless/dmenu/config.def.h.orig | 30 +++ suckless/dmenu/config.def.h.rej | 25 ++ suckless/dmenu/config.mk | 3 +- suckless/dmenu/config.mk.orig | 32 +++ suckless/dmenu/config.mk.rej | 11 + suckless/dmenu/dmenu.c | 58 +++- suckless/dmenu/dmenu_path | 13 + suckless/dmenu/dmenu_run | 2 + suckless/dmenu/drw.c | 26 +- suckless/dmenu/drw.h | 9 +- suckless/dmenu/patches/dmenu-alpha-4.9.diff | 277 ++++++++++++++++++++ suckless/st/config.h | 2 +- 16 files changed, 482 insertions(+), 26 deletions(-) create mode 100644 suckless/dmenu/config.def.h.orig create mode 100644 suckless/dmenu/config.def.h.rej create mode 100644 suckless/dmenu/config.mk.orig create mode 100644 suckless/dmenu/config.mk.rej create mode 100755 suckless/dmenu/dmenu_path create mode 100755 suckless/dmenu/dmenu_run create mode 100644 suckless/dmenu/patches/dmenu-alpha-4.9.diff diff --git a/scripts/st-copyout b/scripts/st-copyout index 5844da51..b548a4c9 100755 --- a/scripts/st-copyout +++ b/scripts/st-copyout @@ -9,6 +9,6 @@ sed -n "w $tmpfile" sed -i 's/\x0//g' "$tmpfile" #ps1="$(grep "\S" "$tmpfile" | tail -n 1 | sed 's/^\s*//' | cut -d' ' -f1)" ps1="λ" -chosen="$(grep -F "$ps1" "$tmpfile" | sed '$ d' | tac | grep -E -v "λ $"| dmenu -p "Copy which command's output?" -i -l 10 | sed 's/[^^]/[&]/g; s/\^/\\^/g')" +chosen="$(grep -F "$ps1" "$tmpfile" | sed '$ d' | tac | grep -E -v "λ $"| dmenu -w "$WINDOWID" -p "Copy which command's output?" -i -l 10 | sed 's/[^^]/[&]/g; s/\^/\\^/g')" eps1="$(echo "$ps1" | sed 's/[^^]/[&]/g; s/\^/\\^/g')" awk "/^$chosen$/{p=1;print;next} p&&/$eps1/{p=0};p" "$tmpfile" | tail -n +2 | xclip -selection clipboard diff --git a/scripts/st-urlhandler b/scripts/st-urlhandler index e2a62f43..c8ab4d3e 100755 --- a/scripts/st-urlhandler +++ b/scripts/st-urlhandler @@ -12,8 +12,8 @@ urls="$(sed 's/.*│//g' | tr -d '\n' | # First remove linebreaks and mutt sideb while getopts "hoc" o; do case "${o}" in h) printf "Optional arguments for custom use:\\n -c: copy\\n -o: xdg-open\\n -h: Show this message\\n" && exit 1 ;; - o) chosen="$(echo "$urls" | dmenu -i -p 'Follow which url?' -l 10)" + o) chosen="$(echo "$urls" | dmenu -w "$WINDOWID" -i -p 'Follow which url?' -l 10)" setsid xdg-open "$chosen" >/dev/null 2>&1 & ;; - c) echo "$urls" | dmenu -i -p 'Copy which url?' -l 10 | tr -d '\n' | xclip -selection clipboard ;; + c) echo "$urls" | dmenu -w "$WINDOWID" -i -p 'Copy which url?' -l 10 | tr -d '\n' | xclip -selection clipboard ;; *) printf "Invalid option: -%s\\n" "$OPTARG" && exit 1 ;; esac done diff --git a/suckless/dmenu/.gitignore b/suckless/dmenu/.gitignore index 9f745d42..9ace550c 100644 --- a/suckless/dmenu/.gitignore +++ b/suckless/dmenu/.gitignore @@ -52,6 +52,4 @@ Mkfile.old dkms.conf dmenu -dmenu_path -dmenu_run stest diff --git a/suckless/dmenu/colors.h b/suckless/dmenu/colors.h index f7c6f42e..46302c96 100644 --- a/suckless/dmenu/colors.h +++ b/suckless/dmenu/colors.h @@ -9,3 +9,15 @@ static const char *colors[SchemeLast][2] = { [SchemeSelHighlight] = { "#88c0d0", "#bf616a" }, // [SchemeHp] = { "#e5e9f0", "#4c566a" }, }; + + +static const unsigned int bgalpha = 0xFF; +static const unsigned int fgalpha = OPAQUE; + + +static const unsigned int alphas[SchemeLast][2] = { + /* fgalpha bgalphga */ + [SchemeNorm] = { fgalpha, bgalpha }, + [SchemeSel] = { fgalpha, bgalpha }, + [SchemeOut] = { fgalpha, bgalpha }, +}; diff --git a/suckless/dmenu/config.def.h.orig b/suckless/dmenu/config.def.h.orig new file mode 100644 index 00000000..904dcb45 --- /dev/null +++ b/suckless/dmenu/config.def.h.orig @@ -0,0 +1,30 @@ +/* See LICENSE file for copyright and license details. */ +/* Default settings; can be overriden by command line. */ + +static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ +static int fuzzy = 1; /* -F option; if 0, dmenu doesn't use fuzzy matching */ +/* -fn option overrides fonts[0]; default X11 font or font set */ +static const char *fonts[] = { + "monospace:size=10" +}; +static const char *prompt = NULL; /* -p option; prompt to the left of input field */ +static const char *colors[SchemeLast][2] = { + /* fg bg */ + [SchemeNorm] = { "#bbbbbb", "#222222" }, + [SchemeSel] = { "#eeeeee", "#005577" }, + [SchemeSelHighlight] = { "#ffc978", "#005577" }, + [SchemeNormHighlight] = { "#ffc978", "#222222" }, + [SchemeOut] = { "#000000", "#00ffff" }, + [SchemeHp] = { "#bbbbbb", "#333333" } +}; +/* -l option; if nonzero, dmenu uses vertical list with given number of lines */ +static unsigned int lines = 0; +/* -h option; minimum height of a menu line */ +static unsigned int lineheight = 0; +static unsigned int min_lineheight = 8; + +/* + * Characters not considered part of a word while deleting words + * for example: " /?\"&[]" + */ +static const char worddelimiters[] = " "; diff --git a/suckless/dmenu/config.def.h.rej b/suckless/dmenu/config.def.h.rej new file mode 100644 index 00000000..4168eb57 --- /dev/null +++ b/suckless/dmenu/config.def.h.rej @@ -0,0 +1,25 @@ +--- config.def.h ++++ config.def.h +@@ -6,6 +6,8 @@ static int topbar = 1; /* -b option; if 0, dmenu appears a + static const char *fonts[] = { + "monospace:size=10" + }; ++static const unsigned int bgalpha = 0xe0; ++static const unsigned int fgalpha = OPAQUE; + static const char *prompt = NULL; /* -p option; prompt to the left of input field */ + static const char *colors[SchemeLast][2] = { + /* fg bg */ +@@ -13,6 +15,13 @@ static const char *colors[SchemeLast][2] = { + [SchemeSel] = { "#eeeeee", "#005577" }, + [SchemeOut] = { "#000000", "#00ffff" }, + }; ++static const unsigned int alphas[SchemeLast][2] = { ++ /* fgalpha bgalphga */ ++ [SchemeNorm] = { fgalpha, bgalpha }, ++ [SchemeSel] = { fgalpha, bgalpha }, ++ [SchemeOut] = { fgalpha, bgalpha }, ++}; ++ + /* -l option; if nonzero, dmenu uses vertical list with given number of lines */ + static unsigned int lines = 0; + diff --git a/suckless/dmenu/config.mk b/suckless/dmenu/config.mk index 0c841215..54fb03a5 100644 --- a/suckless/dmenu/config.mk +++ b/suckless/dmenu/config.mk @@ -20,7 +20,8 @@ FREETYPEINC = /usr/include/freetype2 # includes and libs INCS = -I$(X11INC) -I$(FREETYPEINC) -LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) -lm + +LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) -lm -lXrender # flags CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS) diff --git a/suckless/dmenu/config.mk.orig b/suckless/dmenu/config.mk.orig new file mode 100644 index 00000000..54fb03a5 --- /dev/null +++ b/suckless/dmenu/config.mk.orig @@ -0,0 +1,32 @@ +# dmenu version +VERSION = 5.0 + +# paths +PREFIX = /usr/local +MANPREFIX = $(PREFIX)/share/man + +X11INC = /usr/X11R6/include +X11LIB = /usr/X11R6/lib + +# Xinerama, comment if you don't want it +XINERAMALIBS = -lXinerama +XINERAMAFLAGS = -DXINERAMA + +# freetype +FREETYPELIBS = -lfontconfig -lXft +FREETYPEINC = /usr/include/freetype2 +# OpenBSD (uncomment) +#FREETYPEINC = $(X11INC)/freetype2 + +# includes and libs +INCS = -I$(X11INC) -I$(FREETYPEINC) + +LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) -lm -lXrender + +# flags +CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS) +CFLAGS = -std=c99 -pedantic -Wall -Os $(INCS) $(CPPFLAGS) +LDFLAGS = $(LIBS) + +# compiler and linker +CC = cc diff --git a/suckless/dmenu/config.mk.rej b/suckless/dmenu/config.mk.rej new file mode 100644 index 00000000..9b9464bc --- /dev/null +++ b/suckless/dmenu/config.mk.rej @@ -0,0 +1,11 @@ +--- config.mk ++++ config.mk +@@ -20,7 +20,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/suckless/dmenu/dmenu.c b/suckless/dmenu/dmenu.c index 7318551e..fc0c58bc 100644 --- a/suckless/dmenu/dmenu.c +++ b/suckless/dmenu/dmenu.c @@ -21,6 +21,7 @@ #include "util.h" /* macros */ +#define OPAQUE 0xFFU #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]) @@ -57,6 +58,11 @@ static XIC xic; char *censort; static Drw *drw; +static int usergb = 0; +static Visual *visual; +static int depth; +static Colormap cmap; + static Clr *scheme[SchemeLast]; #include "config.h" @@ -65,6 +71,47 @@ static Clr *scheme[SchemeLast]; static int (*fstrncmp)(const char *, const char *, size_t) = strncmp; static char *(*fstrstr)(const char *, const char *) = strstr; + +static void +xinitvisual() +{ + 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); + usergb = 1; + break; + } + } + + XFree(infos); + + if (! visual) { + visual = DefaultVisual(dpy, screen); + depth = DefaultDepth(dpy, screen); + cmap = DefaultColormap(dpy, screen); + } +} + + static char** tokenize(char *source, char *delim, int *llen) { int listlength = 0; @@ -791,7 +838,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], alphas[j], 2); clip = XInternAtom(dpy, "CLIPBOARD", False); utf8 = XInternAtom(dpy, "UTF8_STRING", False); @@ -848,10 +895,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, parentwin, x, y, mw, mh, 0, - CopyFromParent, CopyFromParent, CopyFromParent, - CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); + depth, InputOutput, visual, + CWOverrideRedirect | CWBackPixel | CWColormap | CWEventMask | CWBorderPixel, &swa); XSetClassHint(dpy, win, &ch); @@ -966,7 +1015,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; diff --git a/suckless/dmenu/dmenu_path b/suckless/dmenu/dmenu_path new file mode 100755 index 00000000..3a7cda79 --- /dev/null +++ b/suckless/dmenu/dmenu_path @@ -0,0 +1,13 @@ +#!/bin/sh + +cachedir="${XDG_CACHE_HOME:-"$HOME/.cache"}" +cache="$cachedir/dmenu_run" + +[ ! -e "$cachedir" ] && mkdir -p "$cachedir" + +IFS=: +if stest -dqr -n "$cache" $PATH; then + stest -flx $PATH | sort -u | tee "$cache" +else + cat "$cache" +fi diff --git a/suckless/dmenu/dmenu_run b/suckless/dmenu/dmenu_run new file mode 100755 index 00000000..834ede54 --- /dev/null +++ b/suckless/dmenu/dmenu_run @@ -0,0 +1,2 @@ +#!/bin/sh +dmenu_path | dmenu "$@" | ${SHELL:-"/bin/sh"} & diff --git a/suckless/dmenu/drw.c b/suckless/dmenu/drw.c index 4cdbcbe5..9f6a7b56 100644 --- a/suckless/dmenu/drw.c +++ b/suckless/dmenu/drw.c @@ -61,7 +61,7 @@ utf8decode(const char *c, long *u, size_t clen) } 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)); @@ -70,8 +70,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; @@ -87,7 +90,8 @@ 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 @@ -194,21 +198,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 & 0x00FFFFFFFU) | alpha << 24; } /* 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) +drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount) { size_t i; Clr *ret; @@ -218,7 +222,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; } @@ -274,9 +278,7 @@ 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, - DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen)); + d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap); x += lpad; w -= lpad; } diff --git a/suckless/dmenu/drw.h b/suckless/dmenu/drw.h index 4c67419a..4f66f0d6 100644 --- a/suckless/dmenu/drw.h +++ b/suckless/dmenu/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 *visual, unsigned int depth, Colormap cmap); void drw_resize(Drw *drw, unsigned int w, unsigned int h); void drw_free(Drw *drw); @@ -38,8 +41,8 @@ unsigned int drw_fontset_getwidth(Drw *drw, const char *text); 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); -Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); +void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha); +Clr *drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount); /* Cursor abstraction */ Cur *drw_cur_create(Drw *drw, int shape); diff --git a/suckless/dmenu/patches/dmenu-alpha-4.9.diff b/suckless/dmenu/patches/dmenu-alpha-4.9.diff new file mode 100644 index 00000000..8f0e83e9 --- /dev/null +++ b/suckless/dmenu/patches/dmenu-alpha-4.9.diff @@ -0,0 +1,277 @@ +From 4958fda4cfc1c788443fd880ec6bc18b6380c1a2 Mon Sep 17 00:00:00 2001 +From: Tait Hoyem <44244401+TTWNO@users.noreply.github.com> +Date: Thu, 22 Aug 2019 15:39:48 +0000 +Subject: [PATCH] Add alpha support + +--- + config.def.h | 9 ++++++++ + config.mk | 2 +- + dmenu.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++---- + drw.c | 25 +++++++++++----------- + drw.h | 9 +++++--- + 5 files changed, 85 insertions(+), 20 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 1edb647..595cc41 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -6,6 +6,8 @@ static int topbar = 1; /* -b option; if 0, dmenu appears a + static const char *fonts[] = { + "monospace:size=10" + }; ++static const unsigned int bgalpha = 0xe0; ++static const unsigned int fgalpha = OPAQUE; + static const char *prompt = NULL; /* -p option; prompt to the left of input field */ + static const char *colors[SchemeLast][2] = { + /* fg bg */ +@@ -13,6 +15,13 @@ static const char *colors[SchemeLast][2] = { + [SchemeSel] = { "#eeeeee", "#005577" }, + [SchemeOut] = { "#000000", "#00ffff" }, + }; ++static const unsigned int alphas[SchemeLast][2] = { ++ /* fgalpha bgalphga */ ++ [SchemeNorm] = { fgalpha, bgalpha }, ++ [SchemeSel] = { fgalpha, bgalpha }, ++ [SchemeOut] = { fgalpha, bgalpha }, ++}; ++ + /* -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 0929b4a..260eeae 100644 +--- a/config.mk ++++ b/config.mk +@@ -20,7 +20,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 65f25ce..f88a205 100644 +--- a/dmenu.c ++++ b/dmenu.c +@@ -25,6 +25,9 @@ + #define LENGTH(X) (sizeof X / sizeof X[0]) + #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) + ++/* define opaqueness */ ++#define OPAQUE 0xFFU ++ + /* enums */ + enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ + +@@ -51,6 +54,10 @@ static Window root, parentwin, win; + static XIC xic; + + static Drw *drw; ++static int usergb = 0; ++static Visual *visual; ++static int depth; ++static Colormap cmap; + static Clr *scheme[SchemeLast]; + + #include "config.h" +@@ -58,6 +65,46 @@ static Clr *scheme[SchemeLast]; + static int (*fstrncmp)(const char *, const char *, size_t) = strncmp; + static char *(*fstrstr)(const char *, const char *) = strstr; + ++ ++static void ++xinitvisual() ++{ ++ 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); ++ usergb = 1; ++ break; ++ } ++ } ++ ++ XFree(infos); ++ ++ if (! visual) { ++ visual = DefaultVisual(dpy, screen); ++ depth = DefaultDepth(dpy, screen); ++ cmap = DefaultColormap(dpy, screen); ++ } ++} ++ + static void + appenditem(struct item *item, struct item **list, struct item **last) + { +@@ -602,7 +649,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], alphas[j], 2); + + clip = XInternAtom(dpy, "CLIPBOARD", False); + utf8 = XInternAtom(dpy, "UTF8_STRING", False); +@@ -657,11 +704,15 @@ 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, parentwin, x, y, mw, mh, 0, +- CopyFromParent, CopyFromParent, CopyFromParent, +- CWOverrideRedirect | CWBackPixel | CWEventMask, &swa); ++ depth, InputOutput, visual, ++ CWOverrideRedirect | CWBackPixel | CWColormap | CWEventMask | CWBorderPixel, &swa); + XSetClassHint(dpy, win, &ch); +@@ -747,7 +798,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; +diff --git a/drw.c b/drw.c +index 8fd1ca4..88eb9d8 100644 +--- a/drw.c ++++ b/drw.c +@@ -61,7 +61,7 @@ utf8decode(const char *c, long *u, size_t clen) + } + + 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)); + +@@ -70,8 +70,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; +@@ -87,7 +90,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 +@@ -193,21 +196,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 & 0x00FFFFFFFU) | alpha << 24; + } + + /* 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) ++drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount) + { + size_t i; + Clr *ret; +@@ -217,7 +220,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; + } + +@@ -273,9 +276,7 @@ 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, +- DefaultVisual(drw->dpy, drw->screen), +- DefaultColormap(drw->dpy, drw->screen)); ++ d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap); + x += lpad; + w -= lpad; + } +diff --git a/drw.h b/drw.h +index 4c67419..4f66f0d 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 *visual, unsigned int depth, Colormap cmap); + void drw_resize(Drw *drw, unsigned int w, unsigned int h); + void drw_free(Drw *drw); + +@@ -38,8 +41,8 @@ unsigned int drw_fontset_getwidth(Drw *drw, const char *text); + 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); +-Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); ++void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha); ++Clr *drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount); + + /* Cursor abstraction */ + Cur *drw_cur_create(Drw *drw, int shape); +-- +2.23.0 + diff --git a/suckless/st/config.h b/suckless/st/config.h index b150dc5a..864ce17e 100644 --- a/suckless/st/config.h +++ b/suckless/st/config.h @@ -9,7 +9,7 @@ static char *font = "CaskaydiaCove Nerd Font Mono:pixelsize=16:antialias=true:au static char *font2[] = { "Symbola:pixelsize=16:antialias=true:autohint=true", }; -char *iso14755_cmd = "dmenu -p codepoint: