| 
																	
																	
																		
																			
																		
																	
																	
																 | 
																@ -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)) { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				ttywrite("\r\n", 2); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			} else { | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																				ttywrite("\r", 1); | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																			} | 
																 | 
																 | 
																 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			*cp++ = '\r', len++; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																			if(IS_SET(MODE_CRLF)) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																				*cp = '\n', len++; | 
															
														
														
													
														
															
																 | 
																 | 
																			break; | 
																 | 
																 | 
																			break; | 
															
														
														
													
														
															
																 | 
																 | 
																			/* 3. X lookup  */ | 
																 | 
																 | 
																			/* 3. X lookup  */ | 
															
														
														
													
														
															
																 | 
																 | 
																		default: | 
																 | 
																 | 
																		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; | 
																 | 
																 | 
																			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 | 
															
														
														
													
												
													
														
															
																| 
																	
																		
																			
																		
																	
																	
																	
																 | 
																
  |