st

fork of suckless's simple terminal
Index Commits Files Refs README LICENSE
commit b56a0da283bd09d5084f472353c1a0b1b084613e
parent 71b09ec4f172da9a89be2add54b5b94da8af3bea
Author: Christoph Lohmann <20h@r-36.net>
Date:   Sun, 28 Oct 2012 13:35:00 +0100

Applying the tab expansion patch from koga.

Diffstat:
Mst.c | 22+++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/st.c b/st.c
@@ -663,9 +663,9 @@ bpress(XEvent *e) {
 
 void
 selcopy(void) {
-    char *str, *ptr;
+    char *str, *ptr, *p;
     int x, y, bufsize, is_selected = 0, size;
-    Glyph *gp;
+    Glyph *gp, *last;
 
     if(sel.bx == -1) {
         str = NULL;
@@ -675,15 +675,19 @@ selcopy(void) {
 
         /* append every set & selected glyph to the selection */
         for(y = 0; y < term.row; y++) {
-            for(x = 0; x < term.col; x++) {
-                gp = &term.line[y][x];
+            gp = &term.line[y][0];
+            last = gp + term.col;
 
-                if(!(is_selected = selected(x, y))
-                        || !(gp->state & GLYPH_SET)) {
+            while(--last >= gp && !(last->state & GLYPH_SET))
+                /* nothing */;
+
+            for(x = 0; gp <= last; x++, ++gp) {
+                if(!(is_selected = selected(x, y)))
                     continue;
-                }
-                size = utf8size(gp->c);
-                memcpy(ptr, gp->c, size);
+
+                p = (gp->state & GLYPH_SET) ? gp->c : " ";
+                size = utf8size(p);
+                memcpy(ptr, p, size);
                 ptr += size;
             }
             /* \n at the end of every selected line except for the last one */