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:
		
							
								
								
									
										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
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user