st-alpha-20171221-0ac685f.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       st-alpha-20171221-0ac685f.diff (5879B)
       ---
            1 From adc6b217669b30f4396e8a89f2a15b679d0e313e Mon Sep 17 00:00:00 2001
            2 From: fanboimsft <fanboimsft@icloud.com>
            3 Date: Thu, 21 Dec 2017 23:21:53 +0700
            4 Subject: [PATCH] alpha patch to latest git version
            5 
            6 ---
            7  config.def.h |  6 ++++-
            8  config.mk    |  4 ++--
            9  st.h         |  1 +
           10  win.h        |  4 ++++
           11  x.c          | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------
           12  5 files changed, 75 insertions(+), 11 deletions(-)
           13 
           14 diff --git a/config.def.h b/config.def.h
           15 index 877afab..0e423b1 100644
           16 --- a/config.def.h
           17 +++ b/config.def.h
           18 @@ -82,6 +82,9 @@ char termname[] = "st-256color";
           19   */
           20  static unsigned int tabspaces = 8;
           21  
           22 +/* bg opacity */
           23 +unsigned int alpha = 0xcc;
           24 +
           25  /* Terminal colors (16 first used in escape sequence) */
           26  const char *colorname[] = {
           27          /* 8 normal colors */
           28 @@ -109,6 +112,7 @@ const char *colorname[] = {
           29          /* more colors can be added after 255 to use with DefaultXX */
           30          "#cccccc",
           31          "#555555",
           32 +        "black",
           33  };
           34  
           35  
           36 @@ -117,7 +121,7 @@ const char *colorname[] = {
           37   * foreground, background, cursor, reverse cursor
           38   */
           39  unsigned int defaultfg = 7;
           40 -unsigned int defaultbg = 0;
           41 +unsigned int defaultbg = 257;
           42  unsigned int defaultcs = 256;
           43  unsigned int defaultrcs = 257;
           44  
           45 diff --git a/config.mk b/config.mk
           46 index 0aceec4..d2421f8 100644
           47 --- a/config.mk
           48 +++ b/config.mk
           49 @@ -11,10 +11,10 @@ X11INC = /usr/X11R6/include
           50  X11LIB = /usr/X11R6/lib
           51  
           52  # includes and libs
           53 -INCS = -I$(X11INC) \
           54 +INCS = -I. -I/usr/include -I${X11INC} \
           55         `pkg-config --cflags fontconfig` \
           56         `pkg-config --cflags freetype2`
           57 -LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft \
           58 +LIBS = -L/usr/lib -lc -L${X11LIB} -lm -lrt -lX11 -lutil -lXft -lXrender\
           59         `pkg-config --libs fontconfig` \
           60         `pkg-config --libs freetype2`
           61  
           62 diff --git a/st.h b/st.h
           63 index 44d4938..180fdba 100644
           64 --- a/st.h
           65 +++ b/st.h
           66 @@ -251,6 +251,7 @@ extern unsigned int blinktimeout;
           67  extern char termname[];
           68  extern const char *colorname[];
           69  extern size_t colornamelen;
           70 +extern unsigned int alpha;
           71  extern unsigned int defaultfg;
           72  extern unsigned int defaultbg;
           73  extern unsigned int defaultcs;
           74 diff --git a/win.h b/win.h
           75 index 428111c..05e8482 100644
           76 --- a/win.h
           77 +++ b/win.h
           78 @@ -5,6 +5,10 @@
           79  #define XK_NO_MOD     0
           80  #define XK_SWITCH_MOD (1<<13)
           81  
           82 +/* alpha */
           83 +#define OPAQUE 0Xff
           84 +#define USE_ARGB (alpha != OPAQUE && opt_embed == NULL)
           85 +
           86  typedef XftGlyphFontSpec GlyphFontSpec;
           87  
           88  void draw(void);
           89 diff --git a/x.c b/x.c
           90 index 191e5dc..0e12ab9 100644
           91 --- a/x.c
           92 +++ b/x.c
           93 @@ -49,6 +49,7 @@ typedef struct {
           94          XSetWindowAttributes attrs;
           95          int scr;
           96          int isfixed; /* is fixed geometry? */
           97 +        int depth; /* bit depth */
           98          int l, t; /* left and top offset */
           99          int gm; /* geometry mask */
          100  } XWindow;
          101 @@ -562,7 +563,7 @@ xresize(int col, int row)
          102  
          103          XFreePixmap(xw.dpy, xw.buf);
          104          xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
          105 -                        DefaultDepth(xw.dpy, xw.scr));
          106 +                        xw.depth);
          107          XftDrawChange(xw.draw, xw.buf);
          108          xclear(0, 0, win.w, win.h);
          109  }
          110 @@ -619,6 +620,13 @@ xloadcols(void)
          111                          else
          112                                  die("Could not allocate color %d\n", i);
          113                  }
          114 +
          115 +        /* set alpha value of bg color */
          116 +        if (USE_ARGB) {
          117 +                dc.col[defaultbg].color.alpha = (0xffff * alpha) / OPAQUE;
          118 +                dc.col[defaultbg].pixel &= 0x00111111;
          119 +                dc.col[defaultbg].pixel |= alpha << 24;
          120 +        }
          121          loaded = 1;
          122  }
          123  
          124 @@ -640,6 +648,17 @@ xsetcolorname(int x, const char *name)
          125          return 0;
          126  }
          127  
          128 +void
          129 +xtermclear(int col1, int row1, int col2, int row2)
          130 +{
          131 +        XftDrawRect(xw.draw,
          132 +                        &dc.col[IS_SET(MODE_REVERSE) ? defaultfg : defaultbg],
          133 +                        borderpx + col1 * win.cw,
          134 +                        borderpx + row1 * win.ch,
          135 +                        (col2-col1+1) * win.cw,
          136 +                        (row2-row1+1) * win.ch);
          137 +}
          138 +
          139  /*
          140   * Absolute coordinates.
          141   */
          142 @@ -879,7 +898,40 @@ xinit(void)
          143          if (!(xw.dpy = XOpenDisplay(NULL)))
          144                  die("Can't open display\n");
          145          xw.scr = XDefaultScreen(xw.dpy);
          146 -        xw.vis = XDefaultVisual(xw.dpy, xw.scr);
          147 +        xw.depth = (USE_ARGB) ? 32: XDefaultDepth(xw.dpy, xw.scr);
          148 +        if (!USE_ARGB)
          149 +                xw.vis = XDefaultVisual(xw.dpy, xw.scr);
          150 +        else {
          151 +                XVisualInfo *vis;
          152 +                XRenderPictFormat *fmt;
          153 +                int nvi;
          154 +                int i;
          155 +
          156 +                XVisualInfo tpl = {
          157 +                        .screen = xw.scr,
          158 +                        .depth = 32,
          159 +                        .class = TrueColor
          160 +                };
          161 +
          162 +                vis = XGetVisualInfo(xw.dpy,
          163 +                                VisualScreenMask | VisualDepthMask | VisualClassMask,
          164 +                                &tpl, &nvi);
          165 +                xw.vis = NULL;
          166 +                for (i = 0; i < nvi; i++) {
          167 +                        fmt = XRenderFindVisualFormat(xw.dpy, vis[i].visual);
          168 +                        if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) {
          169 +                                xw.vis = vis[i].visual;
          170 +                                break;
          171 +                        }
          172 +                }
          173 +
          174 +                XFree(vis);
          175 +
          176 +                if (!xw.vis) {
          177 +                        fprintf(stderr, "Couldn't find ARGB visual.\n");
          178 +                        exit(1);
          179 +                }
          180 +        }
          181  
          182          /* font */
          183          if (!FcInit())
          184 @@ -889,7 +941,11 @@ xinit(void)
          185          xloadfonts(usedfont, 0);
          186  
          187          /* colors */
          188 -        xw.cmap = XDefaultColormap(xw.dpy, xw.scr);
          189 +        if (!USE_ARGB)
          190 +                xw.cmap = XDefaultColormap(xw.dpy, xw.scr);
          191 +        else
          192 +                xw.cmap = XCreateColormap(xw.dpy, XRootWindow(xw.dpy, xw.scr),
          193 +                                xw.vis, None);
          194          xloadcols();
          195  
          196          /* adjust fixed window geometry */
          197 @@ -912,16 +968,15 @@ xinit(void)
          198          if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0))))
          199                  parent = XRootWindow(xw.dpy, xw.scr);
          200          xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t,
          201 -                        win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput,
          202 +                        win.w, win.h, 0, xw.depth, InputOutput,
          203                          xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity
          204                          | CWEventMask | CWColormap, &xw.attrs);
          205  
          206          memset(&gcvalues, 0, sizeof(gcvalues));
          207          gcvalues.graphics_exposures = False;
          208 -        dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures,
          209 -                        &gcvalues);
          210 -        xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
          211 -                        DefaultDepth(xw.dpy, xw.scr));
          212 +        xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, xw.depth);
          213 +        dc.gc = XCreateGC(xw.dpy, (USE_ARGB) ? xw.buf: parent,
          214 +                        GCGraphicsExposures, &gcvalues);
          215          XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel);
          216          XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h);
          217  
          218 -- 
          219 2.15.0
          220