Add SRM sequence
This sequence enable/disable the local echo. --- st.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 56 insertions(+), 20 deletions(-)
This commit is contained in:
		
							parent
							
								
									ace789a79f
								
							
						
					
					
						commit
						73177ba366
					
				
							
								
								
									
										76
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										76
									
								
								st.c
									
									
									
									
									
								
							| @ -110,17 +110,18 @@ enum glyph_state { | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| enum term_mode { | enum term_mode { | ||||||
| 	MODE_WRAP	= 1, | 	MODE_WRAP	 = 1, | ||||||
| 	MODE_INSERT      = 2, | 	MODE_INSERT      = 2, | ||||||
| 	MODE_APPKEYPAD   = 4, | 	MODE_APPKEYPAD   = 4, | ||||||
| 	MODE_ALTSCREEN   = 8, | 	MODE_ALTSCREEN   = 8, | ||||||
| 	MODE_CRLF	= 16, | 	MODE_CRLF	 = 16, | ||||||
| 	MODE_MOUSEBTN    = 32, | 	MODE_MOUSEBTN    = 32, | ||||||
| 	MODE_MOUSEMOTION = 64, | 	MODE_MOUSEMOTION = 64, | ||||||
| 	MODE_MOUSE       = 32|64, | 	MODE_MOUSE       = 32|64, | ||||||
| 	MODE_REVERSE     = 128, | 	MODE_REVERSE     = 128, | ||||||
| 	MODE_KBDLOCK     = 256, | 	MODE_KBDLOCK     = 256, | ||||||
| 	MODE_HIDE      = 512 | 	MODE_HIDE	 = 512, | ||||||
|  | 	MODE_ECHO	 = 1024 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| enum escape_state { | enum escape_state { | ||||||
| @ -320,6 +321,7 @@ static void tswapscreen(void); | |||||||
| static void tsetdirt(int, int); | static void tsetdirt(int, int); | ||||||
| static void tsetmode(bool, bool, int *, int); | static void tsetmode(bool, bool, int *, int); | ||||||
| static void tfulldirt(void); | static void tfulldirt(void); | ||||||
|  | static void techo(char *, int); | ||||||
| 
 | 
 | ||||||
| static void ttynew(void); | static void ttynew(void); | ||||||
| static void ttyread(void); | static void ttyread(void); | ||||||
| @ -1534,7 +1536,8 @@ tsetmode(bool priv, bool set, int *args, int narg) { | |||||||
| 			case 4:  /* IRM -- Insertion-replacement */ | 			case 4:  /* IRM -- Insertion-replacement */ | ||||||
| 				MODBIT(term.mode, set, MODE_INSERT); | 				MODBIT(term.mode, set, MODE_INSERT); | ||||||
| 				break; | 				break; | ||||||
| 			case 12: /* XXX: SRM -- Send/Receive */ | 			case 12: /* SRM -- Send/Receive */ | ||||||
|  | 				MODBIT(term.mode, !set, MODE_ECHO); | ||||||
| 				break; | 				break; | ||||||
| 			case 20: /* LNM -- Linefeed/new line */ | 			case 20: /* LNM -- Linefeed/new line */ | ||||||
| 				MODBIT(term.mode, set, MODE_CRLF); | 				MODBIT(term.mode, set, MODE_CRLF); | ||||||
| @ -1848,6 +1851,28 @@ tputtab(bool forward) { | |||||||
| 	tmoveto(x, term.c.y); | 	tmoveto(x, term.c.y); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 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 | void | ||||||
| tputc(char *c, int len) { | tputc(char *c, int len) { | ||||||
| 	uchar ascii = *c; | 	uchar ascii = *c; | ||||||
| @ -2679,7 +2704,7 @@ void | |||||||
| kpress(XEvent *ev) { | kpress(XEvent *ev) { | ||||||
| 	XKeyEvent *e = &ev->xkey; | 	XKeyEvent *e = &ev->xkey; | ||||||
| 	KeySym ksym; | 	KeySym ksym; | ||||||
| 	char buf[32], *customkey; | 	char xstr[31], buf[32], *customkey, *cp = buf; | ||||||
| 	int len, meta, shift, i; | 	int len, meta, shift, i; | ||||||
| 	Status status; | 	Status status; | ||||||
| 
 | 
 | ||||||
| @ -2688,7 +2713,7 @@ kpress(XEvent *ev) { | |||||||
| 
 | 
 | ||||||
| 	meta = e->state & Mod1Mask; | 	meta = e->state & Mod1Mask; | ||||||
| 	shift = e->state & ShiftMask; | 	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 */ | 	/* 1. shortcuts */ | ||||||
| 	for(i = 0; i < LEN(shortcuts); i++) { | 	for(i = 0; i < LEN(shortcuts); i++) { | ||||||
| @ -2702,7 +2727,8 @@ kpress(XEvent *ev) { | |||||||
| 
 | 
 | ||||||
| 	/* 2. custom keys from config.h */ | 	/* 2. custom keys from config.h */ | ||||||
| 	if((customkey = kmap(ksym, e->state))) { | 	if((customkey = kmap(ksym, e->state))) { | ||||||
| 		ttywrite(customkey, strlen(customkey)); | 		len = strlen(customkey); | ||||||
|  | 		memcpy(buf, customkey, len); | ||||||
| 	/* 2. hardcoded (overrides X lookup) */ | 	/* 2. hardcoded (overrides X lookup) */ | ||||||
| 	} else { | 	} else { | ||||||
| 		switch(ksym) { | 		switch(ksym) { | ||||||
| @ -2714,34 +2740,44 @@ kpress(XEvent *ev) { | |||||||
| 			sprintf(buf, "\033%c%c", | 			sprintf(buf, "\033%c%c", | ||||||
| 				IS_SET(MODE_APPKEYPAD) ? 'O' : '[', | 				IS_SET(MODE_APPKEYPAD) ? 'O' : '[', | ||||||
| 				(shift ? "dacb":"DACB")[ksym - XK_Left]); | 				(shift ? "dacb":"DACB")[ksym - XK_Left]); | ||||||
| 			ttywrite(buf, 3); | 			len = 3; | ||||||
| 			break; | 			break; | ||||||
| 		case XK_Insert: | 		case XK_Insert: | ||||||
| 			if(shift) | 			if(shift) { | ||||||
| 				selpaste(); | 				selpaste(); | ||||||
|  | 				return; | ||||||
|  | 			} | ||||||
|  | 			memcpy(buf, xstr, len); | ||||||
| 			break; | 			break; | ||||||
| 		case XK_Return: | 		case XK_Return: | ||||||
|  | 			len = 0; | ||||||
| 			if(meta) | 			if(meta) | ||||||
| 				ttywrite("\033", 1); | 				*cp++ = '\033', len++; | ||||||
| 
 | 
 | ||||||
| 			if(IS_SET(MODE_CRLF)) { | 			*cp++ = '\r', len++; | ||||||
| 				ttywrite("\r\n", 2); | 
 | ||||||
| 			} else { | 			if(IS_SET(MODE_CRLF)) | ||||||
| 				ttywrite("\r", 1); | 				*cp = '\n', len++; | ||||||
| 			} |  | ||||||
| 			break; | 			break; | ||||||
| 			/* 3. X lookup  */ | 			/* 3. X lookup  */ | ||||||
| 		default: | 		default: | ||||||
| 			if(len > 0) { | 			if(len == 0) | ||||||
| 				if(meta && len == 1) | 				return; | ||||||
| 					ttywrite("\033", 1); | 
 | ||||||
| 				ttywrite(buf, len); | 			if (len == 1 && meta) | ||||||
| 			} | 				*cp++ = '\033'; | ||||||
|  | 
 | ||||||
|  | 			memcpy(cp, xstr, len); | ||||||
|  | 			len = cp - buf + len; | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	ttywrite(buf, len); | ||||||
|  | 	if(IS_SET(MODE_ECHO)) | ||||||
|  | 		techo(buf, len); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
| void | void | ||||||
| cmessage(XEvent *e) { | cmessage(XEvent *e) { | ||||||
| 	/* See xembed specs
 | 	/* See xembed specs
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Roberto E. Vargas Caballero
						Roberto E. Vargas Caballero