From: Roberto E. Vargas Caballero Date: Mon, 10 Mar 2014 14:16:26 +0000 (+0100) Subject: Merge branch 'master' of ssh://suckless.org/gitrepos/st X-Git-Url: https://jasonwoof.com/gitweb/?p=st.git;a=commitdiff_plain;h=71328cbcdc88f4fdfbb62d8c0324938e245c8971;hp=-c Merge branch 'master' of ssh://suckless.org/gitrepos/st --- 71328cbcdc88f4fdfbb62d8c0324938e245c8971 diff --combined st.c index c97712c,c16e45d..69b2491 --- a/st.c +++ b/st.c @@@ -134,7 -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, }; @@@ -314,9 -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" @@@ -359,10 -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); @@@ -437,7 -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); @@@ -478,7 -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; @@@ -958,8 -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; @@@ -1018,12 -1009,7 +1018,12 @@@ } *ptr = 0; } - xsetsel(str); + return str; +} + +void +selcopy(void) { + xsetsel(getsel()); } void @@@ -1270,7 -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); @@@ -1994,25 -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); @@@ -2286,64 -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; @@@ -2424,8 -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 @@@ -2887,7 -2801,8 +2887,8 @@@ xhints(void) sizeh->min_height = sizeh->max_height = xw.fh; } - XSetWMProperties(xw.dpy, xw.win, NULL, NULL, NULL, 0, sizeh, &wm, &class); + XSetWMProperties(xw.dpy, xw.win, NULL, NULL, NULL, 0, sizeh, &wm, + &class); XFree(sizeh); } @@@ -3176,6 -3091,7 +3177,7 @@@ xdraws(char *s, Glyph base, int x, int if(base.fg == defaultfg) base.fg = defaultunderline; } + if(IS_TRUECOL(base.fg)) { colfg.alpha = 0xffff; colfg.red = TRUERED(base.fg); @@@ -3198,8 -3114,6 +3200,6 @@@ bg = &dc.col[base.bg]; } - - if(base.mode & ATTR_BOLD) { if(BETWEEN(base.fg, 0, 7)) { /* basic system colors */ @@@ -3229,7 -3143,8 +3229,8 @@@ colfg.green = ~fg->color.green; colfg.blue = ~fg->color.blue; colfg.alpha = fg->color.alpha; - XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, &revfg); + XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colfg, + &revfg); fg = &revfg; } @@@ -3240,7 -3155,8 +3241,8 @@@ colbg.green = ~bg->color.green; colbg.blue = ~bg->color.blue; colbg.alpha = bg->color.alpha; - XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colbg, &revbg); + XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &colbg, + &revbg); bg = &revbg; } } @@@ -3320,7 -3236,7 +3322,7 @@@ u8fblen += u8cblen; } if(doesexist) { - if (oneatatime) + if(oneatatime) continue; break; } @@@ -3343,6 -3259,8 +3345,8 @@@ * Nothing was found in the cache. Now use * some dozen of Fontconfig calls to get the * font for one single character. + * + * Xft and fontconfig are design failures. */ fcpattern = FcPatternDuplicate(font->pattern); fccharset = FcCharSetCreate(); @@@ -3387,6 -3305,12 +3391,12 @@@ } /* + * This is how the loop above actually should be. Why does the + * application have to care about font details? + * + * I have to repeat: Xft and Fontconfig are design failures. + */ + /* XftDrawStringUtf8(xw.draw, fg, font->set, winx, winy + font->ascent, (FcChar8 *)s, bytelen); */