Add MC for a single line
This sequence print the current line. It is different to the 'printer on' sequence, where all the characters that arrive to the terminal are printer. Here only the ascii characters are printed.
This commit is contained in:
		
							parent
							
								
									1f0d981bd7
								
							
						
					
					
						commit
						cf332a325d
					
				
							
								
								
									
										41
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								st.c
									
									
									
									
									
								
							| @ -356,6 +356,8 @@ static void strparse(void); | |||||||
| static void strreset(void); | static void strreset(void); | ||||||
| 
 | 
 | ||||||
| static int tattrset(int); | static int tattrset(int); | ||||||
|  | static void tprinter(char *s, size_t len); | ||||||
|  | static void tdumpline(int); | ||||||
| static void tclearregion(int, int, int, int); | static void tclearregion(int, int, int, int); | ||||||
| static void tcursor(int); | static void tcursor(int); | ||||||
| static void tdeletechar(int); | static void tdeletechar(int); | ||||||
| @ -470,7 +472,7 @@ static STREscape strescseq; | |||||||
| static int cmdfd; | static int cmdfd; | ||||||
| static pid_t pid; | static pid_t pid; | ||||||
| static Selection sel; | static Selection sel; | ||||||
| static int iofd; | static int iofd = STDOUT_FILENO; | ||||||
| static char **opt_cmd = NULL; | static char **opt_cmd = NULL; | ||||||
| static char *opt_io = NULL; | static char *opt_io = NULL; | ||||||
| static char *opt_title = NULL; | static char *opt_title = NULL; | ||||||
| @ -1985,6 +1987,8 @@ csihandle(void) { | |||||||
| 		switch(csiescseq.arg[0]) { | 		switch(csiescseq.arg[0]) { | ||||||
| 		case 0: | 		case 0: | ||||||
| 		case 1: | 		case 1: | ||||||
|  | 			tdumpline(term.c.y); | ||||||
|  | 			break; | ||||||
| 		case 4: | 		case 4: | ||||||
| 			term.mode &= ~MODE_PRINT; | 			term.mode &= ~MODE_PRINT; | ||||||
| 			break; | 			break; | ||||||
| @ -2265,6 +2269,31 @@ strreset(void) { | |||||||
| 	memset(&strescseq, 0, sizeof(strescseq)); | 	memset(&strescseq, 0, sizeof(strescseq)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void | ||||||
|  | tprinter(char *s, size_t len) { | ||||||
|  | 	if(iofd != -1 && xwrite(iofd, s, len) < 0) { | ||||||
|  | 		fprintf(stderr, "Error writing in %s:%s\n", | ||||||
|  | 			opt_io, strerror(errno)); | ||||||
|  | 		close(iofd); | ||||||
|  | 		iofd = -1; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void | ||||||
|  | tdumpline(int n) { | ||||||
|  | 	Glyph *bp, *end; | ||||||
|  | 
 | ||||||
|  | 	bp = &term.line[n][0]; | ||||||
|  | 	end = &bp[term.col-1]; | ||||||
|  | 	while(end > bp && !strcmp(" ", end->c)) | ||||||
|  | 		--end; | ||||||
|  | 	if(bp != end || strcmp(bp->c, " ")) { | ||||||
|  | 		for( ;bp <= end; ++bp) | ||||||
|  | 			tprinter(bp->c, strlen(bp->c)); | ||||||
|  | 	} | ||||||
|  | 	tprinter("\n", 1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void | void | ||||||
| tputtab(bool forward) { | tputtab(bool forward) { | ||||||
| 	uint x = term.c.x; | 	uint x = term.c.x; | ||||||
| @ -2346,14 +2375,8 @@ tputc(char *c, int len) { | |||||||
| 		width = wcwidth(u8char); | 		width = wcwidth(u8char); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if(IS_SET(MODE_PRINT) && iofd != -1) { | 	if(IS_SET(MODE_PRINT)) | ||||||
| 		if(xwrite(iofd, c, len) < 0) { | 		tprinter(c, len); | ||||||
| 			fprintf(stderr, "Error writing in %s:%s\n", |  | ||||||
| 				opt_io, strerror(errno)); |  | ||||||
| 			close(iofd); |  | ||||||
| 			iofd = -1; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * STR sequences must be checked before anything else | 	 * STR sequences must be checked before anything else | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user