diff --git a/config.def.h b/config.def.h index fd09d72..a43d7de 100644 --- a/config.def.h +++ b/config.def.h @@ -19,6 +19,8 @@ static int borderpx = 2; static char shell[] = "/bin/sh"; static char *utmp = NULL; static char stty_args[] = "stty raw pass8 nl -echo -iexten -cstopb 38400"; +static int persistentclip = 1; +static char clip[] = "xclip -selection clipboard"; /* identification sequence returned in DA and DECID */ static char vtiden[] = "\033[?6c"; diff --git a/st.c b/st.c index 98622ec..805a04c 100644 --- a/st.c +++ b/st.c @@ -1164,14 +1164,30 @@ selpaste(const Arg *dummy) void clipcopy(const Arg *dummy) { - Atom clipboard; if (sel.clipboard != NULL) free(sel.clipboard); - if (sel.primary != NULL) { + if (sel.primary != NULL) sel.clipboard = xstrdup(sel.primary); - clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); + else + /* never clear the clipboard just because you while + * nothing was selected */ + return; + + if (persistentclip) { + /* TODO: Something cleaner. */ + /* FIXME: Causes "Couldn't read from shell"s? */ + FILE* clippipe = popen(clip, "w"); + if (clippipe == NULL) { + perror("Couldn't start persistent clipboard"); + return; + } + if (fputs(sel.clipboard, clippipe) < 0) + perror("Couldn't copy to persistent clipboard"); + pclose(clippipe); + } else { + Atom clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); XSetSelectionOwner(xw.dpy, clipboard, xw.win, CurrentTime); } }