st

git clone git://mattcarlson.org/repos/st.git
Log | Files | Refs

commit 820667483b967ad92bba28669be49708332612fa
parent b80d7e3a2ae849645928ee37bd923e94f7afeb46
Author: Matthew Carlson <matt@mcarlson.xyz>
Date:   Fri,  2 Jul 2021 16:44:35 +0000

alphafocus

Diffstat:
Mconfig.h | 5+++--
Mst.c | 1-
Mst.h | 3++-
Mx.c | 46+++++++++++++++++++++++++++++++---------------
4 files changed, 36 insertions(+), 19 deletions(-)

diff --git a/config.h b/config.h @@ -94,7 +94,7 @@ char *termname = "st-256color"; unsigned int tabspaces = 8; /* bg opacity */ -float alpha = 0.8; +float alpha = 0.8, alphaUnfocused = 0.6; /* Terminal colors (16 first used in escape sequence) */ static const char *colorname[] = { @@ -132,9 +132,10 @@ static const char *colorname[] = { * foreground, background, cursor, reverse cursor */ unsigned int defaultfg = 7; -unsigned int defaultbg = 258; +unsigned int defaultbg = 0; static unsigned int defaultcs = 256; static unsigned int defaultrcs = 257; +unsigned int bg = 17, bgUnfocused = 16; /* * Default shape of cursor diff --git a/st.c b/st.c @@ -193,7 +193,6 @@ static void tsetscroll(int, int); static void tswapscreen(void); static void tsetmode(int, int, const 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 @@ -79,6 +79,7 @@ typedef union { void die(const char *, ...); void redraw(void); +void tfulldirt(void); void draw(void); void printscreen(const Arg *); @@ -123,4 +124,4 @@ extern char *termname; extern unsigned int tabspaces; extern unsigned int defaultfg; extern unsigned int defaultbg; -extern float alpha; +extern float alpha, alphaUnfocused; diff --git a/x.c b/x.c @@ -254,6 +254,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 @@ -777,34 +779,37 @@ xloadcolor(int i, const char *name, Color *ncolor) } void +xloadalpha(void) +{ + float const usedAlpha = focused ? alpha : alphaUnfocused; + 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) { - int i; 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); - dc.col = xmalloc(dc.collen * sizeof(Color)); + + 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 (int 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]); else die("could not allocate color %d\n", i); } + if (dc.collen) // cannot die, as the color is already loaded. + xloadcolor(focused ?bg :bgUnfocused, NULL, &dc.col[defaultbg]); - /* 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; + xloadalpha(); loaded = 1; } @@ -1764,12 +1769,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(); + } } } @@ -2076,6 +2091,7 @@ run: XSetLocaleModifiers(""); cols = MAX(cols, 1); rows = MAX(rows, 1); + defaultbg = MAX(LEN(colorname), 256); tnew(cols, rows); xinit(cols, rows); xsetenv();