Re: [dev] [PATCH][dwm] new alpha patch for 56a31dc
 
Hi Eon,
Thanks for this code is working perfectly. I know that this is a little old 
thread but, I wanted to know if you made this patch work with systray, I 
tried but I couldn't find the reason, if I activate systray and this patch 
dwm doesn't start. I really appreciate if you could help me, I'm supposing 
that the problem is on updatebars(), I think that systray needs something 
on this method to work properly and I don't have the necessary knowledge to 
fix.
Best regards and thanks for your really great work.
Em segunda-feira, 18 de julho de 2016 10:50:52 UTC-3, Eon S. Jeon escreveu:
>
> This is a new version of 'alpha' patch for dwm, which reflects breaking 
> changes 
> made regarding color schemes. Alpha values for foreground, background, and 
> border now can be configured independently in a very straight-forward way. 
> The 
> rest stays the same. 
>
> --- 
>  config.def.h |  3 +++ 
>  config.mk    |  2 +- 
>  drw.c        | 27 ++++++++++++++------------- 
>  drw.h        |  9 ++++++--- 
>  dwm.c        | 60 
> +++++++++++++++++++++++++++++++++++++++++++++++++++++------- 
>  5 files changed, 77 insertions(+), 24 deletions(-) 
>
> diff --git a/config.def.h b/config.def.h 
> index fd77a07..aacab7b 100644 
> --- a/config.def.h 
> +++ b/config.def.h 
> _AT__AT_ -18,6 +18,9 @@ static const char *colors[SchemeLast][3]      = { 
>          [SchemeSel] =  { col_gray4, col_cyan,  col_cyan  }, 
>  }; 
>   
> +/* alpha */ 
> +static const unsigned int alpha_scheme[3] = { 0xff, 0xdd, 0xff }; 
> + 
>  /* tagging */ 
>  static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" 
> }; 
>   
> diff --git a/config.mk b/config.mk 
> index 80dc936..2c62e89 100644 
> --- a/config.mk 
> +++ b/config.mk 
> _AT__AT_ -22,7 +22,7 @@ FREETYPEINC = /usr/include/freetype2 
>   
>  # includes and libs 
>  INCS = -I${X11INC} -I${FREETYPEINC} 
> -LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} 
> +LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lXrender 
>   
>  # flags 
>  CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 
> -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} 
> diff --git a/drw.c b/drw.c 
> index 987e53b..8cfc55c 100644 
> --- a/drw.c 
> +++ b/drw.c 
> _AT__AT_ -61,7 +61,7 @@ utf8decode(const char *c, long *u, size_t clen) 
>  } 
>   
>  Drw * 
> -drw_create(Display *dpy, int screen, Window root, unsigned int w, 
> unsigned int h) 
> +drw_create(Display *dpy, int screen, Window root, unsigned int w, 
> unsigned int h, Visual *visual, unsigned int depth, Colormap cmap) 
>  { 
>          Drw *drw = ecalloc(1, sizeof(Drw)); 
>   
> _AT__AT_ -70,8 +70,11 @@ drw_create(Display *dpy, int screen, Window root, 
> unsigned int w, unsigned int h 
>          drw->root = root; 
>          drw->w = w; 
>          drw->h = h; 
> -        drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, 
> screen)); 
> -        drw->gc = XCreateGC(dpy, root, 0, NULL); 
> +        drw->visual = visual; 
> +        drw->depth = depth; 
> +        drw->cmap = cmap; 
> +        drw->drawable = XCreatePixmap(dpy, root, w, h, depth); 
> +        drw->gc = XCreateGC(dpy, drw->drawable, 0, NULL); 
>          XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, 
> JoinMiter); 
>   
>          return drw; 
> _AT__AT_ -87,7 +90,7 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h) 
>          drw->h = h; 
>          if (drw->drawable) 
>                  XFreePixmap(drw->dpy, drw->drawable); 
> -        drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, 
> DefaultDepth(drw->dpy, drw->screen)); 
> +        drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, 
> drw->depth); 
>  } 
>   
>  void 
> _AT__AT_ -180,21 +183,21 @@ drw_fontset_free(Fnt *font) 
>  } 
>   
>  void 
> -drw_clr_create(Drw *drw, XftColor *dest, const char *clrname) 
> +drw_clr_create(Drw *drw, XftColor *dest, const char *clrname, unsigned 
> int alpha) 
>  { 
>          if (!drw || !dest || !clrname) 
>                  return; 
>   
> -        if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, 
> drw->screen), 
> -                               DefaultColormap(drw->dpy, drw->screen), 
> -                               clrname, dest)) 
> +        if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap, clrname, 
> dest)) 
>                  die("error, cannot allocate color '%s'\n", clrname); 
> + 
> +        dest->pixel = (dest->pixel & 0x00ffffffU) | (alpha << 24); 
>  } 
>   
>  /* Wrapper to create color schemes. The caller has to call free(3) on the 
>   * returned color scheme when done using it. */ 
>  Scm 
> -drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) 
> +drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount, const 
> unsigned int alphas[]) 
>  { 
>          size_t i; 
>          Scm ret; 
> _AT__AT_ -204,7 +207,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], 
> size_t clrcount) 
>                  return NULL; 
>   
>          for (i = 0; i < clrcount; i++) 
> -                drw_clr_create(drw, &ret[i], clrnames[i]); 
> +                drw_clr_create(drw, &ret[i], clrnames[i], alphas[i]); 
>          return ret; 
>  } 
>   
> _AT__AT_ -260,9 +263,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, 
> unsigned int h, unsigned int lp 
>          } else { 
>                  XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? 
> ColFg : ColBg].pixel); 
>                  XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, 
> h); 
> -                d = XftDrawCreate(drw->dpy, drw->drawable, 
> -                                  DefaultVisual(drw->dpy, drw->screen), 
> -                                  DefaultColormap(drw->dpy, 
> drw->screen)); 
> +                d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, 
> drw->cmap); 
>                  x += lpad; 
>                  w -= lpad; 
>          } 
> diff --git a/drw.h b/drw.h 
> index ff4355b..3cfd254 100644 
> --- a/drw.h 
> +++ b/drw.h 
> _AT__AT_ -20,6 +20,9 @@ typedef struct { 
>          Display *dpy; 
>          int screen; 
>          Window root; 
> +        Visual *visual; 
> +        unsigned int depth; 
> +        Colormap cmap; 
>          Drawable drawable; 
>          GC gc; 
>          Scm scheme; 
> _AT__AT_ -27,7 +30,7 @@ typedef struct { 
>  } Drw; 
>   
>  /* Drawable abstraction */ 
> -Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, 
> unsigned int h); 
> +Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, 
> unsigned int h, Visual* visual, unsigned int depth, Colormap cmap); 
>  void drw_resize(Drw *drw, unsigned int w, unsigned int h); 
>  void drw_free(Drw *drw); 
>   
> _AT__AT_ -38,8 +41,8 @@ unsigned int drw_fontset_getwidth(Drw *drw, const char 
> *text); 
>  void drw_font_getexts(Fnt *font, const char *text, unsigned int len, 
> unsigned int *w, unsigned int *h); 
>   
>  /* Colorscheme abstraction */ 
> -void drw_clr_create(Drw *drw, XftColor *dest, const char *clrname); 
> -Scm drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); 
> +void drw_clr_create(Drw *drw, XftColor *dest, const char *clrname, 
> unsigned int alpha); 
> +Scm drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount, 
> const unsigned int alphas[]); 
>   
>  /* Cursor abstraction */ 
>  Cur *drw_cur_create(Drw *drw, int shape); 
> diff --git a/dwm.c b/dwm.c 
> index b2bc9bd..304f2a9 100644 
> --- a/dwm.c 
> +++ b/dwm.c 
> _AT__AT_ -233,6 +233,7 @@ static Monitor *wintomon(Window w); 
>  static int xerror(Display *dpy, XErrorEvent *ee); 
>  static int xerrordummy(Display *dpy, XErrorEvent *ee); 
>  static int xerrorstart(Display *dpy, XErrorEvent *ee); 
> +static void xinitvisual(); 
>  static void zoom(const Arg *arg); 
>   
>  /* variables */ 
> _AT__AT_ -269,6 +270,11 @@ static Drw *drw; 
>  static Monitor *mons, *selmon; 
>  static Window root; 
>   
> +static int useargb = 0; 
> +static Visual *visual; 
> +static int depth; 
> +static Colormap cmap; 
> + 
>  /* configuration, allows nested code to access above variables */ 
>  #include "config.h" 
>   
> _AT__AT_ -1559,7 +1565,8 @@ setup(void) 
>          sw = DisplayWidth(dpy, screen); 
>          sh = DisplayHeight(dpy, screen); 
>          root = RootWindow(dpy, screen); 
> -        drw = drw_create(dpy, screen, root, sw, sh); 
> +        xinitvisual(); 
> +        drw = drw_create(dpy, screen, root, sw, sh, visual, depth, cmap); 
>          if (!drw_fontset_create(drw, fonts, LENGTH(fonts))) 
>                  die("no fonts could be loaded.\n"); 
>          lrpad = drw->fonts->h; 
> _AT__AT_ -1583,8 +1590,8 @@ setup(void) 
>          cursor[CurResize] = drw_cur_create(drw, XC_sizing); 
>          cursor[CurMove] = drw_cur_create(drw, XC_fleur); 
>          /* init appearance */ 
> -        scheme[SchemeNorm] = drw_scm_create(drw, colors[SchemeNorm], 3); 
> -        scheme[SchemeSel] = drw_scm_create(drw, colors[SchemeSel], 3); 
> +        scheme[SchemeNorm] = drw_scm_create(drw, colors[SchemeNorm], 3, 
> alpha_scheme); 
> +        scheme[SchemeSel] = drw_scm_create(drw, colors[SchemeSel], 3, 
> alpha_scheme); 
>          /* init bars */ 
>          updatebars(); 
>          updatestatus(); 
> _AT__AT_ -1797,15 +1804,17 @@ updatebars(void) 
>          Monitor *m; 
>          XSetWindowAttributes wa = { 
>                  .override_redirect = True, 
> -                .background_pixmap = ParentRelative, 
> +                .background_pixel = 0, 
> +                .border_pixel = 0, 
> +                .colormap = cmap, 
>                  .event_mask = ButtonPressMask|ExposureMask 
>          }; 
>          for (m = mons; m; m = m->next) { 
>                  if (m->barwin) 
>                          continue; 
> -                m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, 
> bh, 0, DefaultDepth(dpy, screen), 
> -                                          CopyFromParent, 
> DefaultVisual(dpy, screen), 
> -                                         
>  CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); 
> +                m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, 
> bh, 0, depth, 
> +                                          InputOutput, visual, 
> +                                         
>  CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa); 
>                  XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); 
>                  XMapRaised(dpy, m->barwin); 
>          } 
> _AT__AT_ -2106,6 +2115,43 @@ xerrorstart(Display *dpy, XErrorEvent *ee) 
>  } 
>   
>  void 
> +xinitvisual() 
> +{ 
> +        XVisualInfo *infos; 
> +        XRenderPictFormat *fmt; 
> +        int nitems; 
> +        int i; 
> + 
> +        XVisualInfo tpl = { 
> +                .screen = screen, 
> +                .depth = 32, 
> +                .class = TrueColor 
> +        }; 
> +        long masks = VisualScreenMask | VisualDepthMask | 
> VisualClassMask; 
> + 
> +        infos = XGetVisualInfo(dpy, masks, &tpl, &nitems); 
> +        visual = NULL; 
> +        for(i = 0; i < nitems; i ++) { 
> +                fmt = XRenderFindVisualFormat(dpy, infos[i].visual); 
> +                if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) 
> { 
> +                        visual = infos[i].visual; 
> +                        depth = infos[i].depth; 
> +                        cmap = XCreateColormap(dpy, root, visual, 
> AllocNone); 
> +                        useargb = 1; 
> +                        break; 
> +                } 
> +        } 
> + 
> +        XFree(infos); 
> + 
> +        if (! visual) { 
> +                visual = DefaultVisual(dpy, screen); 
> +                depth = DefaultDepth(dpy, screen); 
> +                cmap = DefaultColormap(dpy, screen); 
> +        } 
> +} 
> + 
> +void 
>  zoom(const Arg *arg) 
>  { 
>          Client *c = selmon->sel; 
> -- 
> 2.9.0 
>
>
>
Received on Mon Dec 19 2016 - 13:04:38 CET
This archive was generated by hypermail 2.3.0
: Mon Dec 19 2016 - 13:12:13 CET