st-focus-20200731-patch_alpha.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       st-focus-20200731-patch_alpha.diff (4414B)
       ---
            1 From 3307b33b60adb4e1b5db4dd9849c78fce72b6ca4 Mon Sep 17 00:00:00 2001
            2 From: Julius Huelsmann <juliusHuelsmann@gmail.com>
            3 Date: Fri, 31 Jul 2020 10:13:30 +0200
            4 Subject: [PATCH] patch: focus
            5 
            6 ---
            7  config.def.h |  5 +++--
            8  st.c         |  1 -
            9  st.h         |  3 ++-
           10  x.c          | 44 ++++++++++++++++++++++++++++++--------------
           11  4 files changed, 35 insertions(+), 18 deletions(-)
           12 
           13 diff --git a/config.def.h b/config.def.h
           14 index b94b23c..577d1f1 100644
           15 --- a/config.def.h
           16 +++ b/config.def.h
           17 @@ -85,7 +85,7 @@ char *termname = "st-256color";
           18  unsigned int tabspaces = 8;
           19  
           20  /* bg opacity */
           21 -float alpha = 0.8;
           22 +float alpha = 0.8, alphaUnfocused = 0.6;
           23  
           24  /* Terminal colors (16 first used in escape sequence) */
           25  static const char *colorname[] = {
           26 @@ -123,9 +123,10 @@ static const char *colorname[] = {
           27   * foreground, background, cursor, reverse cursor
           28   */
           29  unsigned int defaultfg = 7;
           30 -unsigned int defaultbg = 258;
           31 +unsigned int defaultbg = 0;
           32  static unsigned int defaultcs = 256;
           33  static unsigned int defaultrcs = 257;
           34 +unsigned int bg = 17, bgUnfocused = 16;
           35  
           36  /*
           37   * Default shape of cursor
           38 diff --git a/st.c b/st.c
           39 index 0ce6ac2..c7f40c8 100644
           40 --- a/st.c
           41 +++ b/st.c
           42 @@ -194,7 +194,6 @@ static void tsetscroll(int, int);
           43  static void tswapscreen(void);
           44  static void tsetmode(int, int, int *, int);
           45  static int twrite(const char *, int, int);
           46 -static void tfulldirt(void);
           47  static void tcontrolcode(uchar );
           48  static void tdectest(char );
           49  static void tdefutf8(char);
           50 diff --git a/st.h b/st.h
           51 index 2c656af..44cb3fd 100644
           52 --- a/st.h
           53 +++ b/st.h
           54 @@ -79,6 +79,7 @@ typedef union {
           55  
           56  void die(const char *, ...);
           57  void redraw(void);
           58 +void tfulldirt(void);
           59  void draw(void);
           60  
           61  void printscreen(const Arg *);
           62 @@ -122,4 +123,4 @@ extern char *termname;
           63  extern unsigned int tabspaces;
           64  extern unsigned int defaultfg;
           65  extern unsigned int defaultbg;
           66 -extern float alpha;
           67 +extern float alpha, alphaUnfocused;
           68 diff --git a/x.c b/x.c
           69 index 50da23c..a2e820f 100644
           70 --- a/x.c
           71 +++ b/x.c
           72 @@ -254,6 +254,8 @@ static char *opt_line  = NULL;
           73  static char *opt_name  = NULL;
           74  static char *opt_title = NULL;
           75  
           76 +static int focused = 0;
           77 +
           78  static int oldbutton = 3; /* button event on startup: 3 = release */
           79  
           80  void
           81 @@ -774,35 +776,38 @@ xloadcolor(int i, const char *name, Color *ncolor)
           82          return XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, ncolor);
           83  }
           84  
           85 +void
           86 +xloadalpha(void)
           87 +{
           88 +        float const usedAlpha = focused ? alpha : alphaUnfocused;
           89 +        if (opt_alpha) alpha = strtof(opt_alpha, NULL);
           90 +        dc.col[defaultbg].color.alpha = (unsigned short)(0xffff * usedAlpha);
           91 +        dc.col[defaultbg].pixel &= 0x00FFFFFF;
           92 +        dc.col[defaultbg].pixel |= (unsigned char)(0xff * usedAlpha) << 24;
           93 +}
           94 +
           95  void
           96  xloadcols(void)
           97  {
           98 -        int i;
           99          static int loaded;
          100          Color *cp;
          101  
          102 -        if (loaded) {
          103 -                for (cp = dc.col; cp < &dc.col[dc.collen]; ++cp)
          104 -                        XftColorFree(xw.dpy, xw.vis, xw.cmap, cp);
          105 -        } else {
          106 -                dc.collen = MAX(LEN(colorname), 256);
          107 -                dc.col = xmalloc(dc.collen * sizeof(Color));
          108 +        if (!loaded) {
          109 +                dc.collen = 1 + (defaultbg = MAX(LEN(colorname), 256));
          110 +                dc.col = xmalloc((dc.collen) * sizeof(Color));
          111          }
          112  
          113 -        for (i = 0; i < dc.collen; i++)
          114 +        for (int i = 0; i+1 < dc.collen; ++i)
          115                  if (!xloadcolor(i, NULL, &dc.col[i])) {
          116                          if (colorname[i])
          117                                  die("could not allocate color '%s'\n", colorname[i]);
          118                          else
          119                                  die("could not allocate color %d\n", i);
          120                  }
          121 +        if (dc.collen) // cannot die, as the color is already loaded.
          122 +                xloadcolor(focused ?bg :bgUnfocused, NULL, &dc.col[defaultbg]);
          123  
          124 -        /* set alpha value of bg color */
          125 -        if (opt_alpha)
          126 -                alpha = strtof(opt_alpha, NULL);
          127 -        dc.col[defaultbg].color.alpha = (unsigned short)(0xffff * alpha);
          128 -        dc.col[defaultbg].pixel &= 0x00FFFFFF;
          129 -        dc.col[defaultbg].pixel |= (unsigned char)(0xff * alpha) << 24;
          130 +        xloadalpha();
          131          loaded = 1;
          132  }
          133  
          134 @@ -1747,12 +1752,22 @@ focus(XEvent *ev)
          135                  xseturgency(0);
          136                  if (IS_SET(MODE_FOCUS))
          137                          ttywrite("\033[I", 3, 0);
          138 +                if (!focused) {
          139 +                        focused = 1;
          140 +                        xloadcols();
          141 +                        tfulldirt();
          142 +                }
          143          } else {
          144                  if (xw.ime.xic)
          145                          XUnsetICFocus(xw.ime.xic);
          146                  win.mode &= ~MODE_FOCUSED;
          147                  if (IS_SET(MODE_FOCUS))
          148                          ttywrite("\033[O", 3, 0);
          149 +                if (focused) {
          150 +                        focused = 0;
          151 +                        xloadcols();
          152 +                        tfulldirt();
          153 +                }
          154          }
          155  }
          156  
          157 @@ -2065,6 +2080,7 @@ run:
          158          XSetLocaleModifiers("");
          159          cols = MAX(cols, 1);
          160          rows = MAX(rows, 1);
          161 +        defaultbg = MAX(LEN(colorname), 256);
          162          tnew(cols, rows);
          163          xinit(cols, rows);
          164          xsetenv();
          165 -- 
          166 2.28.0
          167