sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | 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