st-focus-20200530-43a395a.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       st-focus-20200530-43a395a.diff (6927B)
       ---
            1 From dfbb24bf5e02c9e365d4c0fe46aa8cbe27aed92f Mon Sep 17 00:00:00 2001
            2 From: Julius Huelsmann <juliusHuelsmann@gmail.com>
            3 Date: Sat, 6 Jun 2020 13:12:28 +0200
            4 Subject: [PATCH] patch: focus
            5 
            6 ---
            7  config.def.h |  5 ++++
            8  config.mk    |  2 +-
            9  st.h         |  1 +
           10  x.c          | 72 +++++++++++++++++++++++++++++++++++++++-------------
           11  4 files changed, 61 insertions(+), 19 deletions(-)
           12 
           13 diff --git a/config.def.h b/config.def.h
           14 index 0895a1f..577d1f1 100644
           15 --- a/config.def.h
           16 +++ b/config.def.h
           17 @@ -84,6 +84,9 @@ char *termname = "st-256color";
           18   */
           19  unsigned int tabspaces = 8;
           20  
           21 +/* bg opacity */
           22 +float alpha = 0.8, alphaUnfocused = 0.6;
           23 +
           24  /* Terminal colors (16 first used in escape sequence) */
           25  static const char *colorname[] = {
           26          /* 8 normal colors */
           27 @@ -111,6 +114,7 @@ static const char *colorname[] = {
           28          /* more colors can be added after 255 to use with DefaultXX */
           29          "#cccccc",
           30          "#555555",
           31 +        "black",
           32  };
           33  
           34  
           35 @@ -122,6 +126,7 @@ unsigned int defaultfg = 7;
           36  unsigned int defaultbg = 0;
           37  static unsigned int defaultcs = 256;
           38  static unsigned int defaultrcs = 257;
           39 +unsigned int bg = 17, bgUnfocused = 16;
           40  
           41  /*
           42   * Default shape of cursor
           43 diff --git a/config.mk b/config.mk
           44 index beafc35..ddc65ae 100644
           45 --- a/config.mk
           46 +++ b/config.mk
           47 @@ -16,7 +16,7 @@ PKG_CONFIG = pkg-config
           48  INCS = -I$(X11INC) \
           49         `$(PKG_CONFIG) --cflags fontconfig` \
           50         `$(PKG_CONFIG) --cflags freetype2`
           51 -LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft \
           52 +LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft -lXrender\
           53         `$(PKG_CONFIG) --libs fontconfig` \
           54         `$(PKG_CONFIG) --libs freetype2`
           55  
           56 diff --git a/st.h b/st.h
           57 index d978458..b5f1cf6 100644
           58 --- a/st.h
           59 +++ b/st.h
           60 @@ -122,3 +122,4 @@ extern char *termname;
           61  extern unsigned int tabspaces;
           62  extern unsigned int defaultfg;
           63  extern unsigned int defaultbg;
           64 +extern float alpha, alphaUnfocused;
           65 diff --git a/x.c b/x.c
           66 index e5f1737..a0c3223 100644
           67 --- a/x.c
           68 +++ b/x.c
           69 @@ -105,6 +105,7 @@ typedef struct {
           70          XSetWindowAttributes attrs;
           71          int scr;
           72          int isfixed; /* is fixed geometry? */
           73 +        int depth; /* bit depth */
           74          int l, t; /* left and top offset */
           75          int gm; /* geometry mask */
           76  } XWindow;
           77 @@ -243,6 +244,7 @@ static char *usedfont = NULL;
           78  static double usedfontsize = 0;
           79  static double defaultfontsize = 0;
           80  
           81 +static char *opt_alpha = NULL;
           82  static char *opt_class = NULL;
           83  static char **opt_cmd  = NULL;
           84  static char *opt_embed = NULL;
           85 @@ -252,6 +254,8 @@ static char *opt_line  = NULL;
           86  static char *opt_name  = NULL;
           87  static char *opt_title = NULL;
           88  
           89 +static int focused = 0;
           90 +
           91  static int oldbutton = 3; /* button event on startup: 3 = release */
           92  
           93  void
           94 @@ -734,7 +738,7 @@ xresize(int col, int row)
           95  
           96          XFreePixmap(xw.dpy, xw.buf);
           97          xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
           98 -                        DefaultDepth(xw.dpy, xw.scr));
           99 +                        xw.depth);
          100          XftDrawChange(xw.draw, xw.buf);
          101          xclear(0, 0, win.w, win.h);
          102  
          103 @@ -772,28 +776,38 @@ xloadcolor(int i, const char *name, Color *ncolor)
          104          return XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, ncolor);
          105  }
          106  
          107 +void
          108 +xloadalpha(void)
          109 +{
          110 +        float const usedAlpha = focused ? alpha : alphaUnfocused;
          111 +        if (opt_alpha) alpha = strtof(opt_alpha, NULL);
          112 +        dc.col[defaultbg].color.alpha = (unsigned short)(0xffff * usedAlpha);
          113 +        dc.col[defaultbg].pixel &= 0x00FFFFFF;
          114 +        dc.col[defaultbg].pixel |= (unsigned char)(0xff * usedAlpha) << 24;
          115 +}
          116 +
          117  void
          118  xloadcols(void)
          119  {
          120 -        int i;
          121          static int loaded;
          122          Color *cp;
          123  
          124 -        if (loaded) {
          125 -                for (cp = dc.col; cp < &dc.col[dc.collen]; ++cp)
          126 -                        XftColorFree(xw.dpy, xw.vis, xw.cmap, cp);
          127 -        } else {
          128 -                dc.collen = MAX(LEN(colorname), 256);
          129 -                dc.col = xmalloc(dc.collen * sizeof(Color));
          130 +        if (!loaded) {
          131 +                dc.collen = 1 + (defaultbg = MAX(LEN(colorname), 256));
          132 +                dc.col = xmalloc((dc.collen) * sizeof(Color));
          133          }
          134  
          135 -        for (i = 0; i < dc.collen; i++)
          136 +        for (int i = 0; i+1 < dc.collen; ++i)
          137                  if (!xloadcolor(i, NULL, &dc.col[i])) {
          138                          if (colorname[i])
          139                                  die("could not allocate color '%s'\n", colorname[i]);
          140                          else
          141                                  die("could not allocate color %d\n", i);
          142                  }
          143 +        if (dc.collen) // cannot die, as the color is already loaded.
          144 +                xloadcolor(focused ?bg :bgUnfocused, NULL, &dc.col[defaultbg]);
          145 +
          146 +        xloadalpha();
          147          loaded = 1;
          148  }
          149  
          150 @@ -1103,11 +1117,23 @@ xinit(int cols, int rows)
          151          Window parent;
          152          pid_t thispid = getpid();
          153          XColor xmousefg, xmousebg;
          154 +        XWindowAttributes attr;
          155 +        XVisualInfo vis;
          156  
          157          if (!(xw.dpy = XOpenDisplay(NULL)))
          158                  die("can't open display\n");
          159          xw.scr = XDefaultScreen(xw.dpy);
          160 -        xw.vis = XDefaultVisual(xw.dpy, xw.scr);
          161 +
          162 +        if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) {
          163 +                parent = XRootWindow(xw.dpy, xw.scr);
          164 +                xw.depth = 32;
          165 +        } else {
          166 +                XGetWindowAttributes(xw.dpy, parent, &attr);
          167 +                xw.depth = attr.depth;
          168 +        }
          169 +
          170 +        XMatchVisualInfo(xw.dpy, xw.scr, xw.depth, TrueColor, &vis);
          171 +        xw.vis = vis.visual;
          172  
          173          /* font */
          174          if (!FcInit())
          175 @@ -1117,7 +1143,7 @@ xinit(int cols, int rows)
          176          xloadfonts(usedfont, 0);
          177  
          178          /* colors */
          179 -        xw.cmap = XDefaultColormap(xw.dpy, xw.scr);
          180 +        xw.cmap = XCreateColormap(xw.dpy, parent, xw.vis, None);
          181          xloadcols();
          182  
          183          /* adjust fixed window geometry */
          184 @@ -1137,19 +1163,15 @@ xinit(int cols, int rows)
          185                  | ButtonMotionMask | ButtonPressMask | ButtonReleaseMask;
          186          xw.attrs.colormap = xw.cmap;
          187  
          188 -        if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0))))
          189 -                parent = XRootWindow(xw.dpy, xw.scr);
          190          xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t,
          191 -                        win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput,
          192 +                        win.w, win.h, 0, xw.depth, InputOutput,
          193                          xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity
          194                          | CWEventMask | CWColormap, &xw.attrs);
          195  
          196          memset(&gcvalues, 0, sizeof(gcvalues));
          197          gcvalues.graphics_exposures = False;
          198 -        dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures,
          199 -                        &gcvalues);
          200 -        xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
          201 -                        DefaultDepth(xw.dpy, xw.scr));
          202 +        xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, xw.depth);
          203 +        dc.gc = XCreateGC(xw.dpy, xw.buf, GCGraphicsExposures, &gcvalues);
          204          XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel);
          205          XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h);
          206  
          207 @@ -1730,12 +1752,22 @@ focus(XEvent *ev)
          208                  xseturgency(0);
          209                  if (IS_SET(MODE_FOCUS))
          210                          ttywrite("\033[I", 3, 0);
          211 +                if (!focused) {
          212 +                        focused = 1;
          213 +                        xloadcols();
          214 +                        redraw();
          215 +                }
          216          } else {
          217                  if (xw.ime.xic)
          218                          XUnsetICFocus(xw.ime.xic);
          219                  win.mode &= ~MODE_FOCUSED;
          220                  if (IS_SET(MODE_FOCUS))
          221                          ttywrite("\033[O", 3, 0);
          222 +                if (focused) {
          223 +                        focused = 0;
          224 +                        xloadcols();
          225 +                        redraw();
          226 +                }
          227          }
          228  }
          229  
          230 @@ -1994,6 +2026,9 @@ main(int argc, char *argv[])
          231          case 'a':
          232                  allowaltscreen = 0;
          233                  break;
          234 +        case 'A':
          235 +                opt_alpha = EARGF(usage());
          236 +                break;
          237          case 'c':
          238                  opt_class = EARGF(usage());
          239                  break;
          240 @@ -2045,6 +2080,7 @@ run:
          241          XSetLocaleModifiers("");
          242          cols = MAX(cols, 1);
          243          rows = MAX(rows, 1);
          244 +        defaultbg = MAX(LEN(colorname), 256);
          245          tnew(cols, rows);
          246          xinit(cols, rows);
          247          xsetenv();
          248 -- 
          249 2.27.0
          250