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.normalcol[i]); 67 + XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.bellcol[i]); 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", colorname[i]); 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].color))); 107 + bc.green = MAX(0, MIN(0xffff, BELLG(dc.normalcol[i].color))); 108 + bc.blue = MAX(0, MIN(0xffff, BELLB(dc.normalcol[i].color))); 109 + bc.alpha = MAX(0, MIN(0xffff, BELLA(dc.normalcol[i].color))); 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, lastbell); 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;