sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

commit a022a11df2f663efb050d640b219be30262bc5cd
parent 399ccd26932e3ec495c4eb9abc4c590eef21e416
Author: yahei <yahei1423@gmail.com>
Date:   Tue,  6 May 2025 16:42:24 +0900

[st][patch][visualbell3] Added patch

Diffstat:
Ast.suckless.org/patches/visualbell3/index.md | 15+++++++++++++++
Ast.suckless.org/patches/visualbell3/st-visualbell3-0.9.2.diff | 155+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 170 insertions(+), 0 deletions(-)

diff --git a/st.suckless.org/patches/visualbell3/index.md b/st.suckless.org/patches/visualbell3/index.md @@ -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 - <yahei1423@gmail.com> diff --git a/st.suckless.org/patches/visualbell3/st-visualbell3-0.9.2.diff b/st.suckless.org/patches/visualbell3/st-visualbell3-0.9.2.diff @@ -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", colorname[i]); + 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;