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.normalcol[i]);
     67 +			XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.bellcol[i]);
     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", colorname[i]);
     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].color)));
    107 +		bc.green = MAX(0, MIN(0xffff, BELLG(dc.normalcol[i].color)));
    108 +		bc.blue  = MAX(0, MIN(0xffff, BELLB(dc.normalcol[i].color)));
    109 +		bc.alpha = MAX(0, MIN(0xffff, BELLA(dc.normalcol[i].color)));
    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, lastbell);
    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;