st-visualbell2-basic-2020-05-13-045a0fa.diff - sites - public wiki contents of … | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
st-visualbell2-basic-2020-05-13-045a0fa.diff (2652B) | |
--- | |
1 From 18fc7793b0bb2f9a93d39fe69a72d40122e151eb 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] add visual bell with few 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 - Inverse the bottom-right corner only. | |
9 - Inverse cells according to custom logic. | |
10 --- | |
11 config.def.h | 8 ++++++++ | |
12 x.c | 35 +++++++++++++++++++++++++++++++++++ | |
13 2 files changed, 43 insertions(+) | |
14 | |
15 diff --git a/config.def.h b/config.def.h | |
16 index fdbacfd..fe07204 100644 | |
17 --- a/config.def.h | |
18 +++ b/config.def.h | |
19 @@ -69,6 +69,14 @@ static unsigned int cursorthickness = 2; | |
20 */ | |
21 static int bellvolume = 0; | |
22 | |
23 +/* visual-bell timeout in ms (0 to disable visual-bell) */ | |
24 +static int vbelltimeout = 150; | |
25 + | |
26 +/* choose predefined visual-bell cells to inverse, or define your own l… | |
27 +#define VBCELL x==0 || x==right || y==0 || y==bottom /* border */ | |
28 +// #define VBCELL 1 /* all cells - whole screen */ | |
29 +// #define VBCELL y==bottom && x>right-2 /* bottom-right */ | |
30 + | |
31 /* default TERM value */ | |
32 char *termname = "st-256color"; | |
33 | |
34 diff --git a/x.c b/x.c | |
35 index 1dc44d6..44d5a8d 100644 | |
36 --- a/x.c | |
37 +++ b/x.c | |
38 @@ -1592,6 +1592,27 @@ xsettitle(char *p) | |
39 XFree(prop.value); | |
40 } | |
41 | |
42 + | |
43 +static int vbellset = 0; /* 1 during visual bell, 0 otherwise */ | |
44 +static struct timespec lastvbell = {0}; | |
45 + | |
46 +static int | |
47 +isvbellcell(int x, int y) | |
48 +{ | |
49 + int right = win.tw / win.cw - 1, bottom = win.th / win.ch - 1; | |
50 + return VBCELL; /* logic condition defined at config.h */ | |
51 +} | |
52 + | |
53 +static void | |
54 +vbellbegin() { | |
55 + clock_gettime(CLOCK_MONOTONIC, &lastvbell); | |
56 + if (vbellset) | |
57 + return; | |
58 + vbellset = 1; | |
59 + redraw(); | |
60 + XFlush(xw.dpy); | |
61 +} | |
62 + | |
63 int | |
64 xstartdraw(void) | |
65 { | |
66 @@ -1613,6 +1634,8 @@ xdrawline(Line line, int x1, int y1, int x2) | |
67 continue; | |
68 if (selected(x, y1)) | |
69 new.mode ^= ATTR_REVERSE; | |
70 + if (vbellset && isvbellcell(x, y1)) | |
71 + new.mode ^= ATTR_REVERSE; | |
72 if (i > 0 && ATTRCMP(base, new)) { | |
73 xdrawglyphfontspecs(specs, base, i, ox, y1); | |
74 specs += i; | |
75 @@ -1714,6 +1737,8 @@ xbell(void) | |
76 xseturgency(1); | |
77 if (bellvolume) | |
78 XkbBell(xw.dpy, xw.win, bellvolume, (Atom)NULL); | |
79 + if (vbelltimeout) | |
80 + vbellbegin(); | |
81 } | |
82 | |
83 void | |
84 @@ -1959,6 +1984,16 @@ run(void) | |
85 } | |
86 } | |
87 | |
88 + if (vbellset) { | |
89 + double remain = vbelltimeout - TIMEDIFF(now, la… | |
90 + if (remain <= 0) { | |
91 + vbellset = 0; | |
92 + redraw(); | |
93 + } else if (timeout < 0 || remain < timeout) { | |
94 + timeout = remain; | |
95 + } | |
96 + } | |
97 + | |
98 draw(); | |
99 XFlush(xw.dpy); | |
100 drawing = 0; | |
101 | |
102 base-commit: 045a0fab4f80b57f4a982ae6bc5f33fe21d66111 | |
103 -- | |
104 2.17.1 | |
105 |