diff --git a/Xdefaults b/Xdefaults index 704f2db..040c772 100644 --- a/Xdefaults +++ b/Xdefaults @@ -1,5 +1,6 @@ !! Transparency (0-1): st.alpha: 0.92 +st.alphaOffset: 0.3 !! Set a default font and font size as below: st.font: Monospace-11; diff --git a/config.h b/config.h index a0d8c1f..d6eeade 100644 --- a/config.h +++ b/config.h @@ -108,6 +108,8 @@ unsigned int tabspaces = 8; /* bg opacity */ float alpha = 0.8; +float alphaOffset = 0.0; +float alphaUnfocus; /* Terminal colors (16 first used in escape sequence) */ static const char *colorname[] = { @@ -144,6 +146,7 @@ unsigned int defaultfg = 259; unsigned int defaultbg = 258; unsigned int defaultcs = 256; unsigned int defaultrcs = 257; +unsigned int background = 258; /* * Default shape of cursor @@ -217,6 +220,7 @@ ResourcePref resources[] = { { "cwscale", FLOAT, &cwscale }, { "chscale", FLOAT, &chscale }, { "alpha", FLOAT, &alpha }, + { "alphaOffset", FLOAT, &alphaOffset }, }; /* diff --git a/st.c b/st.c index 1cf277c..f9f8068 100644 --- a/st.c +++ b/st.c @@ -201,7 +201,6 @@ static void tsetscroll(int, int); static void tswapscreen(void); static void tsetmode(int, int, int *, int); static int twrite(const char *, int, int); -static void tfulldirt(void); static void tcontrolcode(uchar ); static void tdectest(char ); static void tdefutf8(char); diff --git a/st.h b/st.h index ac76b71..3ddfadd 100644 --- a/st.h +++ b/st.h @@ -82,6 +82,7 @@ typedef union { void die(const char *, ...); void redraw(void); +void tfulldirt(void); void draw(void); void externalpipe(const Arg *); @@ -138,4 +139,5 @@ extern unsigned int tabspaces; extern unsigned int defaultfg; extern unsigned int defaultbg; extern float alpha; +extern float alphaUnfocus; extern const int boxdraw, boxdraw_bold, boxdraw_braille; diff --git a/x.c b/x.c index 696ade9..2580d2a 100644 --- a/x.c +++ b/x.c @@ -182,6 +182,7 @@ static void xsetenv(void); static void xseturgency(int); static int evcol(XEvent *); static int evrow(XEvent *); +static float clamp(float, float, float); static void expose(XEvent *); static void visibility(XEvent *); @@ -272,6 +273,8 @@ static char *opt_line = NULL; static char *opt_name = NULL; static char *opt_title = NULL; +static int focused = 0; + static int oldbutton = 3; /* button event on startup: 3 = release */ void @@ -317,10 +320,8 @@ changealpha(const Arg *arg) { if((alpha > 0 && arg->f < 0) || (alpha < 1 && arg->f > 0)) alpha += arg->f; - if(alpha < 0) - alpha = 0; - if(alpha > 1) - alpha = 1; + alpha = clamp(alpha, 0.0, 1.0); + alphaUnfocus = clamp(alpha-alphaOffset, 0.0, 1.0); xloadcols(); redraw(); @@ -379,6 +380,15 @@ evrow(XEvent *e) return y / win.ch; } +float +clamp(float value, float lower, float upper) { + if(value < lower) + return lower; + if(value > upper) + return upper; + return value; +} + void mousesel(XEvent *e, int done) { @@ -807,6 +817,16 @@ xloadcolor(int i, const char *name, Color *ncolor) return XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, ncolor); } +void +xloadalpha(void) +{ + float const usedAlpha = focused ? alpha : alphaUnfocus; + if (opt_alpha) alpha = strtof(opt_alpha, NULL); + dc.col[defaultbg].color.alpha = (unsigned short)(0xffff * usedAlpha); + dc.col[defaultbg].pixel &= 0x00FFFFFF; + dc.col[defaultbg].pixel |= (unsigned char)(0xff * usedAlpha) << 24; +} + void xloadcols(void) { @@ -814,15 +834,12 @@ xloadcols(void) static int loaded; Color *cp; - if (loaded) { - for (cp = dc.col; cp < &dc.col[dc.collen]; ++cp) - XftColorFree(xw.dpy, xw.vis, xw.cmap, cp); - } else { - dc.collen = MAX(LEN(colorname), 256); + if (!loaded) { + dc.collen = 1 + (defaultbg = MAX(LEN(colorname), 256)); dc.col = xmalloc(dc.collen * sizeof(Color)); } - for (i = 0; i < dc.collen; i++) + for (i = 0; i+1 < dc.collen; i++) if (!xloadcolor(i, NULL, &dc.col[i])) { if (colorname[i]) die("could not allocate color '%s'\n", colorname[i]); @@ -830,12 +847,10 @@ xloadcols(void) die("could not allocate color %d\n", i); } - /* set alpha value of bg color */ - if (opt_alpha) - alpha = strtof(opt_alpha, NULL); - dc.col[defaultbg].color.alpha = (unsigned short)(0xffff * alpha); - dc.col[defaultbg].pixel &= 0x00FFFFFF; - dc.col[defaultbg].pixel |= (unsigned char)(0xff * alpha) << 24; + if (dc.collen) // cannot die, as the color is already loaded. + xloadcolor(background, NULL, &dc.col[defaultbg]); + + xloadalpha(); loaded = 1; } @@ -1910,12 +1925,22 @@ focus(XEvent *ev) xseturgency(0); if (IS_SET(MODE_FOCUS)) ttywrite("\033[I", 3, 0); + if (!focused) { + focused = 1; + xloadcols(); + tfulldirt(); + } } else { if (xw.ime.xic) XUnsetICFocus(xw.ime.xic); win.mode &= ~MODE_FOCUSED; if (IS_SET(MODE_FOCUS)) ttywrite("\033[O", 3, 0); + if (focused) { + focused = 0; + xloadcols(); + tfulldirt(); + } } } @@ -2280,6 +2305,8 @@ run: config_init(); cols = MAX(cols, 1); rows = MAX(rows, 1); + defaultbg = MAX(LEN(colorname), 256); + alphaUnfocus = alpha-alphaOffset; tnew(cols, rows); xinit(cols, rows); xsetenv();