X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=st.c;h=7ddce0cb5104ba2bce3a7aa5d298273d542f995b;hb=7cb0d95509d1b2837e4fa7d131f497800b20d22c;hp=2ebb15bd095d23704b3be00ee7abf048266913b9;hpb=e40d8da194cb02b400b09d2c8642f701c5c16821;p=st.git diff --git a/st.c b/st.c index 2ebb15b..7ddce0c 100644 --- a/st.c +++ b/st.c @@ -266,9 +266,10 @@ typedef struct { } Shortcut; /* function definitions used in config.h */ -static void xzoom(const Arg *); -static void selpaste(const Arg *); +static void clippaste(const Arg *); static void numlock(const Arg *); +static void selpaste(const Arg *); +static void xzoom(const Arg *); /* Config.h for applying patches and the configuration. */ #include "config.h" @@ -830,7 +831,17 @@ selpaste(const Arg *dummy) { xw.win, CurrentTime); } -void selclear(XEvent *e) { +void +clippaste(const Arg *dummy) { + Atom clipboard; + + clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); + XConvertSelection(xw.dpy, clipboard, sel.xtarget, XA_PRIMARY, + xw.win, CurrentTime); +} + +void +selclear(XEvent *e) { if(sel.bx == -1) return; sel.bx = -1; @@ -1285,17 +1296,24 @@ tnewline(int first_col) { void csiparse(void) { /* int noarg = 1; */ - char *p = csiescseq.buf; + char *p = csiescseq.buf, *np; + long int v; csiescseq.narg = 0; - if(*p == '?') - csiescseq.priv = 1, p++; + if(*p == '?') { + csiescseq.priv = 1; + p++; + } while(p < csiescseq.buf+csiescseq.len) { - while(isdigit(*p)) { - csiescseq.arg[csiescseq.narg] *= 10; - csiescseq.arg[csiescseq.narg] += *p++ - '0'/*, noarg = 0 */; - } + np = NULL; + v = strtol(p, &np, 10); + if(v == LONG_MAX || v == LONG_MIN) + v = -1; + csiescseq.arg[csiescseq.narg] = v; + if(np != NULL) + p = np; + if(*p == ';' && csiescseq.narg+1 < ESC_ARG_SIZ) { csiescseq.narg++, p++; } else { @@ -1912,23 +1930,17 @@ strhandle(void) { void strparse(void) { - /* - * TODO: Implement parsing like for CSI when required. - * Format: ESC type cmd ';' arg0 [';' argn] ESC \ - */ - int narg = 0; - char *start = strescseq.buf, *end = start + strescseq.len; - strescseq.args[0] = start; - while(start < end && narg < LEN(strescseq.args)) { - start = memchr(start, ';', end - start); - if(!start) - break; - *start++ = '\0'; - if(start < end) { - strescseq.args[++narg] = start; - } + char *p = strescseq.buf, *np, *sp; + + strescseq.narg = 0; + np = strtok_r(strescseq.buf, ";", &sp); + while(p < strescseq.buf+strescseq.len && np != NULL) { + strescseq.args[strescseq.narg++] = p; + + np = strtok_r(NULL, ";", &sp); + if(np != NULL) + p = np; } - strescseq.narg = narg + 1; } void @@ -2105,7 +2117,8 @@ tputc(char *c, int len) { if(BETWEEN(ascii, 0x40, 0x7E) || csiescseq.len >= ESC_BUF_SIZ) { term.esc = 0; - csiparse(), csihandle(); + csiparse(); + csihandle(); } } else if(term.esc & ESC_STR_END) { term.esc = 0;