dwm-alpha-20250918-74edc27.diff - sites - public wiki contents of suckless.org
HTML git clone git://git.suckless.org/sites
DIR Log
DIR Files
DIR Refs
---
dwm-alpha-20250918-74edc27.diff (9386B)
---
1 From 01d98d7b50b7844126c2adf200d984d9bd2df2db Mon Sep 17 00:00:00 2001
2 From: pml68 <contact@pml68.dev>
3 Date: Thu, 18 Sep 2025 18:50:50 +0200
4 Subject: [PATCH] update 'alpha' patch for dwm commit 74edc27
5
6 ---
7 config.def.h | 2 ++
8 config.mk | 2 +-
9 drw.c | 25 +++++++++++-----------
10 drw.h | 9 +++++---
11 dwm.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++------
12 5 files changed, 76 insertions(+), 22 deletions(-)
13
14 diff --git a/config.def.h b/config.def.h
15 index 81c3fc0..1680db5 100644
16 --- a/config.def.h
17 +++ b/config.def.h
18 @@ -7,6 +7,8 @@ static const int showbar = 1; /* 0 means no bar */
19 static const int topbar = 1; /* 0 means bottom bar */
20 static const char *fonts[] = { "monospace:size=10" };
21 static const char dmenufont[] = "monospace:size=10";
22 +static unsigned int baralpha = 0xd0;
23 +static unsigned int borderalpha = OPAQUE;
24 static const char col_gray1[] = "#222222";
25 static const char col_gray2[] = "#444444";
26 static const char col_gray3[] = "#bbbbbb";
27 diff --git a/config.mk b/config.mk
28 index b469a2b..31b21ef 100644
29 --- a/config.mk
30 +++ b/config.mk
31 @@ -23,7 +23,7 @@ FREETYPEINC = /usr/include/freetype2
32
33 # includes and libs
34 INCS = -I${X11INC} -I${FREETYPEINC}
35 -LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
36 +LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lXrender
37
38 # flags
39 CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
40 diff --git a/drw.c b/drw.c
41 index c41e6af..201d8be 100644
42 --- a/drw.c
43 +++ b/drw.c
44 @@ -47,7 +47,7 @@ utf8decode(const char *s_in, long *u, int *err)
45 }
46
47 Drw *
48 -drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h)
49 +drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap)
50 {
51 Drw *drw = ecalloc(1, sizeof(Drw));
52
53 @@ -56,8 +56,11 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h
54 drw->root = root;
55 drw->w = w;
56 drw->h = h;
57 - drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen));
58 - drw->gc = XCreateGC(dpy, root, 0, NULL);
59 + drw->visual = visual;
60 + drw->depth = depth;
61 + drw->cmap = cmap;
62 + drw->drawable = XCreatePixmap(dpy, root, w, h, depth);
63 + drw->gc = XCreateGC(dpy, drw->drawable, 0, NULL);
64 XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
65
66 return drw;
67 @@ -73,7 +76,7 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h)
68 drw->h = h;
69 if (drw->drawable)
70 XFreePixmap(drw->dpy, drw->drawable);
71 - drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen));
72 + drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, drw->depth);
73 }
74
75 void
76 @@ -167,21 +170,21 @@ drw_fontset_free(Fnt *font)
77 }
78
79 void
80 -drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
81 +drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha)
82 {
83 if (!drw || !dest || !clrname)
84 return;
85
86 - if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
87 - DefaultColormap(drw->dpy, drw->screen),
88 + if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap,
89 clrname, dest))
90 die("error, cannot allocate color '%s'", clrname);
91 + dest->pixel = (dest->pixel & 0x00ffffffU) | (alpha << 24);
92 }
93
94 /* Wrapper to create color schemes. The caller has to call free(3) on the
95 * returned color scheme when done using it. */
96 Clr *
97 -drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
98 +drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int clralphas[], size_t clrcount)
99 {
100 size_t i;
101 Clr *ret;
102 @@ -191,7 +194,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
103 return NULL;
104
105 for (i = 0; i < clrcount; i++)
106 - drw_clr_create(drw, &ret[i], clrnames[i]);
107 + drw_clr_create(drw, &ret[i], clrnames[i], clralphas[i]);
108 return ret;
109 }
110
111 @@ -250,9 +253,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
112 XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
113 if (w < lpad)
114 return x + w;
115 - d = XftDrawCreate(drw->dpy, drw->drawable,
116 - DefaultVisual(drw->dpy, drw->screen),
117 - DefaultColormap(drw->dpy, drw->screen));
118 + d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap);
119 x += lpad;
120 w -= lpad;
121 }
122 diff --git a/drw.h b/drw.h
123 index 6471431..670dfc3 100644
124 --- a/drw.h
125 +++ b/drw.h
126 @@ -20,6 +20,9 @@ typedef struct {
127 Display *dpy;
128 int screen;
129 Window root;
130 + Visual *visual;
131 + unsigned int depth;
132 + Colormap cmap;
133 Drawable drawable;
134 GC gc;
135 Clr *scheme;
136 @@ -27,7 +30,7 @@ typedef struct {
137 } Drw;
138
139 /* Drawable abstraction */
140 -Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h);
141 +Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap);
142 void drw_resize(Drw *drw, unsigned int w, unsigned int h);
143 void drw_free(Drw *drw);
144
145 @@ -39,8 +42,8 @@ unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int
146 void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h);
147
148 /* Colorscheme abstraction */
149 -void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
150 -Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
151 +void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha);
152 +Clr *drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int clralphas[], size_t clrcount);
153
154 /* Cursor abstraction */
155 Cur *drw_cur_create(Drw *drw, int shape);
156 diff --git a/dwm.c b/dwm.c
157 index 4cf07eb..01b784d 100644
158 --- a/dwm.c
159 +++ b/dwm.c
160 @@ -56,6 +56,8 @@
161 #define TAGMASK ((1 << LENGTH(tags)) - 1)
162 #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
163
164 +#define OPAQUE 0xffU
165 +
166 /* enums */
167 enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
168 enum { SchemeNorm, SchemeSel }; /* color schemes */
169 @@ -231,6 +233,7 @@ static Monitor *wintomon(Window w);
170 static int xerror(Display *dpy, XErrorEvent *ee);
171 static int xerrordummy(Display *dpy, XErrorEvent *ee);
172 static int xerrorstart(Display *dpy, XErrorEvent *ee);
173 +static void xinitvisual(void);
174 static void zoom(const Arg *arg);
175
176 /* variables */
177 @@ -266,6 +269,10 @@ static Display *dpy;
178 static Drw *drw;
179 static Monitor *mons, *selmon;
180 static Window root, wmcheckwin;
181 +static int useargb = 0;
182 +static Visual *visual;
183 +static int depth;
184 +static Colormap cmap;
185
186 /* configuration, allows nested code to access above variables */
187 #include "config.h"
188 @@ -1557,7 +1564,8 @@ setup(void)
189 sw = DisplayWidth(dpy, screen);
190 sh = DisplayHeight(dpy, screen);
191 root = RootWindow(dpy, screen);
192 - drw = drw_create(dpy, screen, root, sw, sh);
193 + xinitvisual();
194 + drw = drw_create(dpy, screen, root, sw, sh, visual, depth, cmap);
195 if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
196 die("no fonts could be loaded.");
197 lrpad = drw->fonts->h;
198 @@ -1584,8 +1592,9 @@ setup(void)
199 cursor[CurMove] = drw_cur_create(drw, XC_fleur);
200 /* init appearance */
201 scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
202 + unsigned int alphas[] = {borderalpha, baralpha, OPAQUE};
203 for (i = 0; i < LENGTH(colors); i++)
204 - scheme[i] = drw_scm_create(drw, colors[i], 3);
205 + scheme[i] = drw_scm_create(drw, colors[i], alphas, 3);
206 /* init bars */
207 updatebars();
208 updatestatus();
209 @@ -1820,16 +1829,18 @@ updatebars(void)
210 Monitor *m;
211 XSetWindowAttributes wa = {
212 .override_redirect = True,
213 - .background_pixmap = ParentRelative,
214 + .background_pixel = 0,
215 + .border_pixel = 0,
216 + .colormap = cmap,
217 .event_mask = ButtonPressMask|ExposureMask
218 };
219 XClassHint ch = {"dwm", "dwm"};
220 for (m = mons; m; m = m->next) {
221 if (m->barwin)
222 continue;
223 - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
224 - CopyFromParent, DefaultVisual(dpy, screen),
225 - CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
226 + m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, depth,
227 + InputOutput, visual,
228 + CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa);
229 XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
230 XMapRaised(dpy, m->barwin);
231 XSetClassHint(dpy, m->barwin, &ch);
232 @@ -2127,6 +2138,43 @@ xerrorstart(Display *dpy, XErrorEvent *ee)
233 return -1;
234 }
235
236 +void
237 +xinitvisual(void)
238 +{
239 + XVisualInfo *infos;
240 + XRenderPictFormat *fmt;
241 + int nitems;
242 + int i;
243 +
244 + XVisualInfo tpl = {
245 + .screen = screen,
246 + .depth = 32,
247 + .class = TrueColor
248 + };
249 + long masks = VisualScreenMask | VisualDepthMask | VisualClassMask;
250 +
251 + infos = XGetVisualInfo(dpy, masks, &tpl, &nitems);
252 + visual = NULL;
253 + for(i = 0; i < nitems; i++) {
254 + fmt = XRenderFindVisualFormat(dpy, infos[i].visual);
255 + if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) {
256 + visual = infos[i].visual;
257 + depth = infos[i].depth;
258 + cmap = XCreateColormap(dpy, root, visual, AllocNone);
259 + useargb = 1;
260 + break;
261 + }
262 + }
263 +
264 + XFree(infos);
265 +
266 + if (!visual) {
267 + visual = DefaultVisual(dpy, screen);
268 + depth = DefaultDepth(dpy, screen);
269 + cmap = DefaultColormap(dpy, screen);
270 + }
271 +}
272 +
273 void
274 zoom(const Arg *arg)
275 {
276 --
277 2.51.0
278