[hackers] [st] Add SRM sequence || "Roberto E. Vargas Caballero"

From: <hg_AT_suckless.org>
Date: Tue, 13 Nov 2012 20:08:51 +0100 (CET)

changeset: 398:a6486f657de6
user: "Roberto E. Vargas Caballero" <k0ga_AT_shike2.com>
date: Tue Nov 13 20:04:26 2012 +0100
files: st.c
description:
Add SRM sequence
This sequence enable/disable the local echo.
---
 st.c |   76 ++++++++++++++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 56 insertions(+), 20 deletions(-)
diff -r b62ebd2e80d4 -r a6486f657de6 st.c
--- a/st.c	Sun Nov 11 19:46:34 2012 +0100
+++ b/st.c	Tue Nov 13 20:04:26 2012 +0100
_AT_@ -110,17 +110,18 @@
 };
 
 enum term_mode {
-	MODE_WRAP	= 1,
+	MODE_WRAP	 = 1,
 	MODE_INSERT      = 2,
 	MODE_APPKEYPAD   = 4,
 	MODE_ALTSCREEN   = 8,
-	MODE_CRLF	= 16,
+	MODE_CRLF	 = 16,
 	MODE_MOUSEBTN    = 32,
 	MODE_MOUSEMOTION = 64,
 	MODE_MOUSE       = 32|64,
 	MODE_REVERSE     = 128,
 	MODE_KBDLOCK     = 256,
-	MODE_HIDE      = 512
+	MODE_HIDE	 = 512,
+	MODE_ECHO	 = 1024
 };
 
 enum escape_state {
_AT_@ -320,6 +321,7 @@
 static void tsetdirt(int, int);
 static void tsetmode(bool, bool, int *, int);
 static void tfulldirt(void);
+static void techo(char *, int);
 
 static void ttynew(void);
 static void ttyread(void);
_AT_@ -1534,7 +1536,8 @@
 			case 4:  /* IRM -- Insertion-replacement */
 				MODBIT(term.mode, set, MODE_INSERT);
 				break;
-			case 12: /* XXX: SRM -- Send/Receive */
+			case 12: /* SRM -- Send/Receive */
+				MODBIT(term.mode, !set, MODE_ECHO);
 				break;
 			case 20: /* LNM -- Linefeed/new line */
 				MODBIT(term.mode, set, MODE_CRLF);
_AT_@ -1849,6 +1852,28 @@
 }
 
 void
+techo(char *buf, int len) {
+	for(; len > 0; buf++, len--) {
+		char c = *buf;
+
+		if(c == '\033') {		/* escape */
+			tputc("^", 1);
+			tputc("[", 1);
+		} else if (c < '\x20') {	/* control code */
+			if(c != '\n' && c != '\r' && c != '\t') {
+				c |= '\x40';
+				tputc("^", 1);
+			}
+			tputc(&c, 1);
+		} else {
+			break;
+		}
+	}
+	if (len)
+		tputc(buf, len);
+}
+
+void
 tputc(char *c, int len) {
 	uchar ascii = *c;
 	bool control = ascii < '\x20' || ascii == 0177;
_AT_@ -2679,7 +2704,7 @@
 kpress(XEvent *ev) {
 	XKeyEvent *e = &ev->xkey;
 	KeySym ksym;
-	char buf[32], *customkey;
+	char xstr[31], buf[32], *customkey, *cp = buf;
 	int len, meta, shift, i;
 	Status status;
 
_AT_@ -2688,7 +2713,7 @@
 
 	meta = e->state & Mod1Mask;
 	shift = e->state & ShiftMask;
-	len = XmbLookupString(xw.xic, e, buf, sizeof(buf), &ksym, &status);
+	len = XmbLookupString(xw.xic, e, xstr, sizeof(xstr), &ksym, &status);
 
 	/* 1. shortcuts */
 	for(i = 0; i < LEN(shortcuts); i++) {
_AT_@ -2702,7 +2727,8 @@
 
 	/* 2. custom keys from config.h */
 	if((customkey = kmap(ksym, e->state))) {
-		ttywrite(customkey, strlen(customkey));
+		len = strlen(customkey);
+		memcpy(buf, customkey, len);
 	/* 2. hardcoded (overrides X lookup) */
 	} else {
 		switch(ksym) {
_AT_@ -2714,34 +2740,44 @@
 			sprintf(buf, "\033%c%c",
 				IS_SET(MODE_APPKEYPAD) ? 'O' : '[',
 				(shift ? "dacb":"DACB")[ksym - XK_Left]);
-			ttywrite(buf, 3);
+			len = 3;
 			break;
 		case XK_Insert:
-			if(shift)
+			if(shift) {
 				selpaste();
+				return;
+			}
+			memcpy(buf, xstr, len);
 			break;
 		case XK_Return:
+			len = 0;
 			if(meta)
-				ttywrite("\033", 1);
+				*cp++ = '\033', len++;
 
-			if(IS_SET(MODE_CRLF)) {
-				ttywrite("\r\n", 2);
-			} else {
-				ttywrite("\r", 1);
-			}
+			*cp++ = '\r', len++;
+
+			if(IS_SET(MODE_CRLF))
+				*cp = '\n', len++;
 			break;
 			/* 3. X lookup  */
 		default:
-			if(len > 0) {
-				if(meta && len == 1)
-					ttywrite("\033", 1);
-				ttywrite(buf, len);
-			}
+			if(len == 0)
+				return;
+
+			if (len == 1 && meta)
+				*cp++ = '\033';
+
+			memcpy(cp, xstr, len);
+			len = cp - buf + len;
 			break;
 		}
 	}
+	ttywrite(buf, len);
+	if(IS_SET(MODE_ECHO))
+		techo(buf, len);
 }
 
+
 void
 cmessage(XEvent *e) {
 	/* See xembed specs
Received on Tue Nov 13 2012 - 20:08:51 CET

This archive was generated by hypermail 2.3.0 : Tue Nov 13 2012 - 20:12:06 CET