Introduction
Introduction Statistics Contact Development Disclaimer Help
dmenu-alpha-20230110-5.2.diff - sites - public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log
Files
Refs
---
dmenu-alpha-20230110-5.2.diff (9717B)
---
1 From 4709ed81c8b8df043420ca9de016054088beb934 Mon Sep 17 00:00:00 2001
2 From: Andrew Slice <[email protected]>
3 Date: Tue, 10 Jan 2023 17:22:44 -0500
4 Subject: [PATCH] Adds alpha transparency. This also fixes a crash that h…
5 when using '-w' to embed dmenu in a window that has alpha transparency.
6
7 Based on the original patch by Marcin Lukow <[email protected]>
8 ---
9 config.def.h | 7 ++++++
10 config.mk | 2 +-
11 dmenu.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++-----
12 drw.c | 26 ++++++++++++-----------
13 drw.h | 9 +++++---
14 5 files changed, 83 insertions(+), 21 deletions(-)
15
16 diff --git a/config.def.h b/config.def.h
17 index 1edb647..809c96e 100644
18 --- a/config.def.h
19 +++ b/config.def.h
20 @@ -2,6 +2,7 @@
21 /* Default settings; can be overriden by command line. */
22
23 static int topbar = 1; /* -b option; if 0, dmenu …
24 +static const unsigned int alpha = 0xff; /* Amount of opacity. 0xff …
25 /* -fn option overrides fonts[0]; default X11 font or font set */
26 static const char *fonts[] = {
27 "monospace:size=10"
28 @@ -13,6 +14,12 @@ static const char *colors[SchemeLast][2] = {
29 [SchemeSel] = { "#eeeeee", "#005577" },
30 [SchemeOut] = { "#000000", "#00ffff" },
31 };
32 +
33 +static const unsigned int alphas[SchemeLast][2] = {
34 + [SchemeNorm] = { OPAQUE, alpha },
35 + [SchemeSel] = { OPAQUE, alpha },
36 + [SchemeOut] = { OPAQUE, alpha },
37 +};
38 /* -l option; if nonzero, dmenu uses vertical list with given number of…
39 static unsigned int lines = 0;
40
41 diff --git a/config.mk b/config.mk
42 index 566348b..fa2b4fc 100644
43 --- a/config.mk
44 +++ b/config.mk
45 @@ -21,7 +21,7 @@ FREETYPEINC = /usr/include/freetype2
46
47 # includes and libs
48 INCS = -I$(X11INC) -I$(FREETYPEINC)
49 -LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS)
50 +LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) -lXrender
51
52 # flags
53 CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX…
54 diff --git a/dmenu.c b/dmenu.c
55 index 27b7a30..a20302f 100644
56 --- a/dmenu.c
57 +++ b/dmenu.c
58 @@ -10,10 +10,12 @@
59
60 #include <X11/Xlib.h>
61 #include <X11/Xatom.h>
62 +#include <X11/Xproto.h>
63 #include <X11/Xutil.h>
64 #ifdef XINERAMA
65 #include <X11/extensions/Xinerama.h>
66 #endif
67 +#include <X11/extensions/Xrender.h>
68 #include <X11/Xft/Xft.h>
69
70 #include "drw.h"
71 @@ -25,6 +27,8 @@
72 #define LENGTH(X) (sizeof X / sizeof X[0])
73 #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
74
75 +#define OPAQUE 0xffu
76 +
77 /* enums */
78 enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes…
79
80 @@ -53,10 +57,16 @@ static XIC xic;
81 static Drw *drw;
82 static Clr *scheme[SchemeLast];
83
84 +static int useargb = 0;
85 +static Visual *visual;
86 +static int depth;
87 +static Colormap cmap;
88 +
89 #include "config.h"
90
91 static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
92 static char *(*fstrstr)(const char *, const char *) = strstr;
93 +static void xinitvisual();
94
95 static unsigned int
96 textw_clamp(const char *str, unsigned int n)
97 @@ -627,7 +637,7 @@ setup(void)
98 #endif
99 /* init appearance */
100 for (j = 0; j < SchemeLast; j++)
101 - scheme[j] = drw_scm_create(drw, colors[j], 2);
102 + scheme[j] = drw_scm_create(drw, colors[j], alphas[i], 2…
103
104 clip = XInternAtom(dpy, "CLIPBOARD", False);
105 utf8 = XInternAtom(dpy, "UTF8_STRING", False);
106 @@ -682,11 +692,13 @@ setup(void)
107
108 /* create menu window */
109 swa.override_redirect = True;
110 - swa.background_pixel = scheme[SchemeNorm][ColBg].pixel;
111 + swa.background_pixel = 0;
112 + swa.border_pixel = 0;
113 + swa.colormap = cmap;
114 swa.event_mask = ExposureMask | KeyPressMask | VisibilityChange…
115 win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0,
116 - CopyFromParent, CopyFromParent, CopyFromPar…
117 - CWOverrideRedirect | CWBackPixel | CWEventM…
118 + depth, CopyFromParent, visual,
119 + CWOverrideRedirect | CWBackPixel | CWBorder…
120 XSetClassHint(dpy, win, &ch);
121
122
123 @@ -771,7 +783,8 @@ main(int argc, char *argv[])
124 if (!XGetWindowAttributes(dpy, parentwin, &wa))
125 die("could not get embedding window attributes: 0x%lx",
126 parentwin);
127 - drw = drw_create(dpy, screen, root, wa.width, wa.height);
128 + xinitvisual();
129 + drw = drw_create(dpy, screen, root, wa.width, wa.height, visual…
130 if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
131 die("no fonts could be loaded.");
132 lrpad = drw->fonts->h;
133 @@ -793,3 +806,40 @@ main(int argc, char *argv[])
134
135 return 1; /* unreachable */
136 }
137 +
138 +void
139 +xinitvisual()
140 +{
141 + XVisualInfo *infos;
142 + XRenderPictFormat *fmt;
143 + int nitems;
144 + int i;
145 +
146 + XVisualInfo tpl = {
147 + .screen = screen,
148 + .depth = 32,
149 + .class = TrueColor
150 + };
151 + long masks = VisualScreenMask | VisualDepthMask | VisualClassMa…
152 +
153 + infos = XGetVisualInfo(dpy, masks, &tpl, &nitems);
154 + visual = NULL;
155 + for(i = 0; i < nitems; i ++) {
156 + fmt = XRenderFindVisualFormat(dpy, infos[i].visual);
157 + if (fmt->type == PictTypeDirect && fmt->direct.alphaMas…
158 + visual = infos[i].visual;
159 + depth = infos[i].depth;
160 + cmap = XCreateColormap(dpy, root, visual, Allo…
161 + useargb = 1;
162 + break;
163 + }
164 + }
165 +
166 + XFree(infos);
167 +
168 + if (! visual) {
169 + visual = DefaultVisual(dpy, screen);
170 + depth = DefaultDepth(dpy, screen);
171 + cmap = DefaultColormap(dpy, screen);
172 + }
173 +}
174 diff --git a/drw.c b/drw.c
175 index a58a2b4..42700e5 100644
176 --- a/drw.c
177 +++ b/drw.c
178 @@ -61,7 +61,7 @@ utf8decode(const char *c, long *u, size_t clen)
179 }
180
181 Drw *
182 -drw_create(Display *dpy, int screen, Window root, unsigned int w, unsig…
183 +drw_create(Display *dpy, int screen, Window root, unsigned int w, unsig…
184 {
185 Drw *drw = ecalloc(1, sizeof(Drw));
186
187 @@ -70,8 +70,11 @@ drw_create(Display *dpy, int screen, Window root, uns…
188 drw->root = root;
189 drw->w = w;
190 drw->h = h;
191 - drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy…
192 - drw->gc = XCreateGC(dpy, root, 0, NULL);
193 + drw->visual = visual;
194 + drw->depth = depth;
195 + drw->cmap = cmap;
196 + drw->drawable = XCreatePixmap(dpy, root, w, h, depth);
197 + drw->gc = XCreateGC(dpy, drw->drawable, 0, NULL);
198 XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMit…
199
200 return drw;
201 @@ -87,7 +90,7 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h)
202 drw->h = h;
203 if (drw->drawable)
204 XFreePixmap(drw->dpy, drw->drawable);
205 - drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, Defaul…
206 + drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, drw->d…
207 }
208
209 void
210 @@ -181,21 +184,22 @@ drw_fontset_free(Fnt *font)
211 }
212
213 void
214 -drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
215 +drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int a…
216 {
217 if (!drw || !dest || !clrname)
218 return;
219
220 - if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->s…
221 - DefaultColormap(drw->dpy, drw->screen),
222 + if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap,
223 clrname, dest))
224 die("error, cannot allocate color '%s'", clrname);
225 +
226 + dest->pixel = (dest->pixel & 0x00ffffffU) | (alpha << 24);
227 }
228
229 /* Wrapper to create color schemes. The caller has to call free(3) on t…
230 * returned color scheme when done using it. */
231 Clr *
232 -drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
233 +drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alp…
234 {
235 size_t i;
236 Clr *ret;
237 @@ -205,7 +209,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], siz…
238 return NULL;
239
240 for (i = 0; i < clrcount; i++)
241 - drw_clr_create(drw, &ret[i], clrnames[i]);
242 + drw_clr_create(drw, &ret[i], clrnames[i], alphas[i]);
243 return ret;
244 }
245
246 @@ -263,9 +267,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, uns…
247 } else {
248 XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? …
249 XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, …
250 - d = XftDrawCreate(drw->dpy, drw->drawable,
251 - DefaultVisual(drw->dpy, drw->screen),
252 - DefaultColormap(drw->dpy, drw->screen…
253 + d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual,…
254 x += lpad;
255 w -= lpad;
256 }
257 diff --git a/drw.h b/drw.h
258 index fd7631b..48f2f93 100644
259 --- a/drw.h
260 +++ b/drw.h
261 @@ -20,6 +20,9 @@ typedef struct {
262 Display *dpy;
263 int screen;
264 Window root;
265 + Visual *visual;
266 + unsigned int depth;
267 + Colormap cmap;
268 Drawable drawable;
269 GC gc;
270 Clr *scheme;
271 @@ -27,7 +30,7 @@ typedef struct {
272 } Drw;
273
274 /* Drawable abstraction */
275 -Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, u…
276 +Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, u…
277 void drw_resize(Drw *drw, unsigned int w, unsigned int h);
278 void drw_free(Drw *drw);
279
280 @@ -39,8 +42,8 @@ unsigned int drw_fontset_getwidth_clamp(Drw *drw, cons…
281 void drw_font_getexts(Fnt *font, const char *text, unsigned int len, un…
282
283 /* Colorscheme abstraction */
284 -void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
285 -Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
286 +void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned …
287 +Clr *drw_scm_create(Drw *drw, const char *clrnames[], const unsigned in…
288
289 /* Cursor abstraction */
290 Cur *drw_cur_create(Drw *drw, int shape);
291 --
292 2.37.4
293
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.