dwm-alpha-6.4.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-alpha-6.4.diff (9494B)
---
1 From 4ee637701f1144e07338d5990fecb3dc44982223 Mon Sep 17 00:00:00 2001
2 From: NekoCWD <nekodevelopper@gmail.com>
3 Date: Fri, 27 Jan 2023 21:59:15 +0300
4 Subject: [PATCH] [dwm] update 'alpha' path for dwm6.4
5
6 ---
7 config.def.h | 2 ++
8 config.mk | 2 +-
9 drw.c | 27 +++++++++++-----------
10 drw.h | 9 +++++---
11 dwm.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++-----
12 5 files changed, 80 insertions(+), 23 deletions(-)
13
14 diff --git a/config.def.h b/config.def.h
15 index 061ad66..3a4236d 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 ef8acf7..6d41560 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_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
40 diff --git a/drw.c b/drw.c
41 index a58a2b4..10e39f9 100644
42 --- a/drw.c
43 +++ b/drw.c
44 @@ -61,7 +61,7 @@ utf8decode(const char *c, long *u, size_t clen)
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 @@ -70,8 +70,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 @@ -87,7 +90,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 @@ -181,21 +184,20 @@ 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[], unsigned int clralphas[], size_t clrcount)
99 {
100 size_t i;
101 Clr *ret;
102 @@ -205,7 +207,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 @@ -263,9 +265,8 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
112 } else {
113 XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
114 XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
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 +
120 x += lpad;
121 w -= lpad;
122 }
123 diff --git a/drw.h b/drw.h
124 index 6471431..51dc017 100644
125 --- a/drw.h
126 +++ b/drw.h
127 @@ -20,6 +20,9 @@ typedef struct {
128 Display *dpy;
129 int screen;
130 Window root;
131 + Visual *visual;
132 + unsigned int depth;
133 + Colormap cmap;
134 Drawable drawable;
135 GC gc;
136 Clr *scheme;
137 @@ -27,7 +30,7 @@ typedef struct {
138 } Drw;
139
140 /* Drawable abstraction */
141 -Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h);
142 +Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h, Visual*, unsigned int, Colormap);
143 void drw_resize(Drw *drw, unsigned int w, unsigned int h);
144 void drw_free(Drw *drw);
145
146 @@ -39,8 +42,8 @@ unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int
147 void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h);
148
149 /* Colorscheme abstraction */
150 -void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
151 -Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
152 +void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha);
153 +Clr *drw_scm_create(Drw *drw, const char *clrnames[], unsigned int clralphas[], size_t clrcount);
154
155 /* Cursor abstraction */
156 Cur *drw_cur_create(Drw *drw, int shape);
157 diff --git a/dwm.c b/dwm.c
158 index e5efb6a..708ca43 100644
159 --- a/dwm.c
160 +++ b/dwm.c
161 @@ -57,6 +57,10 @@
162 #define TAGMASK ((1 << LENGTH(tags)) - 1)
163 #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
164
165 +#define OPAQUE 0xffU
166 +
167 +#define OPAQUE 0xffU
168 +
169 /* enums */
170 enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
171 enum { SchemeNorm, SchemeSel }; /* color schemes */
172 @@ -233,6 +237,7 @@ static Monitor *wintomon(Window w);
173 static int xerror(Display *dpy, XErrorEvent *ee);
174 static int xerrordummy(Display *dpy, XErrorEvent *ee);
175 static int xerrorstart(Display *dpy, XErrorEvent *ee);
176 +static void xinitvisual();
177 static void zoom(const Arg *arg);
178
179 /* variables */
180 @@ -269,6 +274,11 @@ static Drw *drw;
181 static Monitor *mons, *selmon;
182 static Window root, wmcheckwin;
183
184 +static int useargb = 0;
185 +static Visual *visual;
186 +static int depth;
187 +static Colormap cmap;
188 +
189 /* configuration, allows nested code to access above variables */
190 #include "config.h"
191
192 @@ -1542,7 +1552,8 @@ setup(void)
193 sw = DisplayWidth(dpy, screen);
194 sh = DisplayHeight(dpy, screen);
195 root = RootWindow(dpy, screen);
196 - drw = drw_create(dpy, screen, root, sw, sh);
197 + xinitvisual();
198 + drw = drw_create(dpy, screen, root, sw, sh, visual, depth, cmap);
199 if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
200 die("no fonts could be loaded.");
201 lrpad = drw->fonts->h;
202 @@ -1569,8 +1580,9 @@ setup(void)
203 cursor[CurMove] = drw_cur_create(drw, XC_fleur);
204 /* init appearance */
205 scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
206 + unsigned int alphas[] = {borderalpha, baralpha, OPAQUE};
207 for (i = 0; i < LENGTH(colors); i++)
208 - scheme[i] = drw_scm_create(drw, colors[i], 3);
209 + scheme[i] = drw_scm_create(drw, colors[i], alphas, 3);
210 /* init bars */
211 updatebars();
212 updatestatus();
213 @@ -1803,16 +1815,18 @@ updatebars(void)
214 Monitor *m;
215 XSetWindowAttributes wa = {
216 .override_redirect = True,
217 - .background_pixmap = ParentRelative,
218 + .background_pixel = 0,
219 + .border_pixel = 0,
220 + .colormap = cmap,
221 .event_mask = ButtonPressMask|ExposureMask
222 };
223 XClassHint ch = {"dwm", "dwm"};
224 for (m = mons; m; m = m->next) {
225 if (m->barwin)
226 continue;
227 - m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
228 - CopyFromParent, DefaultVisual(dpy, screen),
229 - CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
230 + m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, depth,
231 + InputOutput, visual,
232 + CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa);
233 XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
234 XMapRaised(dpy, m->barwin);
235 XSetClassHint(dpy, m->barwin, &ch);
236 @@ -2110,6 +2124,43 @@ xerrorstart(Display *dpy, XErrorEvent *ee)
237 return -1;
238 }
239
240 +void
241 +xinitvisual()
242 +{
243 + XVisualInfo *infos;
244 + XRenderPictFormat *fmt;
245 + int nitems;
246 + int i;
247 +
248 + XVisualInfo tpl = {
249 + .screen = screen,
250 + .depth = 32,
251 + .class = TrueColor
252 + };
253 + long masks = VisualScreenMask | VisualDepthMask | VisualClassMask;
254 +
255 + infos = XGetVisualInfo(dpy, masks, &tpl, &nitems);
256 + visual = NULL;
257 + for(i = 0; i < nitems; i ++) {
258 + fmt = XRenderFindVisualFormat(dpy, infos[i].visual);
259 + if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) {
260 + visual = infos[i].visual;
261 + depth = infos[i].depth;
262 + cmap = XCreateColormap(dpy, root, visual, AllocNone);
263 + useargb = 1;
264 + break;
265 + }
266 + }
267 +
268 + XFree(infos);
269 +
270 + if (! visual) {
271 + visual = DefaultVisual(dpy, screen);
272 + depth = DefaultDepth(dpy, screen);
273 + cmap = DefaultColormap(dpy, screen);
274 + }
275 +}
276 +
277 void
278 zoom(const Arg *arg)
279 {
280 --
281 2.39.1
282