URI: 
       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