| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -110,17 +110,18 @@ enum glyph_state { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					}; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					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 { | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -320,6 +321,7 @@ static void tswapscreen(void); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					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); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -1534,7 +1536,8 @@ tsetmode(bool priv, bool set, int *args, int narg) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								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); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -1848,6 +1851,28 @@ tputtab(bool forward) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						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 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					tputc(char *c, int len) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						uchar ascii = *c; | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -2679,7 +2704,7 @@ void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					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; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -2688,7 +2713,7 @@ kpress(XEvent *ev) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						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++) { | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -2702,7 +2727,8 @@ kpress(XEvent *ev) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						/* 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) { | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -2714,34 +2740,44 @@ kpress(XEvent *ev) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								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 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |