dmenu-alpha-20210605-1a13d04.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dmenu-alpha-20210605-1a13d04.diff (8685B)
       ---
            1 diff --git a/config.def.h b/config.def.h
            2 index 1edb647..697d511 100644
            3 --- a/config.def.h
            4 +++ b/config.def.h
            5 @@ -2,6 +2,7 @@
            6  /* Default settings; can be overriden by command line. */
            7  
            8  static int topbar = 1;                      /* -b  option; if 0, dmenu appears at bottom     */
            9 +static const unsigned int alpha = 0xf0;
           10  /* -fn option overrides fonts[0]; default X11 font or font set */
           11  static const char *fonts[] = {
           12          "monospace:size=10"
           13 @@ -13,6 +14,13 @@ static const char *colors[SchemeLast][2] = {
           14          [SchemeSel] = { "#eeeeee", "#005577" },
           15          [SchemeOut] = { "#000000", "#00ffff" },
           16  };
           17 +
           18 +static const unsigned int alphas[SchemeLast][2] = {
           19 +        [SchemeNorm] = { OPAQUE, alpha },
           20 +        [SchemeSel] = { OPAQUE, alpha },
           21 +        [SchemeOut] = { OPAQUE, alpha },
           22 +};
           23 +
           24  /* -l option; if nonzero, dmenu uses vertical list with given number of lines */
           25  static unsigned int lines      = 0;
           26  
           27 diff --git a/dmenu.c b/dmenu.c
           28 index 65f25ce..3e56e1a 100644
           29 --- a/dmenu.c
           30 +++ b/dmenu.c
           31 @@ -10,6 +10,7 @@
           32  
           33  #include <X11/Xlib.h>
           34  #include <X11/Xatom.h>
           35 +#include <X11/Xproto.h>
           36  #include <X11/Xutil.h>
           37  #ifdef XINERAMA
           38  #include <X11/extensions/Xinerama.h>
           39 @@ -25,6 +26,8 @@
           40  #define LENGTH(X)             (sizeof X / sizeof X[0])
           41  #define TEXTW(X)              (drw_fontset_getwidth(drw, (X)) + lrpad)
           42  
           43 +#define OPAQUE                0xffU
           44 +
           45  /* enums */
           46  enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */
           47  
           48 @@ -53,10 +56,16 @@ static XIC xic;
           49  static Drw *drw;
           50  static Clr *scheme[SchemeLast];
           51  
           52 +static int useargb = 0;
           53 +static Visual *visual;
           54 +static int depth;
           55 +static Colormap cmap;
           56 +
           57  #include "config.h"
           58  
           59  static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
           60  static char *(*fstrstr)(const char *, const char *) = strstr;
           61 +static void xinitvisual();
           62  
           63  static void
           64  appenditem(struct item *item, struct item **list, struct item **last)
           65 @@ -602,7 +611,7 @@ setup(void)
           66  #endif
           67          /* init appearance */
           68          for (j = 0; j < SchemeLast; j++)
           69 -                scheme[j] = drw_scm_create(drw, colors[j], 2);
           70 +                scheme[j] = drw_scm_create(drw, colors[j], alphas[i], 2);
           71  
           72          clip = XInternAtom(dpy, "CLIPBOARD",   False);
           73          utf8 = XInternAtom(dpy, "UTF8_STRING", False);
           74 @@ -640,6 +649,7 @@ setup(void)
           75                  x = info[i].x_org;
           76                  y = info[i].y_org + (topbar ? 0 : info[i].height - mh);
           77                  mw = info[i].width;
           78 +
           79                  XFree(info);
           80          } else
           81  #endif
           82 @@ -657,11 +667,13 @@ setup(void)
           83  
           84          /* create menu window */
           85          swa.override_redirect = True;
           86 -        swa.background_pixel = scheme[SchemeNorm][ColBg].pixel;
           87 +        swa.background_pixel = 0;
           88 +        swa.border_pixel = 0;
           89 +        swa.colormap = cmap;
           90          swa.event_mask = ExposureMask | KeyPressMask | VisibilityChangeMask;
           91 -        win = XCreateWindow(dpy, parentwin, x, y, mw, mh, 0,
           92 -                            CopyFromParent, CopyFromParent, CopyFromParent,
           93 -                            CWOverrideRedirect | CWBackPixel | CWEventMask, &swa);
           94 +        win = XCreateWindow(dpy, parentwin, x, y, mw, mh, border_width,
           95 +                            depth, CopyFromParent, visual,
           96 +                            CWOverrideRedirect | CWBackPixel | CWBorderPixel | CWColormap | CWEventMask, &swa);
           97          XSetClassHint(dpy, win, &ch);
           98  
           99  
          100 @@ -747,7 +759,8 @@ main(int argc, char *argv[])
          101          if (!XGetWindowAttributes(dpy, parentwin, &wa))
          102                  die("could not get embedding window attributes: 0x%lx",
          103                      parentwin);
          104 -        drw = drw_create(dpy, screen, root, wa.width, wa.height);
          105 +        xinitvisual();
          106 +        drw = drw_create(dpy, screen, root, wa.width, wa.height, visual, depth, cmap);
          107          if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
          108                  die("no fonts could be loaded.");
          109          lrpad = drw->fonts->h;
          110 @@ -769,3 +782,40 @@ main(int argc, char *argv[])
          111  
          112          return 1; /* unreachable */
          113  }
          114 +
          115 + void
          116 +xinitvisual()
          117 +{
          118 +        XVisualInfo *infos;
          119 +        XRenderPictFormat *fmt;
          120 +        int nitems;
          121 +        int i;
          122 +
          123 +        XVisualInfo tpl = {
          124 +                .screen = screen,
          125 +                .depth = 32,
          126 +                .class = TrueColor
          127 +        };
          128 +        long masks = VisualScreenMask | VisualDepthMask | VisualClassMask;
          129 +
          130 +        infos = XGetVisualInfo(dpy, masks, &tpl, &nitems);
          131 +        visual = NULL;
          132 +        for(i = 0; i < nitems; i ++) {
          133 +                fmt = XRenderFindVisualFormat(dpy, infos[i].visual);
          134 +                if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) {
          135 +                        visual = infos[i].visual;
          136 +                        depth = infos[i].depth;
          137 +                        cmap = XCreateColormap(dpy, root, visual, AllocNone);
          138 +                        useargb = 1;
          139 +                        break;
          140 +                }
          141 +        }
          142 +
          143 +        XFree(infos);
          144 +
          145 +        if (! visual) {
          146 +                visual = DefaultVisual(dpy, screen);
          147 +                depth = DefaultDepth(dpy, screen);
          148 +                cmap = DefaultColormap(dpy, screen);
          149 +        }
          150 +}
          151 diff --git a/drw.c b/drw.c
          152 index 4cdbcbe..fe3aadd 100644
          153 --- a/drw.c
          154 +++ b/drw.c
          155 @@ -61,7 +61,7 @@ utf8decode(const char *c, long *u, size_t clen)
          156  }
          157  
          158  Drw *
          159 -drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h)
          160 +drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap)
          161  {
          162          Drw *drw = ecalloc(1, sizeof(Drw));
          163  
          164 @@ -70,8 +70,11 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h
          165          drw->root = root;
          166          drw->w = w;
          167          drw->h = h;
          168 -        drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen));
          169 -        drw->gc = XCreateGC(dpy, root, 0, NULL);
          170 +        drw->visual = visual;
          171 +        drw->depth = depth;
          172 +        drw->cmap = cmap;
          173 +        drw->drawable = XCreatePixmap(dpy, root, w, h, depth);
          174 +        drw->gc = XCreateGC(dpy, drw->drawable, 0, NULL);
          175          XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
          176  
          177          return drw;
          178 @@ -87,7 +90,7 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h)
          179          drw->h = h;
          180          if (drw->drawable)
          181                  XFreePixmap(drw->dpy, drw->drawable);
          182 -        drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen));
          183 +        drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, drw->depth);
          184  }
          185  
          186  void
          187 @@ -194,21 +197,22 @@ drw_fontset_free(Fnt *font)
          188  }
          189  
          190  void
          191 -drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
          192 +drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha)
          193  {
          194          if (!drw || !dest || !clrname)
          195                  return;
          196  
          197 -        if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
          198 -                               DefaultColormap(drw->dpy, drw->screen),
          199 +        if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap,
          200                                 clrname, dest))
          201                  die("error, cannot allocate color '%s'", clrname);
          202 +
          203 +        dest->pixel = (dest->pixel & 0x00ffffffU) | (alpha << 24);
          204  }
          205  
          206  /* Wrapper to create color schemes. The caller has to call free(3) on the
          207   * returned color scheme when done using it. */
          208  Clr *
          209 -drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
          210 +drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount)
          211  {
          212          size_t i;
          213          Clr *ret;
          214 @@ -218,7 +222,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
          215                  return NULL;
          216  
          217          for (i = 0; i < clrcount; i++)
          218 -                drw_clr_create(drw, &ret[i], clrnames[i]);
          219 +                drw_clr_create(drw, &ret[i], clrnames[i], alphas[i]);
          220          return ret;
          221  }
          222  
          223 @@ -274,9 +278,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
          224          } else {
          225                  XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
          226                  XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
          227 -                d = XftDrawCreate(drw->dpy, drw->drawable,
          228 -                                  DefaultVisual(drw->dpy, drw->screen),
          229 -                                  DefaultColormap(drw->dpy, drw->screen));
          230 +                d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap);
          231                  x += lpad;
          232                  w -= lpad;
          233          }
          234 diff --git a/drw.h b/drw.h
          235 index 4c67419..f6fa5cd 100644
          236 --- a/drw.h
          237 +++ b/drw.h
          238 @@ -20,6 +20,9 @@ typedef struct {
          239          Display *dpy;
          240          int screen;
          241          Window root;
          242 +        Visual *visual;
          243 +        unsigned int depth;
          244 +        Colormap cmap;
          245          Drawable drawable;
          246          GC gc;
          247          Clr *scheme;
          248 @@ -27,7 +30,7 @@ typedef struct {
          249  } Drw;
          250  
          251  /* Drawable abstraction */
          252 -Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h);
          253 +Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h, Visual*, unsigned int, Colormap);
          254  void drw_resize(Drw *drw, unsigned int w, unsigned int h);
          255  void drw_free(Drw *drw);
          256  
          257 @@ -38,8 +41,8 @@ unsigned int drw_fontset_getwidth(Drw *drw, const char *text);
          258  void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h);
          259  
          260  /* Colorscheme abstraction */
          261 -void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
          262 -Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
          263 +void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha);
          264 +Clr *drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount);
          265  
          266  /* Cursor abstraction */
          267  Cur *drw_cur_create(Drw *drw, int shape);