[hackers] [st] Print control codes only in graphic mode || "Roberto E. Vargas Caballero"

From: <hg_AT_suckless.org>
Date: Sat, 6 Oct 2012 19:19:04 +0200 (CEST)

changeset: 357:f85525f8f636
tag: tip
user: "Roberto E. Vargas Caballero" <k0ga_AT_shike2.com>
date: Sat Oct 06 19:15:30 2012 +0200
files: st.c
description:
Print control codes only in graphic mode
Non handled codes must be ignored, except in graphic mode. Also STR
sequences have higher priority than control codes, so they must be handled
before of them.
---
 st.c |  160 ++++++++++++++++++++++++++++++++++++------------------------------
 1 file changed, 87 insertions(+), 73 deletions(-)
diff -r 1a27e212bc4d -r f85525f8f636 st.c
--- a/st.c	Sat Oct 06 19:13:36 2012 +0200
+++ b/st.c	Sat Oct 06 19:15:30 2012 +0200
_AT_@ -1784,56 +1784,80 @@
 void
 tputc(char *c, int len) {
 	uchar ascii = *c;
+	bool control = ascii < '\x20' || ascii == 0177;
 
 	if(iofd != -1)
 		write(iofd, c, len);
-
-	switch(ascii) {
-	case '\t':	/* HT */
-		tputtab(1);
+	/*
+	 * STR sequences must be checked before of anything
+	 * because it can use some control codes as part of the sequence
+	 */
+	if(term.esc & ESC_STR) {
+		switch(ascii) {
+		case '\033':
+			term.esc = ESC_START | ESC_STR_END;
+			break;
+		case '\a': /* backwards compatibility to xterm */
+			term.esc = 0;
+			strhandle();
+			break;
+		default:
+			strescseq.buf[strescseq.len++] = ascii;
+			if(strescseq.len+1 >= STR_BUF_SIZ) {
+				term.esc = 0;
+				strhandle();
+			}
+		}
 		return;
-	case '\b':	/* BS */
-		tmoveto(term.c.x-1, term.c.y);
-		return;
-	case '\r':	/* CR */
-		tmoveto(0, term.c.y);
-		return;
-	case '\f':	/* LF */
-	case '\v':	/* VT */
-	case '\n':	/* LF */
-		/* go to first col if the mode is set */
-		tnewline(IS_SET(MODE_CRLF));
-		return;
-	case '\a':	/* BEL */
-		if(term.esc & ESC_STR)
-			break;
-		if(!(xw.state & WIN_FOCUSED))
-			xseturgency(1);
-		return;
-	case '\033':	/* ESC */
-		csireset();
-		term.esc = ESC_START;
-		return;
-	case '\016':	/* SO */
-		term.c.attr.mode |= ATTR_GFX;
-		break;
-	case '\017':	/* SI */
-		term.c.attr.mode &= ~ATTR_GFX;
-		return;
-	case '\032':	/* SUB */
-	case '\030':	/* CAN */
-		csireset();
-		return;
-	default:
-	/* case '\005':	ENQ (IGNORED) */
-	/* case '\000':	NUL (IGNORED) */
-	/* case '\021':	XON (IGNORED) */
-	/* case '\023':	XOFF (IGNORED) */
-	/* case 0177:	DEL (IGNORED) */
-		break;
 	}
-
-	if(term.esc & ESC_START) {
+	/*
+	 * Actions of control codes must be performed as soon they arrive
+	 * because they can be embedded inside a control sequence, and
+	 * they must not cause conflicts with sequences.
+	 */
+	if(control) {
+		switch(ascii) {
+		case '\t':	/* HT */
+			tputtab(1);
+			return;
+		case '\b':	/* BS */
+			tmoveto(term.c.x-1, term.c.y);
+			return;
+		case '\r':	/* CR */
+			tmoveto(0, term.c.y);
+			return;
+		case '\f':	/* LF */
+		case '\v':	/* VT */
+		case '\n':	/* LF */
+			/* go to first col if the mode is set */
+			tnewline(IS_SET(MODE_CRLF));
+			return;
+		case '\a':	/* BEL */
+			if(!(xw.state & WIN_FOCUSED))
+				xseturgency(1);
+			return;
+		case '\033':	/* ESC */
+			csireset();
+			term.esc = ESC_START;
+			return;
+		case '\016':	/* SO */
+			term.c.attr.mode |= ATTR_GFX;
+			return;
+		case '\017':	/* SI */
+			term.c.attr.mode &= ~ATTR_GFX;
+			return;
+		case '\032':	/* SUB */
+		case '\030':	/* CAN */
+			csireset();
+			return;
+		 case '\005':	/* ENQ (IGNORED) */
+		 case '\000':	/* NUL (IGNORED) */
+		 case '\021':	/* XON (IGNORED) */
+		 case '\023':	/* XOFF (IGNORED) */
+		 case 0177:	/* DEL (IGNORED) */
+			return;
+		}
+	} else if(term.esc & ESC_START) {
 		if(term.esc & ESC_CSI) {
 			csiescseq.buf[csiescseq.len++] = ascii;
 			if(BETWEEN(ascii, 0x40, 0x7E)
_AT_@ -1841,22 +1865,6 @@
 				term.esc = 0;
 				csiparse(), csihandle();
 			}
-		} else if(term.esc & ESC_STR) {
-			switch(ascii) {
-			case '\033':
-				term.esc = ESC_START | ESC_STR_END;
-				break;
-			case '\a': /* backwards compatibility to xterm */
-				term.esc = 0;
-				strhandle();
-				break;
-			default:
-				strescseq.buf[strescseq.len++] = ascii;
-				if(strescseq.len+1 >= STR_BUF_SIZ) {
-					term.esc = 0;
-					strhandle();
-				}
-			}
 		} else if(term.esc & ESC_STR_END) {
 			term.esc = 0;
 			if(ascii == '\\')
_AT_@ -1955,20 +1963,26 @@
 				term.esc = 0;
 			}
 		}
-	} else {
-		if(sel.bx != -1 && BETWEEN(term.c.y, sel.by, sel.ey))
-			sel.bx = -1;
-		if(ascii >= '\020' || term.c.attr.mode & ATTR_GFX) {
-			if(IS_SET(MODE_WRAP) && term.c.state & CURSOR_WRAPNEXT)
-				tnewline(1); /* always go to first col */
-			tsetchar(c);
-			if(term.c.x+1 < term.col) {
-				tmoveto(term.c.x+1, term.c.y);
-			} else {
-				term.c.state |= CURSOR_WRAPNEXT;
-			}
-		}
+		/*
+		 * All characters which forms part of a sequence are not
+		 * printed
+		 */
+		return;
 	}
+	/*
+	 * Display control codes only if we are in graphic mode
+	 */
+	if(control && !(term.c.attr.mode & ATTR_GFX))
+		return;
+	if(sel.bx != -1 && BETWEEN(term.c.y, sel.by, sel.ey))
+		sel.bx = -1;
+	if(IS_SET(MODE_WRAP) && term.c.state & CURSOR_WRAPNEXT)
+		tnewline(1); /* always go to first col */
+	tsetchar(c);
+	if(term.c.x+1 < term.col)
+		tmoveto(term.c.x+1, term.c.y);
+	else
+		term.c.state |= CURSOR_WRAPNEXT;
 }
 
 int
Received on Sat Oct 06 2012 - 19:19:04 CEST

This archive was generated by hypermail 2.3.0 : Sat Oct 06 2012 - 19:24:09 CEST