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; |