| st-visualbell3-0.9.2.diff - sites - public wiki contents of suckless.org | |
| git clone git://git.suckless.org/sites | |
| Log | |
| Files | |
| Refs | |
| --- | |
| st-visualbell3-0.9.2.diff (3817B) | |
| --- | |
| 1 diff --git a/config.def.h b/config.def.h | |
| 2 index 2cd740a..ccf3ab8 100644 | |
| 3 --- a/config.def.h | |
| 4 +++ b/config.def.h | |
| 5 @@ -73,6 +73,20 @@ static unsigned int cursorthickness = 2; | |
| 6 */ | |
| 7 static int bellvolume = 0; | |
| 8 | |
| 9 +/* visual bell duration (in milliseconds) */ | |
| 10 +static unsigned int bellduration = 150; | |
| 11 + | |
| 12 +/* | |
| 13 + * visual bell colors | |
| 14 + * | |
| 15 + * Formulas from normal colors to bell colors. | |
| 16 + * Bell colors are clipped between 0x0000 and 0xffff. | |
| 17 + */ | |
| 18 +#define BELLR(color) (color.red * 0.9 + 0xffff * 0.1) | |
| 19 +#define BELLG(color) (color.green * 0.9 + 0xffff * 0.1) | |
| 20 +#define BELLB(color) (color.blue * 0.9 + 0xffff * 0.1) | |
| 21 +#define BELLA(color) (color.alpha - 0x0500) | |
| 22 + | |
| 23 /* default TERM value */ | |
| 24 char *termname = "st-256color"; | |
| 25 | |
| 26 diff --git a/x.c b/x.c | |
| 27 index bd23686..30db597 100644 | |
| 28 --- a/x.c | |
| 29 +++ b/x.c | |
| 30 @@ -135,6 +135,8 @@ typedef struct { | |
| 31 /* Drawing Context */ | |
| 32 typedef struct { | |
| 33 Color *col; | |
| 34 + Color *normalcol; | |
| 35 + Color *bellcol; | |
| 36 size_t collen; | |
| 37 Font font, bfont, ifont, ibfont; | |
| 38 GC gc; | |
| 39 @@ -155,6 +157,8 @@ static void cresize(int, int); | |
| 40 static void xresize(int, int); | |
| 41 static void xhints(void); | |
| 42 static int xloadcolor(int, const char *, Color *); | |
| 43 +static void xnormalcols(void); | |
| 44 +static void xbellcols(void); | |
| 45 static int xloadfont(Font *, FcPattern *); | |
| 46 static void xloadfonts(const char *, double); | |
| 47 static void xunloadfont(Font *); | |
| 48 @@ -220,6 +224,7 @@ static DC dc; | |
| 49 static XWindow xw; | |
| 50 static XSelection xsel; | |
| 51 static TermWindow win; | |
| 52 +struct timespec lastbell; | |
| 53 | |
| 54 /* Font Ring Cache */ | |
| 55 enum { | |
| 56 @@ -795,18 +800,33 @@ xloadcols(void) | |
| 57 { | |
| 58 int i; | |
| 59 static int loaded; | |
| 60 - Color *cp; | |
| 61 | |
| 62 if (loaded) { | |
| 63 - for (cp = dc.col; cp < &dc.col[dc.collen]; ++cp) | |
| 64 - XftColorFree(xw.dpy, xw.vis, xw.cmap, cp); | |
| 65 + for (i = 0; i < dc.collen; i++) { | |
| 66 + XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.norma… | |
| 67 + XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.bellc… | |
| 68 + } | |
| 69 } else { | |
| 70 dc.collen = MAX(LEN(colorname), 256); | |
| 71 - dc.col = xmalloc(dc.collen * sizeof(Color)); | |
| 72 + dc.normalcol = xmalloc(dc.collen * sizeof(Color)); | |
| 73 + dc.bellcol = xmalloc(dc.collen * sizeof(Color)); | |
| 74 + dc.col = dc.normalcol; | |
| 75 } | |
| 76 | |
| 77 + xnormalcols(); | |
| 78 + xbellcols(); | |
| 79 + | |
| 80 + loaded = 1; | |
| 81 +} | |
| 82 + | |
| 83 +void | |
| 84 +xnormalcols(void) | |
| 85 +{ | |
| 86 + int i; | |
| 87 + static int loaded; | |
| 88 + | |
| 89 for (i = 0; i < dc.collen; i++) | |
| 90 - if (!xloadcolor(i, NULL, &dc.col[i])) { | |
| 91 + if (!xloadcolor(i, NULL, &dc.normalcol[i])) { | |
| 92 if (colorname[i]) | |
| 93 die("could not allocate color '%s'\n", … | |
| 94 else | |
| 95 @@ -815,6 +835,22 @@ xloadcols(void) | |
| 96 loaded = 1; | |
| 97 } | |
| 98 | |
| 99 +void | |
| 100 +xbellcols(void) | |
| 101 +{ | |
| 102 + int i; | |
| 103 + XRenderColor bc; | |
| 104 + | |
| 105 + for (i = 0; i < dc.collen; i++) { | |
| 106 + bc.red = MAX(0, MIN(0xffff, BELLR(dc.normalcol[i].col… | |
| 107 + bc.green = MAX(0, MIN(0xffff, BELLG(dc.normalcol[i].col… | |
| 108 + bc.blue = MAX(0, MIN(0xffff, BELLB(dc.normalcol[i].col… | |
| 109 + bc.alpha = MAX(0, MIN(0xffff, BELLA(dc.normalcol[i].col… | |
| 110 + XftColorAllocValue(xw.dpy, xw.vis, | |
| 111 + xw.cmap, &bc, &dc.bellcol[i]); | |
| 112 + } | |
| 113 +} | |
| 114 + | |
| 115 int | |
| 116 xgetcolor(int x, unsigned char *r, unsigned char *g, unsigned char *b) | |
| 117 { | |
| 118 @@ -1766,6 +1802,10 @@ xbell(void) | |
| 119 xseturgency(1); | |
| 120 if (bellvolume) | |
| 121 XkbBell(xw.dpy, xw.win, bellvolume, (Atom)NULL); | |
| 122 + | |
| 123 + clock_gettime(CLOCK_MONOTONIC, &lastbell); | |
| 124 + dc.col = dc.bellcol; | |
| 125 + redraw(); | |
| 126 } | |
| 127 | |
| 128 void | |
| 129 @@ -1925,7 +1965,7 @@ run(void) | |
| 130 fd_set rfd; | |
| 131 int xfd = XConnectionNumber(xw.dpy), ttyfd, xev, drawing; | |
| 132 struct timespec seltv, *tv, now, lastblink, trigger; | |
| 133 - double timeout; | |
| 134 + double timeout, bellremain; | |
| 135 | |
| 136 /* Waiting for window mapping */ | |
| 137 do { | |
| 138 @@ -2014,6 +2054,17 @@ run(void) | |
| 139 } | |
| 140 } | |
| 141 | |
| 142 + /* bell */ | |
| 143 + if (dc.col == dc.bellcol) { | |
| 144 + bellremain = bellduration - TIMEDIFF(now, lastb… | |
| 145 + if (bellremain < 0) { | |
| 146 + dc.col = dc.normalcol; | |
| 147 + redraw(); | |
| 148 + } else if (timeout < 0 || bellremain < timeout)… | |
| 149 + timeout = bellremain; | |
| 150 + } | |
| 151 + } | |
| 152 + | |
| 153 draw(); | |
| 154 XFlush(xw.dpy); | |
| 155 drawing = 0; |