diff options
Diffstat (limited to 'st.c')
| -rw-r--r-- | st.c | 110 | 
1 files changed, 98 insertions, 12 deletions
@@ -134,6 +134,7 @@ enum term_mode {  	MODE_MOUSEX10    = 131072,  	MODE_MOUSEMANY   = 262144,  	MODE_BRCKTPASTE  = 524288, +	MODE_PRINT       = 1048576,  	MODE_MOUSE       = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\  	                  |MODE_MOUSEMANY,  }; @@ -313,6 +314,9 @@ static void clippaste(const Arg *);  static void numlock(const Arg *);  static void selpaste(const Arg *);  static void xzoom(const Arg *); +static void printsel(const Arg *); +static void printscreen(const Arg *) ; +static void toggleprinter(const Arg *);  /* Config.h for applying patches and the configuration. */  #include "config.h" @@ -355,6 +359,10 @@ static void strparse(void);  static void strreset(void);  static int tattrset(int); +static void tprinter(char *s, size_t len); +static void tdumpsel(void); +static void tdumpline(int); +static void tdump(void);  static void tclearregion(int, int, int, int);  static void tcursor(int);  static void tdeletechar(int); @@ -429,6 +437,7 @@ static void selrequest(XEvent *);  static void selinit(void);  static void selsort(void);  static inline bool selected(int, int); +static char *getsel(void);  static void selcopy(void);  static void selscroll(int, int);  static void selsnap(int, int *, int *, int); @@ -469,7 +478,7 @@ static STREscape strescseq;  static int cmdfd;  static pid_t pid;  static Selection sel; -static int iofd = -1; +static int iofd = STDOUT_FILENO;  static char **opt_cmd = NULL;  static char *opt_io = NULL;  static char *opt_title = NULL; @@ -949,8 +958,8 @@ bpress(XEvent *e) {  	}  } -void -selcopy(void) { +char * +getsel(void) {  	char *str, *ptr;  	int x, y, bufsize, size, i, ex;  	Glyph *gp, *last; @@ -1009,7 +1018,12 @@ selcopy(void) {  		}  		*ptr = 0;  	} -	xsetsel(str); +	return str; +} + +void +selcopy(void) { +	xsetsel(getsel());  }  void @@ -1256,6 +1270,7 @@ ttynew(void) {  		cmdfd = m;  		signal(SIGCHLD, sigchld);  		if(opt_io) { +			term.mode |= MODE_PRINT;  			iofd = (!strcmp(opt_io, "-")) ?  				  STDOUT_FILENO :  				  open(opt_io, O_WRONLY | O_CREAT, 0666); @@ -1979,6 +1994,25 @@ csihandle(void) {  		DEFAULT(csiescseq.arg[0], 1);  		tmoveto(term.c.x, term.c.y+csiescseq.arg[0]);  		break; +	case 'i': /* MC -- Media Copy */ +		switch(csiescseq.arg[0]) { +		case 0: +			tdump(); +			break; +		case 1: +			tdumpline(term.c.y); +			break; +		case 2: +			tdumpsel(); +			break; +		case 4: +			term.mode &= ~MODE_PRINT; +			break; +		case 5: +			term.mode |= MODE_PRINT; +			break; +		} +		break;  	case 'c': /* DA -- Device Attributes */  		if(csiescseq.arg[0] == 0)  			ttywrite(VT102ID, sizeof(VT102ID) - 1); @@ -2252,6 +2286,64 @@ strreset(void) {  }  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 +toggleprinter(const Arg *arg) { +	term.mode ^= MODE_PRINT; +} + +void +printscreen(const Arg *arg) { +	tdump(); +} + +void +printsel(const Arg *arg) { +	tdumpsel(); +} + +void +tdumpsel(void) +{ +	char *ptr; + +	ptr = getsel(); +	tprinter(ptr, strlen(ptr)); +	free(ptr); +} + +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 +tdump(void) { +	int i; + +	for(i = 0; i < term.row; ++i) +		tdumpline(i); +} + +void  tputtab(bool forward) {  	uint x = term.c.x; @@ -2332,14 +2424,8 @@ tputc(char *c, int len) {  		width = wcwidth(u8char);  	} -	if(iofd != -1) { -		if(xwrite(iofd, c, len) < 0) { -			fprintf(stderr, "Error writing in %s:%s\n", -				opt_io, strerror(errno)); -			close(iofd); -			iofd = -1; -		} -	} +	if(IS_SET(MODE_PRINT)) +		tprinter(c, len);  	/*  	 * STR sequences must be checked before anything else  | 
