|
|
- From bff176133618854676bbdc74c0099f184d3da365 Mon Sep 17 00:00:00 2001
- From: Steve Ward <planet36@gmail.com>
- Date: Sun, 31 May 2020 22:48:25 -0400
- Subject: [PATCH] Allow blinking cursor
-
- ---
- config.def.h | 19 +++++++++++++------
- x.c | 42 ++++++++++++++++++++++++++++++++----------
- 2 files changed, 45 insertions(+), 16 deletions(-)
-
- diff --git a/config.def.h b/config.def.h
- index 6f05dce..3dbe915 100644
- --- a/config.def.h
- +++ b/config.def.h
- @@ -133,13 +133,20 @@ static unsigned int defaultcs = 256;
- static unsigned int defaultrcs = 257;
-
- /*
- - * Default shape of cursor
- - * 2: Block ("█")
- - * 4: Underline ("_")
- - * 6: Bar ("|")
- - * 7: Snowman ("☃")
- + * 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: Blinking st cursor
- + * 8: Steady st cursor
- */
- -static unsigned int cursorshape = 2;
- +static unsigned int cursorstyle = 1;
- +static Rune stcursor = 0x2603; /* snowman (U+2603) */
-
- /*
- * Default columns and rows numbers
- diff --git a/x.c b/x.c
- index 210f184..bd80a5e 100644
- --- a/x.c
- +++ b/x.c
- @@ -253,6 +253,7 @@ static char *opt_name = NULL;
- static char *opt_title = NULL;
-
- static int oldbutton = 3; /* button event on startup: 3 = release */
- +static int cursorblinks = 0;
-
- void
- clipcopy(const Arg *dummy)
- @@ -1526,16 +1527,19 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
- /* draw the new one */
- if (IS_SET(MODE_FOCUSED)) {
- switch (win.cursor) {
- - case 7: /* st extension */
- - g.u = 0x2603; /* snowman (U+2603) */
- + case 0: /* Blinking block */
- + case 1: /* Blinking block (default) */
- + if (IS_SET(MODE_BLINK))
- + break;
- /* FALLTHROUGH */
- - case 0: /* Blinking Block */
- - case 1: /* Blinking Block (Default) */
- - case 2: /* Steady Block */
- + case 2: /* Steady block */
- xdrawglyph(g, cx, cy);
- break;
- - case 3: /* Blinking Underline */
- - case 4: /* Steady Underline */
- + case 3: /* Blinking underline */
- + if (IS_SET(MODE_BLINK))
- + break;
- + /* FALLTHROUGH */
- + case 4: /* Steady underline */
- XftDrawRect(xw.draw, &drawcol,
- borderpx + cx * win.cw,
- borderpx + (cy + 1) * win.ch - \
- @@ -1543,12 +1547,23 @@ 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,
- borderpx + cy * win.ch,
- cursorthickness, win.ch);
- break;
- + case 7: /* Blinking st cursor */
- + if (IS_SET(MODE_BLINK))
- + break;
- + /* FALLTHROUGH */
- + case 8: /* Steady st cursor */
- + g.u = stcursor;
- + xdrawglyph(g, cx, cy);
- + break;
- }
- } else {
- XftDrawRect(xw.draw, &drawcol,
- @@ -1690,9 +1705,12 @@ xsetmode(int set, unsigned int flags)
- int
- xsetcursor(int cursor)
- {
- - if (!BETWEEN(cursor, 0, 7)) /* 7: st extension */
- + if (!BETWEEN(cursor, 0, 8)) /* 7-8: st extensions */
- return 1;
- win.cursor = cursor;
- + cursorblinks = win.cursor == 0 || win.cursor == 1 ||
- + win.cursor == 3 || win.cursor == 5 ||
- + win.cursor == 7;
- return 0;
- }
-
- @@ -1936,6 +1954,10 @@ run(void)
- if (FD_ISSET(ttyfd, &rfd) || xev) {
- if (!drawing) {
- trigger = now;
- + if (IS_SET(MODE_BLINK)) {
- + win.mode ^= MODE_BLINK;
- + }
- + lastblink = now;
- drawing = 1;
- }
- timeout = (maxlatency - TIMEDIFF(now, trigger)) \
- @@ -1946,7 +1968,7 @@ run(void)
-
- /* idle detected or maxlatency exhausted -> draw */
- timeout = -1;
- - if (blinktimeout && tattrset(ATTR_BLINK)) {
- + if (blinktimeout && (cursorblinks || tattrset(ATTR_BLINK))) {
- timeout = blinktimeout - TIMEDIFF(now, lastblink);
- if (timeout <= 0) {
- if (-timeout > blinktimeout) /* start visible */
- @@ -1982,7 +2004,7 @@ main(int argc, char *argv[])
- {
- xw.l = xw.t = 0;
- xw.isfixed = False;
- - xsetcursor(cursorshape);
- + xsetcursor(cursorstyle);
-
- ARGBEGIN {
- case 'a':
- --
- 2.20.1
-
|