Adding blinking cursor patch ref. #20

This commit is contained in:
bakkeby 2021-05-08 10:13:20 +02:00
parent 8f79391f16
commit ce05a34de1
4 changed files with 91 additions and 6 deletions

View File

@ -15,6 +15,8 @@ Refer to [https://st.suckless.org/](https://st.suckless.org/) for details on the
### Changelog: ### Changelog:
2021-05-08 - Added blinking cursor patch
2021-05-07 - Added xresources reload patch 2021-05-07 - Added xresources reload patch
2021-04-21 - Added (temporary?) hack for Variable Fonts (VT) support 2021-04-21 - Added (temporary?) hack for Variable Fonts (VT) support
@ -70,6 +72,9 @@ Refer to [https://st.suckless.org/](https://st.suckless.org/) for details on the
- [anysize_nobar](https://github.com/connor-brooks/st-anysize-nobar) - [anysize_nobar](https://github.com/connor-brooks/st-anysize-nobar)
- a patch that aims to prevent black bars being drawn on the edges of st terminals using the anysize patch - a patch that aims to prevent black bars being drawn on the edges of st terminals using the anysize patch
- [blinking-cursor](https://st.suckless.org/patches/blinking_cursor/)
- allows the use of a blinking cursor
- [bold-is-not-bright](https://st.suckless.org/patches/bold-is-not-bright/) - [bold-is-not-bright](https://st.suckless.org/patches/bold-is-not-bright/)
- by default bold text is rendered with a bold font in the bright variant of the current color - by default bold text is rendered with a bold font in the bright variant of the current color
- this patch makes bold text rendered simply as bold, leaving the color unaffected - this patch makes bold text rendered simply as bold, leaving the color unaffected

View File

@ -175,6 +175,23 @@ unsigned int defaultbg = 258;
unsigned int defaultcs = 256; unsigned int defaultcs = 256;
unsigned int defaultrcs = 257; unsigned int defaultrcs = 257;
#if BLINKING_CURSOR_PATCH
/*
* 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 cursorstyle = 1;
static Rune stcursor = 0x2603; /* snowman (U+2603) */
#else
/* /*
* Default shape of cursor * Default shape of cursor
* 2: Block ("") * 2: Block ("")
@ -183,6 +200,7 @@ unsigned int defaultrcs = 257;
* 7: Snowman ("") * 7: Snowman ("")
*/ */
static unsigned int cursorshape = 2; static unsigned int cursorshape = 2;
#endif // BLINKING_CURSOR_PATCH
/* /*
* Default columns and rows numbers * Default columns and rows numbers

View File

@ -35,6 +35,14 @@
*/ */
#define ANYSIZE_NOBAR_PATCH 0 #define ANYSIZE_NOBAR_PATCH 0
/* This patch allows the use of a blinking cursor.
* Only cursor styles 0, 1, 3, 5, and 7 blink. Set cursorstyle accordingly.
* Cursor styles are defined here:
* 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
* https://st.suckless.org/patches/blinking_cursor/
*/
#define BLINKING_CURSOR_PATCH 0
/* By default bold text is rendered with a bold font in the bright variant of the current color. /* By default bold text is rendered with a bold font in the bright variant of the current color.
* This patch makes bold text rendered simply as bold, leaving the color unaffected. * This patch makes bold text rendered simply as bold, leaving the color unaffected.
* https://st.suckless.org/patches/bold-is-not-bright/ * https://st.suckless.org/patches/bold-is-not-bright/

66
x.c
View File

@ -186,6 +186,9 @@ static char *opt_dir = NULL;
#endif // WORKINGDIR_PATCH #endif // WORKINGDIR_PATCH
static int oldbutton = 3; /* button event on startup: 3 = release */ static int oldbutton = 3; /* button event on startup: 3 = release */
#if BLINKING_CURSOR_PATCH
static int cursorblinks = 0;
#endif // BLINKING_CURSOR_PATCH
#if VISUALBELL_1_PATCH #if VISUALBELL_1_PATCH
static int bellon = 0; /* visual bell status */ static int bellon = 0; /* visual bell status */
#endif // VISUALBELL_1_PATCH #endif // VISUALBELL_1_PATCH
@ -1826,16 +1829,28 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
/* draw the new one */ /* draw the new one */
if (IS_SET(MODE_FOCUSED)) { if (IS_SET(MODE_FOCUSED)) {
switch (win.cursor) { switch (win.cursor) {
#if !BLINKING_CURSOR_PATCH
case 7: /* st extension */ case 7: /* st extension */
g.u = 0x2603; /* snowman (U+2603) */ g.u = 0x2603; /* snowman (U+2603) */
/* FALLTHROUGH */ /* FALLTHROUGH */
case 0: /* Blinking Block */ #endif // BLINKING_CURSOR_PATCH
case 1: /* Blinking Block (Default) */ case 0: /* Blinking block */
case 2: /* Steady Block */ case 1: /* Blinking block (default) */
#if BLINKING_CURSOR_PATCH
if (IS_SET(MODE_BLINK))
break;
/* FALLTHROUGH */
#endif // BLINKING_CURSOR_PATCH
case 2: /* Steady block */
xdrawglyph(g, cx, cy); xdrawglyph(g, cx, cy);
break; break;
case 3: /* Blinking Underline */ case 3: /* Blinking underline */
case 4: /* Steady Underline */ #if BLINKING_CURSOR_PATCH
if (IS_SET(MODE_BLINK))
break;
/* FALLTHROUGH */
#endif // BLINKING_CURSOR_PATCH
case 4: /* Steady underline */
#if ANYSIZE_PATCH #if ANYSIZE_PATCH
XftDrawRect(xw.draw, &drawcol, XftDrawRect(xw.draw, &drawcol,
win.hborderpx + cx * win.cw, win.hborderpx + cx * win.cw,
@ -1851,6 +1866,11 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
#endif // ANYSIZE_PATCH #endif // ANYSIZE_PATCH
break; break;
case 5: /* Blinking bar */ case 5: /* Blinking bar */
#if BLINKING_CURSOR_PATCH
if (IS_SET(MODE_BLINK))
break;
/* FALLTHROUGH */
#endif // BLINKING_CURSOR_PATCH
case 6: /* Steady bar */ case 6: /* Steady bar */
XftDrawRect(xw.draw, &drawcol, XftDrawRect(xw.draw, &drawcol,
#if ANYSIZE_PATCH #if ANYSIZE_PATCH
@ -1862,6 +1882,16 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)
#endif // ANYSIZE_PATCH #endif // ANYSIZE_PATCH
cursorthickness, win.ch); cursorthickness, win.ch);
break; break;
#if BLINKING_CURSOR_PATCH
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;
#endif // BLINKING_CURSOR_PATCH
} }
} else { } else {
XftDrawRect(xw.draw, &drawcol, XftDrawRect(xw.draw, &drawcol,
@ -2150,9 +2180,18 @@ xsetmode(int set, unsigned int flags)
int int
xsetcursor(int cursor) xsetcursor(int cursor)
{ {
#if BLINKING_CURSOR_PATCH
if (!BETWEEN(cursor, 0, 8)) /* 7-8: st extensions */
#else
if (!BETWEEN(cursor, 0, 7)) /* 7: st extension */ if (!BETWEEN(cursor, 0, 7)) /* 7: st extension */
#endif // BLINKING_CURSOR_PATCH
return 1; return 1;
win.cursor = cursor; win.cursor = cursor;
#if BLINKING_CURSOR_PATCH
cursorblinks = win.cursor == 0 || win.cursor == 1 ||
win.cursor == 3 || win.cursor == 5 ||
win.cursor == 7;
#endif // BLINKING_CURSOR_PATCH
return 0; return 0;
} }
@ -2439,6 +2478,12 @@ run(void)
if (FD_ISSET(ttyfd, &rfd) || xev) { if (FD_ISSET(ttyfd, &rfd) || xev) {
if (!drawing) { if (!drawing) {
trigger = now; trigger = now;
#if BLINKING_CURSOR_PATCH
if (IS_SET(MODE_BLINK)) {
win.mode ^= MODE_BLINK;
}
lastblink = now;
#endif // BLINKING_CURSOR_PATCH
drawing = 1; drawing = 1;
} }
timeout = (maxlatency - TIMEDIFF(now, trigger)) \ timeout = (maxlatency - TIMEDIFF(now, trigger)) \
@ -2449,7 +2494,12 @@ run(void)
/* idle detected or maxlatency exhausted -> draw */ /* idle detected or maxlatency exhausted -> draw */
timeout = -1; timeout = -1;
if (blinktimeout && tattrset(ATTR_BLINK)) { #if BLINKING_CURSOR_PATCH
if (blinktimeout && (cursorblinks || tattrset(ATTR_BLINK)))
#else
if (blinktimeout && tattrset(ATTR_BLINK))
#endif // BLINKING_CURSOR_PATCH
{
timeout = blinktimeout - TIMEDIFF(now, lastblink); timeout = blinktimeout - TIMEDIFF(now, lastblink);
if (timeout <= 0) { if (timeout <= 0) {
if (-timeout > blinktimeout) /* start visible */ if (-timeout > blinktimeout) /* start visible */
@ -2511,7 +2561,11 @@ main(int argc, char *argv[])
{ {
xw.l = xw.t = 0; xw.l = xw.t = 0;
xw.isfixed = False; xw.isfixed = False;
#if BLINKING_CURSOR_PATCH
xsetcursor(cursorstyle);
#else
xsetcursor(cursorshape); xsetcursor(cursorshape);
#endif // BLINKING_CURSOR_PATCH
ARGBEGIN { ARGBEGIN {
case 'a': case 'a':