Re: [dev] [PATCH][dwm] new alpha patch for 56a31dc

From: <joelbars_AT_gmail.com>
Date: Mon, 19 Dec 2016 04:04:38 -0800 (PST)

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