[st][patch][visualbell3] Added patch - sites - public wiki contents of suckless… | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
commit a022a11df2f663efb050d640b219be30262bc5cd | |
parent 399ccd26932e3ec495c4eb9abc4c590eef21e416 | |
Author: yahei <[email protected]> | |
Date: Tue, 6 May 2025 16:42:24 +0900 | |
[st][patch][visualbell3] Added patch | |
Diffstat: | |
A st.suckless.org/patches/visualbell… | 15 +++++++++++++++ | |
A st.suckless.org/patches/visualbell… | 155 +++++++++++++++++++++++++++… | |
2 files changed, 170 insertions(+), 0 deletions(-) | |
--- | |
diff --git a/st.suckless.org/patches/visualbell3/index.md b/st.suckless.org/pat… | |
@@ -0,0 +1,15 @@ | |
+visualbell3 | |
+=========== | |
+ | |
+Description | |
+----------- | |
+A visual bell that changes the color of the entire screen. | |
+If [alpha](../alpha) is also applied, the alpha setting is also enabled. | |
+ | |
+Download | |
+-------- | |
+* [st-visualbell3-0.9.2.diff](st-visualbell3-0.9.2.diff) | |
+ | |
+Author | |
+------ | |
+* yahei - <[email protected]> | |
diff --git a/st.suckless.org/patches/visualbell3/st-visualbell3-0.9.2.diff b/st… | |
@@ -0,0 +1,155 @@ | |
+diff --git a/config.def.h b/config.def.h | |
+index 2cd740a..ccf3ab8 100644 | |
+--- a/config.def.h | |
++++ b/config.def.h | |
+@@ -73,6 +73,20 @@ static unsigned int cursorthickness = 2; | |
+ */ | |
+ static int bellvolume = 0; | |
+ | |
++/* visual bell duration (in milliseconds) */ | |
++static unsigned int bellduration = 150; | |
++ | |
++/* | |
++ * visual bell colors | |
++ * | |
++ * Formulas from normal colors to bell colors. | |
++ * Bell colors are clipped between 0x0000 and 0xffff. | |
++ */ | |
++#define BELLR(color) (color.red * 0.9 + 0xffff * 0.1) | |
++#define BELLG(color) (color.green * 0.9 + 0xffff * 0.1) | |
++#define BELLB(color) (color.blue * 0.9 + 0xffff * 0.1) | |
++#define BELLA(color) (color.alpha - 0x0500) | |
++ | |
+ /* default TERM value */ | |
+ char *termname = "st-256color"; | |
+ | |
+diff --git a/x.c b/x.c | |
+index bd23686..30db597 100644 | |
+--- a/x.c | |
++++ b/x.c | |
+@@ -135,6 +135,8 @@ typedef struct { | |
+ /* Drawing Context */ | |
+ typedef struct { | |
+ Color *col; | |
++ Color *normalcol; | |
++ Color *bellcol; | |
+ size_t collen; | |
+ Font font, bfont, ifont, ibfont; | |
+ GC gc; | |
+@@ -155,6 +157,8 @@ static void cresize(int, int); | |
+ static void xresize(int, int); | |
+ static void xhints(void); | |
+ static int xloadcolor(int, const char *, Color *); | |
++static void xnormalcols(void); | |
++static void xbellcols(void); | |
+ static int xloadfont(Font *, FcPattern *); | |
+ static void xloadfonts(const char *, double); | |
+ static void xunloadfont(Font *); | |
+@@ -220,6 +224,7 @@ static DC dc; | |
+ static XWindow xw; | |
+ static XSelection xsel; | |
+ static TermWindow win; | |
++struct timespec lastbell; | |
+ | |
+ /* Font Ring Cache */ | |
+ enum { | |
+@@ -795,18 +800,33 @@ 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); | |
++ for (i = 0; i < dc.collen; i++) { | |
++ XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.normalcol[i… | |
++ XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.bellcol[i]); | |
++ } | |
+ } else { | |
+ dc.collen = MAX(LEN(colorname), 256); | |
+- dc.col = xmalloc(dc.collen * sizeof(Color)); | |
++ dc.normalcol = xmalloc(dc.collen * sizeof(Color)); | |
++ dc.bellcol = xmalloc(dc.collen * sizeof(Color)); | |
++ dc.col = dc.normalcol; | |
+ } | |
+ | |
++ xnormalcols(); | |
++ xbellcols(); | |
++ | |
++ loaded = 1; | |
++} | |
++ | |
++void | |
++xnormalcols(void) | |
++{ | |
++ int i; | |
++ static int loaded; | |
++ | |
+ for (i = 0; i < dc.collen; i++) | |
+- if (!xloadcolor(i, NULL, &dc.col[i])) { | |
++ if (!xloadcolor(i, NULL, &dc.normalcol[i])) { | |
+ if (colorname[i]) | |
+ die("could not allocate color '%s'\n", colorn… | |
+ else | |
+@@ -815,6 +835,22 @@ xloadcols(void) | |
+ loaded = 1; | |
+ } | |
+ | |
++void | |
++xbellcols(void) | |
++{ | |
++ int i; | |
++ XRenderColor bc; | |
++ | |
++ for (i = 0; i < dc.collen; i++) { | |
++ bc.red = MAX(0, MIN(0xffff, BELLR(dc.normalcol[i].color))); | |
++ bc.green = MAX(0, MIN(0xffff, BELLG(dc.normalcol[i].color))); | |
++ bc.blue = MAX(0, MIN(0xffff, BELLB(dc.normalcol[i].color))); | |
++ bc.alpha = MAX(0, MIN(0xffff, BELLA(dc.normalcol[i].color))); | |
++ XftColorAllocValue(xw.dpy, xw.vis, | |
++ xw.cmap, &bc, &dc.bellcol[i]); | |
++ } | |
++} | |
++ | |
+ int | |
+ xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b) | |
+ { | |
+@@ -1766,6 +1802,10 @@ xbell(void) | |
+ xseturgency(1); | |
+ if (bellvolume) | |
+ XkbBell(xw.dpy, xw.win, bellvolume, (Atom)NULL); | |
++ | |
++ clock_gettime(CLOCK_MONOTONIC, &lastbell); | |
++ dc.col = dc.bellcol; | |
++ redraw(); | |
+ } | |
+ | |
+ void | |
+@@ -1925,7 +1965,7 @@ run(void) | |
+ fd_set rfd; | |
+ int xfd = XConnectionNumber(xw.dpy), ttyfd, xev, drawing; | |
+ struct timespec seltv, *tv, now, lastblink, trigger; | |
+- double timeout; | |
++ double timeout, bellremain; | |
+ | |
+ /* Waiting for window mapping */ | |
+ do { | |
+@@ -2014,6 +2054,17 @@ run(void) | |
+ } | |
+ } | |
+ | |
++ /* bell */ | |
++ if (dc.col == dc.bellcol) { | |
++ bellremain = bellduration - TIMEDIFF(now, lastbell); | |
++ if (bellremain < 0) { | |
++ dc.col = dc.normalcol; | |
++ redraw(); | |
++ } else if (timeout < 0 || bellremain < timeout) { | |
++ timeout = bellremain; | |
++ } | |
++ } | |
++ | |
+ draw(); | |
+ XFlush(xw.dpy); | |
+ drawing = 0; |