123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- From a3cdd0753bf578cd4e6db7c6507481f3b5c38aea Mon Sep 17 00:00:00 2001
- From: Steve Ward <planet36@gmail.com>
- Date: Tue, 16 Nov 2021 14:15:06 -0500
- Subject: [PATCH] Allow blinking cursor
- ---
- config.def.h | 19 +++++++++++++------
- x.c | 47 +++++++++++++++++++++++++++++++++++------------
- 2 files changed, 48 insertions(+), 18 deletions(-)
- diff --git a/config.def.h b/config.def.h
- index 6f05dce..1a5fed0 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 ("☃") */
-
- /*
- * Default columns and rows numbers
- diff --git a/x.c b/x.c
- index 89786b8..7d2447d 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)
- @@ -1529,29 +1530,44 @@ 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) */
- + default:
- + 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 - \
- cursorthickness,
- win.cw, cursorthickness);
- break;
- - case 5: /* Blinking bar */
- - case 6: /* Steady bar */
- + 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,
- @@ -1708,9 +1724,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;
- }
-
- @@ -1954,6 +1973,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)) \
- @@ -1964,7 +1987,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 */
- @@ -2000,7 +2023,7 @@ main(int argc, char *argv[])
- {
- xw.l = xw.t = 0;
- xw.isfixed = False;
- - xsetcursor(cursorshape);
- + xsetcursor(cursorstyle);
-
- ARGBEGIN {
- case 'a':
- --
- 2.34.0
|