Move X-specific selection info into XSelection

Data about PRIMARY/CLIPBOARD and clicks are part of the front-end, not
the terminal.

Signed-off-by: Devin J. Pohly <djpohly@gmail.com>
This commit is contained in:
Devin J. Pohly 2018-02-21 22:56:02 -06:00
parent 138caf294e
commit 5683b1f80c
3 changed files with 19 additions and 21 deletions

4
st.c
View File

@ -365,13 +365,9 @@ base64dec(const char *src)
void void
selinit(void) selinit(void)
{ {
clock_gettime(CLOCK_MONOTONIC, &sel.tclick1);
clock_gettime(CLOCK_MONOTONIC, &sel.tclick2);
sel.mode = SEL_IDLE; sel.mode = SEL_IDLE;
sel.snap = 0; sel.snap = 0;
sel.ob.x = -1; sel.ob.x = -1;
sel.primary = NULL;
sel.clipboard = NULL;
} }
int int

5
st.h
View File

@ -149,12 +149,7 @@ typedef struct {
int x, y; int x, y;
} nb, ne, ob, oe; } nb, ne, ob, oe;
char *primary, *clipboard;
int alt; int alt;
struct timespec tclick1;
struct timespec tclick2;
//Atom xtarget;
} Selection; } Selection;
typedef union { typedef union {

31
x.c
View File

@ -94,6 +94,9 @@ typedef struct {
typedef struct { typedef struct {
Atom xtarget; Atom xtarget;
char *primary, *clipboard;
struct timespec tclick1;
struct timespec tclick2;
} XSelection; } XSelection;
/* Font structure */ /* Font structure */
@ -234,11 +237,11 @@ clipcopy(const Arg *dummy)
{ {
Atom clipboard; Atom clipboard;
if (sel.clipboard != NULL) if (xsel.clipboard != NULL)
free(sel.clipboard); free(xsel.clipboard);
if (sel.primary != NULL) { if (xsel.primary != NULL) {
sel.clipboard = xstrdup(sel.primary); xsel.clipboard = xstrdup(xsel.primary);
clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0);
XSetSelectionOwner(xw.dpy, clipboard, xw.win, CurrentTime); XSetSelectionOwner(xw.dpy, clipboard, xw.win, CurrentTime);
} }
@ -427,9 +430,9 @@ bpress(XEvent *e)
* If the user clicks below predefined timeouts specific * If the user clicks below predefined timeouts specific
* snapping behaviour is exposed. * snapping behaviour is exposed.
*/ */
if (TIMEDIFF(now, sel.tclick2) <= tripleclicktimeout) { if (TIMEDIFF(now, xsel.tclick2) <= tripleclicktimeout) {
sel.snap = SNAP_LINE; sel.snap = SNAP_LINE;
} else if (TIMEDIFF(now, sel.tclick1) <= doubleclicktimeout) { } else if (TIMEDIFF(now, xsel.tclick1) <= doubleclicktimeout) {
sel.snap = SNAP_WORD; sel.snap = SNAP_WORD;
} else { } else {
sel.snap = 0; sel.snap = 0;
@ -439,8 +442,8 @@ bpress(XEvent *e)
if (sel.snap != 0) if (sel.snap != 0)
sel.mode = SEL_READY; sel.mode = SEL_READY;
tsetdirt(sel.nb.y, sel.ne.y); tsetdirt(sel.nb.y, sel.ne.y);
sel.tclick2 = sel.tclick1; xsel.tclick2 = xsel.tclick1;
sel.tclick1 = now; xsel.tclick1 = now;
} }
} }
@ -594,9 +597,9 @@ selrequest(XEvent *e)
*/ */
clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0); clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0);
if (xsre->selection == XA_PRIMARY) { if (xsre->selection == XA_PRIMARY) {
seltext = sel.primary; seltext = xsel.primary;
} else if (xsre->selection == clipboard) { } else if (xsre->selection == clipboard) {
seltext = sel.clipboard; seltext = xsel.clipboard;
} else { } else {
fprintf(stderr, fprintf(stderr,
"Unhandled clipboard selection 0x%lx\n", "Unhandled clipboard selection 0x%lx\n",
@ -620,8 +623,8 @@ selrequest(XEvent *e)
void void
setsel(char *str, Time t) setsel(char *str, Time t)
{ {
free(sel.primary); free(xsel.primary);
sel.primary = str; xsel.primary = str;
XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, t); XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, t);
if (XGetSelectionOwner(xw.dpy, XA_PRIMARY) != xw.win) if (XGetSelectionOwner(xw.dpy, XA_PRIMARY) != xw.win)
@ -1127,6 +1130,10 @@ xinit(void)
xhints(); xhints();
XSync(xw.dpy, False); XSync(xw.dpy, False);
clock_gettime(CLOCK_MONOTONIC, &xsel.tclick1);
clock_gettime(CLOCK_MONOTONIC, &xsel.tclick2);
xsel.primary = NULL;
xsel.clipboard = NULL;
xsel.xtarget = XInternAtom(xw.dpy, "UTF8_STRING", 0); xsel.xtarget = XInternAtom(xw.dpy, "UTF8_STRING", 0);
if (xsel.xtarget == None) if (xsel.xtarget == None)
xsel.xtarget = XA_STRING; xsel.xtarget = XA_STRING;