# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit 5683b1f80c5ac274adf98517ce2217b4d4896243
    parent 138caf294ea4d7968df36ead9d5ff5fc49f6215f
    Author: Devin J. Pohly <djpohly@gmail.com>
    Date:   Wed, 21 Feb 2018 22:56:02 -0600

    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>

    Diffstat:
    Mst.c | 4----
    Mst.h | 5-----
    Mx.c | 31+++++++++++++++++++------------

    3 files changed, 19 insertions(+), 21 deletions(-)
    diff --git a/st.c b/st.c
    @@ -365,13 +365,9 @@ base64dec(const char *src)
     void
     selinit(void)
     {
    -	clock_gettime(CLOCK_MONOTONIC, &sel.tclick1);
    -	clock_gettime(CLOCK_MONOTONIC, &sel.tclick2);
     	sel.mode = SEL_IDLE;
     	sel.snap = 0;
     	sel.ob.x = -1;
    -	sel.primary = NULL;
    -	sel.clipboard = NULL;
     }

     int
    diff --git a/st.h b/st.h
    @@ -149,12 +149,7 @@ typedef struct {
     		int x, y;
     	} nb, ne, ob, oe;

    -	char *primary, *clipboard;
     	int alt;
    -	struct timespec tclick1;
    -	struct timespec tclick2;
    -
    -	//Atom xtarget;
     } Selection;

     typedef union {
    diff --git a/x.c b/x.c
    @@ -94,6 +94,9 @@ typedef struct {

     typedef struct {
     	Atom xtarget;
    +	char *primary, *clipboard;
    +	struct timespec tclick1;
    +	struct timespec tclick2;
     } XSelection;

     /* Font structure */
    @@ -234,11 +237,11 @@ clipcopy(const Arg *dummy)
     {
     	Atom clipboard;

    -	if (sel.clipboard != NULL)
    -		free(sel.clipboard);
    +	if (xsel.clipboard != NULL)
    +		free(xsel.clipboard);

    -	if (sel.primary != NULL) {
    -		sel.clipboard = xstrdup(sel.primary);
    +	if (xsel.primary != NULL) {
    +		xsel.clipboard = xstrdup(xsel.primary);
     		clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0);
     		XSetSelectionOwner(xw.dpy, clipboard, xw.win, CurrentTime);
     	}
    @@ -427,9 +430,9 @@ bpress(XEvent *e)
     		 * If the user clicks below predefined timeouts specific
     		 * snapping behaviour is exposed.
     		 */
    -		if (TIMEDIFF(now, sel.tclick2) <= tripleclicktimeout) {
    +		if (TIMEDIFF(now, xsel.tclick2) <= tripleclicktimeout) {
     			sel.snap = SNAP_LINE;
    -		} else if (TIMEDIFF(now, sel.tclick1) <= doubleclicktimeout) {
    +		} else if (TIMEDIFF(now, xsel.tclick1) <= doubleclicktimeout) {
     			sel.snap = SNAP_WORD;
     		} else {
     			sel.snap = 0;
    @@ -439,8 +442,8 @@ bpress(XEvent *e)
     		if (sel.snap != 0)
     			sel.mode = SEL_READY;
     		tsetdirt(sel.nb.y, sel.ne.y);
    -		sel.tclick2 = sel.tclick1;
    -		sel.tclick1 = now;
    +		xsel.tclick2 = xsel.tclick1;
    +		xsel.tclick1 = now;
     	}
     }

    @@ -594,9 +597,9 @@ selrequest(XEvent *e)
     		 */
     		clipboard = XInternAtom(xw.dpy, "CLIPBOARD", 0);
     		if (xsre->selection == XA_PRIMARY) {
    -			seltext = sel.primary;
    +			seltext = xsel.primary;
     		} else if (xsre->selection == clipboard) {
    -			seltext = sel.clipboard;
    +			seltext = xsel.clipboard;
     		} else {
     			fprintf(stderr,
     				"Unhandled clipboard selection 0x%lx\n",
    @@ -620,8 +623,8 @@ selrequest(XEvent *e)
     void
     setsel(char *str, Time t)
     {
    -	free(sel.primary);
    -	sel.primary = str;
    +	free(xsel.primary);
    +	xsel.primary = str;

     	XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, t);
     	if (XGetSelectionOwner(xw.dpy, XA_PRIMARY) != xw.win)
    @@ -1127,6 +1130,10 @@ xinit(void)
     	xhints();
     	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);
     	if (xsel.xtarget == None)
     		xsel.xtarget = XA_STRING;