Introduction
Introduction Statistics Contact Development Disclaimer Help
[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;
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.