st

fork of suckless's simple terminal
Index Commits Files Refs README LICENSE
commit 83e73c6242fc309a3859c12b996ab88d36c7e838
parent 9619760e129b0994cd3bc4c827c83960f6a5e98f
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Tue, 14 Apr 2015 09:47:19 +0200

Merge branch 'master' of ssh://suckless.org/gitrepos/st

Diffstat:
Mst.c | 23++++++++++++++---------
1 file changed, 14 insertions(+), 9 deletions(-)
diff --git a/st.c b/st.c
@@ -423,7 +423,7 @@ static void xsettitle(char *);
 static void xresettitle(void);
 static void xsetpointermotion(int);
 static void xseturgency(int);
-static void xsetsel(char *);
+static void xsetsel(char *, Time);
 static void xtermclear(int, int, int, int);
 static void xunloadfont(Font *);
 static void xunloadfonts(void);
@@ -449,7 +449,7 @@ static void selinit(void);
 static void selnormalize(void);
 static inline bool selected(int, int);
 static char *getsel(void);
-static void selcopy(void);
+static void selcopy(Time);
 static void selscroll(int, int);
 static void selsnap(int, int *, int *, int);
 static int x2col(int);
@@ -984,8 +984,8 @@ getsel(void) {
 }
 
 void
-selcopy(void) {
-    xsetsel(getsel());
+selcopy(Time t) {
+    xsetsel(getsel(), t);
 }
 
 void
@@ -997,7 +997,7 @@ selnotify(XEvent *e) {
     XSelectionEvent *xsev;
 
     ofs = 0;
-    xsev = (XSelectionEvent *)e;
+    xsev = &e->xselection;
     if (xsev->property == None)
         return;
     do {
@@ -1083,6 +1083,9 @@ selrequest(XEvent *e) {
     xev.selection = xsre->selection;
     xev.target = xsre->target;
     xev.time = xsre->time;
+        if (xsre->property == None)
+            xsre->property = xsre->target;
+
     /* reject */
     xev.property = None;
 
@@ -1125,11 +1128,13 @@ selrequest(XEvent *e) {
 }
 
 void
-xsetsel(char *str) {
+xsetsel(char *str, Time t) {
     free(sel.primary);
     sel.primary = str;
 
-    XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, CurrentTime);
+    XSetSelectionOwner(xw.dpy, XA_PRIMARY, xw.win, t);
+        if (XGetSelectionOwner(xw.dpy, XA_PRIMARY) != xw.win)
+            selclear(0);
 }
 
 void
@@ -1146,7 +1151,7 @@ brelease(XEvent *e) {
             selclear(NULL);
         } else {
             getbuttoninfo(e);
-            selcopy();
+            selcopy(e->xbutton.time);
         }
         sel.mode = 0;
         tsetdirt(sel.nb.y, sel.ne.y);
@@ -2390,7 +2395,7 @@ tputtab(int n) {
             for(--x; x > 0 && !term.tabs[x]; --x)
                 /* nothing */ ;
     }
-    tmoveto(x, term.c.y);
+    term.c.x = LIMIT(x, 0, term.col-1);
 }
 
 void