st-visualbell2-basic-2020-05-13-045a0fa.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) 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)" <avihpit@yahoo.com>
            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 logic */
           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, lastvbell);
           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