Introduction
Introduction Statistics Contact Development Disclaimer Help
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;
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.