Move X-specific selection info into XSelection
[st.git] / x.c
diff --git a/x.c b/x.c
index 7bfa1b7..9f506b1 100644 (file)
--- 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;
@@ -1418,7 +1425,6 @@ xdrawcursor(void)
        static int oldx = 0, oldy = 0;
        int curx;
        Glyph g = {' ', ATTR_NULL, defaultbg, defaultcs}, og;
-       int ena_sel = sel.ob.x != -1 && sel.alt == IS_SET(MODE_ALTSCREEN);
        Color drawcol;
 
        LIMIT(oldx, 0, term.col-1);
@@ -1434,7 +1440,7 @@ xdrawcursor(void)
 
        /* remove the old cursor */
        og = term.line[oldy][oldx];
-       if (ena_sel && selected(oldx, oldy))
+       if (selected(oldx, oldy))
                og.mode ^= ATTR_REVERSE;
        xdrawglyph(og, oldx, oldy);
 
@@ -1448,7 +1454,7 @@ xdrawcursor(void)
        if (IS_SET(MODE_REVERSE)) {
                g.mode |= ATTR_REVERSE;
                g.bg = defaultfg;
-               if (ena_sel && selected(term.c.x, term.c.y)) {
+               if (selected(term.c.x, term.c.y)) {
                        drawcol = dc.col[defaultcs];
                        g.fg = defaultrcs;
                } else {
@@ -1456,7 +1462,7 @@ xdrawcursor(void)
                        g.fg = defaultcs;
                }
        } else {
-               if (ena_sel && selected(term.c.x, term.c.y)) {
+               if (selected(term.c.x, term.c.y)) {
                        drawcol = dc.col[defaultrcs];
                        g.fg = defaultfg;
                        g.bg = defaultrcs;
@@ -1555,7 +1561,6 @@ drawregion(int x1, int y1, int x2, int y2)
        int i, x, y, ox, numspecs;
        Glyph base, new;
        XftGlyphFontSpec *specs;
-       int ena_sel = sel.ob.x != -1 && sel.alt == IS_SET(MODE_ALTSCREEN);
 
        if (!(win.state & WIN_VISIBLE))
                return;
@@ -1574,7 +1579,7 @@ drawregion(int x1, int y1, int x2, int y2)
                        new = term.line[y][x];
                        if (new.mode == ATTR_WDUMMY)
                                continue;
-                       if (ena_sel && selected(x, y))
+                       if (selected(x, y))
                                new.mode ^= ATTR_REVERSE;
                        if (i > 0 && ATTRCMP(base, new)) {
                                xdrawglyphfontspecs(specs, base, i, ox, y);