tAdd MC for a single line - st - [fork] customized build of st, the simple term… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit cf332a325dafe7e9ed6d87df9dcec29149c5042c | |
parent 1f0d981bd7a1450ddfae3591c6e457253b3a6842 | |
Author: Roberto E. Vargas Caballero <[email protected]> | |
Date: Fri, 31 Jan 2014 21:53:53 +0100 | |
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 | |
tterminal are printer. Here only the ascii characters are printed. | |
Diffstat: | |
M st.c | 41 ++++++++++++++++++++++++-----… | |
1 file changed, 32 insertions(+), 9 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -356,6 +356,8 @@ static void strparse(void); | |
static void strreset(void); | |
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 tcursor(int); | |
static void tdeletechar(int); | |
t@@ -470,7 +472,7 @@ static STREscape strescseq; | |
static int cmdfd; | |
static pid_t pid; | |
static Selection sel; | |
-static int iofd; | |
+static int iofd = STDOUT_FILENO; | |
static char **opt_cmd = NULL; | |
static char *opt_io = NULL; | |
static char *opt_title = NULL; | |
t@@ -1985,6 +1987,8 @@ csihandle(void) { | |
switch(csiescseq.arg[0]) { | |
case 0: | |
case 1: | |
+ tdumpline(term.c.y); | |
+ break; | |
case 4: | |
term.mode &= ~MODE_PRINT; | |
break; | |
t@@ -2266,6 +2270,31 @@ 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 | |
+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 | |
tputtab(bool forward) { | |
uint x = term.c.x; | |
t@@ -2346,14 +2375,8 @@ tputc(char *c, int len) { | |
width = wcwidth(u8char); | |
} | |
- if(IS_SET(MODE_PRINT) && 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 |