--- config.def.h | 22 +++++++++++++++++----- x.c | 39 +++++++++++++++++++++++++++++++++++---- 2 files changed, 52 insertions(+), 9 deletions(-) diff --git a/config.def.h b/config.def.h index fdbacfd..39a619f 100644 --- a/config.def.h +++ b/config.def.h _AT_@ -63,6 +63,13 @@ static unsigned int blinktimeout = 800; */ static unsigned int cursorthickness = 2; +/* + * Controls whether cursor blinking resets when typing. + * 0: off + * 1: on +*/ +static int typingResetsBlink = 1; + /* * bell volume. It must be a value between -100 and 100. Use 0 for disabling * it _AT_@ -129,13 +136,18 @@ static unsigned int defaultcs = 256; static unsigned int defaultrcs = 257; /* - * Default shape of cursor - * 2: Block ("█") - * 4: Underline ("_") - * 6: Bar ("|") + * https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h4-Functions-using-CSI-_-ordered-by-the-final-character-lparen-s-rparen:CSI-Ps-SP-q.1D81 + * Default style of cursor + * 0: blinking block + * 1: blinking block (default) + * 2: steady block ("█") + * 3: blinking underline + * 4: steady underline ("_") + * 5: blinking bar + * 6: steady bar ("|") * 7: Snowman ("☃") */ -static unsigned int cursorshape = 2; +static unsigned int cursorstyle = 1; /* * Default columns and rows numbers diff --git a/x.c b/x.c index 1dc44d6..c6503ee 100644 --- a/x.c +++ b/x.c _AT_@ -254,6 +254,8 @@ static char *opt_title = NULL; static int oldbutton = 3; /* button event on startup: 3 = release */ +static struct timespec lastblink; + void clipcopy(const Arg *dummy) { _AT_@ -1528,13 +1530,20 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og) switch (win.cursor) { case 7: /* st extension: snowman (U+2603) */ g.u = 0x2603; - /* FALLTHROUGH */ + xdrawglyph(g, cx, cy); + break; case 0: /* Blinking Block */ case 1: /* Blinking Block (Default) */ + if (IS_SET(MODE_BLINK)) + break; + /* FALLTHROUGH */ case 2: /* Steady Block */ xdrawglyph(g, cx, cy); break; case 3: /* Blinking Underline */ + if (IS_SET(MODE_BLINK)) + break; + /* FALLTHROUGH */ case 4: /* Steady Underline */ XftDrawRect(xw.draw, &drawcol, borderpx + cx * win.cw, _AT_@ -1543,6 +1552,9 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og) win.cw, cursorthickness); break; case 5: /* Blinking bar */ + if (IS_SET(MODE_BLINK)) + break; + /* FALLTHROUGH */ case 6: /* Steady bar */ XftDrawRect(xw.draw, &drawcol, borderpx + cx * win.cw, _AT_@ -1830,6 +1842,23 @@ kpress(XEvent *ev) len = 2; } } + + if(typingResetsBlink) { + int blinkcursor = win.cursor == 0 || win.cursor == 1 || + win.cursor == 3 || win.cursor == 5; + if (blinktimeout && (blinkcursor || tattrset(ATTR_BLINK))) + { + struct timespec now; + clock_gettime(CLOCK_MONOTONIC, &now); + lastblink = now; + if (IS_SET(MODE_BLINK)) + { + win.mode ^= MODE_BLINK; + } + } + } + + ttywrite(buf, len, 1); } _AT_@ -1869,8 +1898,10 @@ run(void) int w = win.w, h = win.h; fd_set rfd; int xfd = XConnectionNumber(xw.dpy), ttyfd, xev, drawing; - struct timespec seltv, *tv, now, lastblink, trigger; + struct timespec seltv, *tv, now, trigger; double timeout; + int blinkcursor = win.cursor == 0 || win.cursor == 1 || + win.cursor == 3 || win.cursor == 5; /* Waiting for window mapping */ do { _AT_@ -1947,7 +1978,7 @@ run(void) /* idle detected or maxlatency exhausted -> draw */ timeout = -1; - if (blinktimeout && tattrset(ATTR_BLINK)) { + if (blinktimeout && (blinkcursor || tattrset(ATTR_BLINK))) { timeout = blinktimeout - TIMEDIFF(now, lastblink); if (timeout <= 0) { if (-timeout > blinktimeout) /* start visible */ _AT_@ -1983,7 +2014,7 @@ main(int argc, char *argv[]) { xw.l = xw.t = 0; xw.isfixed = False; - win.cursor = cursorshape; + win.cursor = cursorstyle; ARGBEGIN { case 'a': -- 2.26.2Received on Fri May 15 2020 - 15:30:58 CEST
This archive was generated by hypermail 2.3.0 : Fri May 15 2020 - 15:36:37 CEST