# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit 3af49e34f666554fcd52a52a7ca15f3e7eafa197
    parent a7d7e29300acade90f2025f0b85fa5eae06edb24
    Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
    Date:   Wed, 26 Sep 2012 20:55:18 +0200

    Allow control characters inside escape sequences

    Taken from vt100 manual programmer:

    	Control characters (codes \0 to \37 inclusive) are specifically
    	excluded from the control sequence syntax, but may be embedded
    	within a control sequence. Embedded control characters are executed
    	as soon as they are encountered by the VT100. The processing of the
    	control sequence then continues with the next character received.
    ---
     st.c |   68 +++++++++++++++++++++++++++++++++---------------------------------
     1 file changed, 34 insertions(+), 34 deletions(-)
    Diffstat:
    Mst.c | 68++++++++++++++++++++++++++++++++++----------------------------------

    1 file changed, 34 insertions(+), 34 deletions(-)
    diff --git a/st.c b/st.c
    @@ -1668,6 +1668,32 @@ tputc(char *c, int len) {
     	if(iofd != -1)
     		write(iofd, c, len);

    +	switch(ascii) {
    +	case '\t':
    +		tputtab(1);
    +		return;
    +	case '\b':
    +		tmoveto(term.c.x-1, term.c.y);
    +		return;
    +	case '\r':
    +		tmoveto(0, term.c.y);
    +		return;
    +	case '\f':
    +	case '\v':
    +	case '\n':
    +		/* go to first col if the mode is set */
    +		tnewline(IS_SET(MODE_CRLF));
    +		return;
    +	case '\a':
    +		if(!(xw.state & WIN_FOCUSED))
    +			xseturgency(1);
    +		return;
    +	case '\033':
    +		csireset();
    +		term.esc = ESC_START;
    +		return;
    +	}
    +
     	if(term.esc & ESC_START) {
     		if(term.esc & ESC_CSI) {
     			csiescseq.buf[csiescseq.len++] = ascii;
    @@ -1791,40 +1817,14 @@ tputc(char *c, int len) {
     	} else {
     		if(sel.bx != -1 && BETWEEN(term.c.y, sel.by, sel.ey))
     			sel.bx = -1;
    -		switch(ascii) {
    -		case '\t':
    -			tputtab(1);
    -			break;
    -		case '\b':
    -			tmoveto(term.c.x-1, term.c.y);
    -			break;
    -		case '\r':
    -			tmoveto(0, term.c.y);
    -			break;
    -		case '\f':
    -		case '\v':
    -		case '\n':
    -			/* go to first col if the mode is set */
    -			tnewline(IS_SET(MODE_CRLF));
    -			break;
    -		case '\a':
    -			if(!(xw.state & WIN_FOCUSED))
    -				xseturgency(1);
    -			break;
    -		case '\033':
    -			csireset();
    -			term.esc = ESC_START;
    -			break;
    -		default:
    -			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;
    -			}
    +		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;
     		}
     	}
     }