st

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 4810dba9b85a48219086ea49e006a65768c19216
parent 0277876196bd47776e6980c20b1a142b3a04dd5f
Author: DEliasVilelaC <danielvilelayo@gmail.com>
Date:   Sun, 20 Feb 2022 20:39:15 -0500

feat: add blinking cursor patch

Diffstat:
Mconfig.def.h | 19+++++++++++++------
Mx.c | 43++++++++++++++++++++++++++++++-------------
2 files changed, 43 insertions(+), 19 deletions(-)

diff --git a/config.def.h b/config.def.h @@ -153,13 +153,20 @@ unsigned int defaultcs = 256; 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 @@ -265,6 +265,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) @@ -315,7 +316,7 @@ changealpha(const Arg *arg) alpha = 0; if(alpha > 1) alpha = 1; - + xloadcols(); redraw(); } @@ -1648,15 +1649,19 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og, Line line, int le /* draw the new one */ if (IS_SET(MODE_FOCUSED)) { switch (win.cursor) { - case 7: /* st extension: snowman (U+2603) */ - g.u = 0x2603; - case 0: /* Blinking Block */ - case 1: /* Blinking Block (Default) */ - case 2: /* Steady Block */ + 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 */ - 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 - \ @@ -1664,13 +1669,18 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og, Line line, int le 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; } else { XftDrawRect(xw.draw, &drawcol, borderpx + cx * win.cw, @@ -1817,9 +1827,12 @@ int xsetcursor(int cursor) { DEFAULT(cursor, 1); - if (!BETWEEN(cursor, 0, 6)) + 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; } @@ -2058,6 +2071,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)) \ @@ -2068,7 +2085,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 */ @@ -2170,7 +2187,7 @@ xrdb_load(void) XRESOURCE_LOAD_INTEGER("bellvolume", bellvolume); XRESOURCE_LOAD_INTEGER("borderpx", borderpx); /* XRESOURCE_LOAD_INTEGER("borderless", borderless); */ - XRESOURCE_LOAD_INTEGER("cursorshape", cursorshape); + XRESOURCE_LOAD_INTEGER("cursorstyle", cursorstyle); /* cursorblinkstate = 1; // in case if cursor shape was changed from a blinking one to a non-blinking */ /* XRESOURCE_LOAD_INTEGER("cursorthickness", cursorthickness); */ @@ -2281,7 +2298,7 @@ main(int argc, char *argv[]) { xw.l = xw.t = 0; xw.isfixed = False; - win.cursor = cursorshape; + xsetcursor(cursorstyle); ARGBEGIN { case 'a':