diff options
-rw-r--r-- | config.def.h | 3 | ||||
-rw-r--r-- | st.c | 110 | ||||
-rw-r--r-- | st.info | 3 |
3 files changed, 104 insertions, 12 deletions
diff --git a/config.def.h b/config.def.h index b31d7d6..58b470e 100644 --- a/config.def.h +++ b/config.def.h @@ -107,6 +107,9 @@ static Mousekey mshortcuts[] = { static Shortcut shortcuts[] = { /* mask keysym function argument */ + { ControlMask, XK_Print, toggleprinter, {.i = 0} }, + { ShiftMask, XK_Print, printscreen, {.i = 0} }, + { XK_ANY_MOD, XK_Print, printsel, {.i = 0} }, { MODKEY|ShiftMask, XK_Prior, xzoom, {.i = +1} }, { MODKEY|ShiftMask, XK_Next, xzoom, {.i = -1} }, { ShiftMask, XK_Insert, selpaste, {.i = 0} }, @@ -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 @@ -152,6 +152,9 @@ st| simpleterm, ncv#3, op=\E[39;49m, pairs#64, + mc0=\E[i, + mc4=\E[4i, + mc5=\E[5i, rc=\E8, rev=\E[7m, ri=\EM, |