st

fork of suckless's simple terminal
Index Commits 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;