Move X-specific selection info into XSelection - st - Personal fork of st
 (HTM) git clone git://git.drkhsh.at/st.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 5683b1f80c5ac274adf98517ce2217b4d4896243
 (DIR) parent 138caf294ea4d7968df36ead9d5ff5fc49f6215f
 (HTM) 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:
         M st.c                                |       4 ----
         M st.h                                |       5 -----
         M x.c                                 |      31 +++++++++++++++++++------------
       
       3 files changed, 19 insertions(+), 21 deletions(-)
       ---
 (DIR) 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
 (DIR) 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 {
 (DIR) 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;