Introduction
Introduction Statistics Contact Development Disclaimer Help
st-visualbell2-basic-2018-10-16-30ec9a3.diff - sites - public wiki contents of …
git clone git://git.suckless.org/sites
Log
Files
Refs
---
st-visualbell2-basic-2018-10-16-30ec9a3.diff (5437B)
---
1 From bcc850d57fb4cb6941008fb2808d4d0d373aa5f8 Mon Sep 17 00:00:00 2001
2 From: "Avi Halachmi (:avih)" <[email protected]>
3 Date: Mon, 15 Oct 2018 01:06:01 +0300
4 Subject: [PATCH] [vbell2] add visual bell with two rendering modes
5
6 - Inverse the whole terminal - "standard" visual-bell, a bit jarring.
7 - Inverse outer (border) cells - much less jarring, yet plenty visible.
8
9 Note: blink used a timeout of 1us after drawing, probably to
10 re-calculate the timeout without being affected by draw speed. This was
11 changed to 1ms for code simplicity, and should be inconsequential.
12 ---
13 config.def.h | 11 ++++++++
14 st.c | 1 -
15 st.h | 1 +
16 x.c | 77 +++++++++++++++++++++++++++++++++++++++-------------
17 4 files changed, 70 insertions(+), 20 deletions(-)
18
19 diff --git a/config.def.h b/config.def.h
20 index 823e79f..0915ce5 100644
21 --- a/config.def.h
22 +++ b/config.def.h
23 @@ -62,6 +62,17 @@ static unsigned int cursorthickness = 2;
24 */
25 static int bellvolume = 0;
26
27 +/*
28 + * visual-bell timeout (set to 0 to disable visual-bell).
29 + */
30 +static int vbelltimeout = 0;
31 +/*
32 + * visual bell mode when enabled:
33 + * 1: Inverse whole screen
34 + * 2: Inverse outer (border) cells
35 + */
36 +static int vbellmode = 1;
37 +
38 /* default TERM value */
39 char *termname = "st-256color";
40
41 diff --git a/st.c b/st.c
42 index 46cf2da..1229479 100644
43 --- a/st.c
44 +++ b/st.c
45 @@ -193,7 +193,6 @@ static void tsetscroll(int, int);
46 static void tswapscreen(void);
47 static void tsetmode(int, int, int *, int);
48 static int twrite(const char *, int, int);
49 -static void tfulldirt(void);
50 static void tcontrolcode(uchar );
51 static void tdectest(char );
52 static void tdefutf8(char);
53 diff --git a/st.h b/st.h
54 index 38c61c4..619d716 100644
55 --- a/st.h
56 +++ b/st.h
57 @@ -89,6 +89,7 @@ int tattrset(int);
58 void tnew(int, int);
59 void tresize(int, int);
60 void tsetdirtattr(int);
61 +void tfulldirt();
62 void ttyhangup(void);
63 int ttynew(char *, char *, char *, char **);
64 size_t ttyread(void);
65 diff --git a/x.c b/x.c
66 index 00cb6b1..7e66c6d 100644
67 --- a/x.c
68 +++ b/x.c
69 @@ -82,6 +82,8 @@ typedef struct {
70 int cw; /* char width */
71 int mode; /* window state/mode flags */
72 int cursor; /* cursor style */
73 + int vbellset; /* 1 during visual bell, 0 otherwise */
74 + struct timespec lastvbell;
75 } TermWindow;
76
77 typedef struct {
78 @@ -173,6 +175,9 @@ static void mousereport(XEvent *);
79 static char *kmap(KeySym, uint);
80 static int match(uint, uint);
81
82 +static void vbellbegin();
83 +static int isvbellcell(int x, int y);
84 +
85 static void run(void);
86 static void usage(void);
87
88 @@ -1528,6 +1533,8 @@ xdrawline(Line line, int x1, int y1, int x2)
89 continue;
90 if (selected(x, y1))
91 new.mode ^= ATTR_REVERSE;
92 + if (win.vbellset && isvbellcell(x, y1))
93 + new.mode ^= ATTR_REVERSE;
94 if (i > 0 && ATTRCMP(base, new)) {
95 xdrawglyphfontspecs(specs, base, i, ox, y1);
96 specs += i;
97 @@ -1610,6 +1617,28 @@ xseturgency(int add)
98 XFree(h);
99 }
100
101 +int
102 +isvbellcell(int x, int y)
103 +{
104 + if (vbellmode == 1)
105 + return 1;
106 + if (vbellmode == 2)
107 + return y == 0 || y == win.th / win.ch - 1 ||
108 + x == 0 || x == win.tw / win.cw - 1;
109 + return 0;
110 +}
111 +
112 +void
113 +vbellbegin() {
114 + clock_gettime(CLOCK_MONOTONIC, &win.lastvbell);
115 + if (win.vbellset) /* already visible, just extend win.lastvbell…
116 + return;
117 + win.vbellset = 1;
118 + tfulldirt();
119 + draw();
120 + XFlush(xw.dpy);
121 +}
122 +
123 void
124 xbell(void)
125 {
126 @@ -1617,6 +1646,8 @@ xbell(void)
127 xseturgency(1);
128 if (bellvolume)
129 XkbBell(xw.dpy, xw.win, bellvolume, (Atom)NULL);
130 + if (vbelltimeout)
131 + vbellbegin();
132 }
133
134 void
135 @@ -1770,7 +1801,7 @@ run(void)
136 int xfd = XConnectionNumber(xw.dpy), xev, blinkset = 0, dodraw …
137 int ttyfd;
138 struct timespec drawtimeout, *tv = NULL, now, last, lastblink;
139 - long deltatime;
140 + long deltatime, to_ms, remain;
141
142 /* Waiting for window mapping */
143 do {
144 @@ -1822,11 +1853,28 @@ run(void)
145 tv = &drawtimeout;
146
147 dodraw = 0;
148 - if (blinktimeout && TIMEDIFF(now, lastblink) > blinktim…
149 - tsetdirtattr(ATTR_BLINK);
150 - win.mode ^= MODE_BLINK;
151 - lastblink = now;
152 - dodraw = 1;
153 + to_ms = -1; /* timeout in ms, indefinite if negative */
154 + if (blinkset) {
155 + remain = blinktimeout - TIMEDIFF(now, lastblink…
156 + if (remain <= 0) {
157 + dodraw = 1;
158 + remain = 1; /* draw, wait 1ms, and re-c…
159 + tsetdirtattr(ATTR_BLINK);
160 + win.mode ^= MODE_BLINK;
161 + lastblink = now;
162 + }
163 + to_ms = remain;
164 + }
165 + if (win.vbellset) {
166 + remain = vbelltimeout - TIMEDIFF(now, win.lastv…
167 + if (remain <= 0) {
168 + dodraw = 1;
169 + remain = -1; /* draw (clear), and that'…
170 + tfulldirt();
171 + win.vbellset = 0;
172 + }
173 + if (remain >= 0 && (to_ms < 0 || remain < to_ms…
174 + to_ms = remain;
175 }
176 deltatime = TIMEDIFF(now, last);
177 if (deltatime > 1000 / (xev ? xfps : actionfps)) {
178 @@ -1849,19 +1897,10 @@ run(void)
179 if (xev && !FD_ISSET(xfd, &rfd))
180 xev--;
181 if (!FD_ISSET(ttyfd, &rfd) && !FD_ISSET(xfd, &r…
182 - if (blinkset) {
183 - if (TIMEDIFF(now, lastblink) \
184 - > blinktimeout)…
185 - drawtimeout.tv_nsec = 1…
186 - } else {
187 - drawtimeout.tv_nsec = (…
188 - (blinktimeout -…
189 - TIMEDIFF(now,
190 - lastbli…
191 - }
192 - drawtimeout.tv_sec = \
193 - drawtimeout.tv_nsec / 1E9;
194 - drawtimeout.tv_nsec %= (long)1E…
195 + if (to_ms >= 0) {
196 + static const long k = 1E3, m = …
197 + drawtimeout.tv_sec = to_ms / k;
198 + drawtimeout.tv_nsec = (to_ms % …
199 } else {
200 tv = NULL;
201 }
202 --
203 2.19.1
204
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.