} 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"
}
/* \n at the end of every selected line except for the last one */
if(is_selected && y < sel.e.y)
- *ptr++ = '\n';
+ *ptr++ = '\r';
}
*ptr = 0;
}
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;
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 */;
- }
- if(*p == ';' && csiescseq.narg+1 < ESC_ARG_SIZ) {
- csiescseq.narg++, p++;
- } else {
- csiescseq.mode = *p;
- csiescseq.narg++;
-
- return;
- }
+ np = NULL;
+ v = strtol(p, &np, 10);
+ if(np == p)
+ v = 0;
+ if(v == LONG_MAX || v == LONG_MIN)
+ v = -1;
+ csiescseq.arg[csiescseq.narg++] = v;
+ p = np;
+ if(*p != ';' || csiescseq.narg == ESC_ARG_SIZ)
+ break;
+ p++;
}
+ csiescseq.mode = *p;
}
/* for absolute user moves, when decom is set */
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, *sp;
+
+ strescseq.buf[strescseq.len] = '\0';
+ for(p = strtok_r(p, ";", &sp); p; p = strtok_r(NULL, ";", &sp)) {
+ if(strescseq.narg == STR_ARG_SIZ)
+ return;
+ strescseq.args[strescseq.narg++] = p;
}
- strescseq.narg = narg + 1;
}
void
printf("ESC%c", strescseq.type);
for(i = 0; i < strescseq.len; i++) {
c = strescseq.buf[i] & 0xff;
- if(isprint(c)) {
+ if(c == '\0') {
+ return;
+ } else if(isprint(c)) {
putchar(c);
} else if(c == '\n') {
printf("(\\n)");
strhandle();
break;
default:
- if(strescseq.len + len < sizeof(strescseq.buf)) {
+ if(strescseq.len + len < sizeof(strescseq.buf) - 1) {
memmove(&strescseq.buf[strescseq.len], c, len);
strescseq.len += len;
} else {
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;