st

fork of suckless's simple terminal
Index Commits Files Refs README LICENSE
commit b8ffa1d7e9cffda8bd8cc7f4ccf612201a617b34
parent d5f4554431f82424af40600ed6835672ab8e44ae
Author: Aurélien Aptel <aurelien.aptel@gmail.com>
Date:   Wed, 17 Jun 2009 02:58:40 +0200

fixed the scrolling bug and cleaned some stuff.

Diffstat:
Mst.c | 129++++++++++++++++++++++++++++++++++++++++++-------------------------------------
1 file changed, 68 insertions(+), 61 deletions(-)
diff --git a/st.c b/st.c
@@ -37,7 +37,7 @@
 enum { ATnone=0 , ATreverse=1 , ATunderline=2, ATbold=4 };
 enum { CSup, CSdown, CSright, CSleft, CShide, CSdraw, CSwrap, CSsave, CSload };
 enum { CRset=1, CRupdate=2 };
-enum { TMwrap=1, TMinsert=2, TMaltcharset };
+enum { TMwrap=1, TMinsert=2 };
 enum { SCupdate, SCredraw };
 
 typedef int Color;
@@ -154,6 +154,7 @@ void xdrawc(int, int, Glyph);
 void xinit(void);
 void xscroll(void);
 
+void cursor(int);
 
 /* Globals */
 DC dc;
@@ -201,7 +202,6 @@ sigchld(int a) {
         exit(EXIT_FAILURE);
 }
 
-
 void
 ttynew(void) {
     int m, s;
@@ -328,21 +328,19 @@ void
 tscroll(void) {
     Line temp = term.line[term.top];
     int i;
-
+    /* X stuff _before_ the line swapping (results in wrong line index) */
+    xscroll();
     for(i = term.top; i < term.bot; i++)
         term.line[i] = term.line[i+1];
     memset(temp, 0, sizeof(Glyph) * term.col);
     term.line[term.bot] = temp;
-    xscroll();      
 }
 
 void
 tnewline(void) {
     int y = term.c.y + 1;
-
-    if(y > term.bot) {
+    if(y > term.bot)
         tscroll(), y = term.bot;
-    }
     tmoveto(0, y);
 }
 
@@ -477,6 +475,13 @@ tinsertblank(int n) {
 }
 
 void
+tsetlinestate(int n, int state) {
+    int i;
+    for(i = 0; i < term.col; i++)
+        term.line[n][i].state |= state;
+}
+
+void
 tinsertblankline (int n) {
     int i;
     Line blank;
@@ -497,10 +502,11 @@ tinsertblankline (int n) {
         term.line[i-n] = blank;
         /* blank it */
         memset(blank, 0, term.col * sizeof(Glyph));
+        tsetlinestate(i, CRupdate);
+        tsetlinestate(i-n, CRupdate);
     }
 }
 
-
 void
 tdeleteline(int n) {
     int i;
@@ -522,6 +528,8 @@ tdeleteline(int n) {
         term.line[i+n] = blank;
         /* blank it */
         memset(blank, 0, term.col * sizeof(Glyph));
+        tsetlinestate(i, CRupdate);
+        tsetlinestate(i-n, CRupdate);
     }
 }
 
@@ -529,48 +537,48 @@ void
 tsetattr(int *attr, int l) {
     int i;
 
-        for(i = 0; i < l; i++) {
-            switch(attr[i]) {
-            case 0:
-                memset(&term.c.attr, 0, sizeof(term.c.attr));
-                term.c.attr.fg = DefaultFG;
-                term.c.attr.bg = DefaultBG;
-                break;
-            case 1:
-                term.c.attr.mode |= ATbold;     
-                break;
-            case 4: 
-                term.c.attr.mode |= ATunderline;
-                break;
-            case 7: 
-                term.c.attr.mode |= ATreverse;    
-                break;
-            case 8:
-                term.c.hidden = CShide;
-                break;
-            case 22: 
-                term.c.attr.mode &= ~ATbold;  
-                break;
-            case 24: 
-                term.c.attr.mode &= ~ATunderline;
-                break;
-            case 27: 
-                term.c.attr.mode &= ~ATreverse;     
-                break;
-            case 39:
-                term.c.attr.fg = DefaultFG;
-                break;
-            case 49:
-                term.c.attr.fg = DefaultBG;
-                break;
-            default:
-                if(BETWEEN(attr[i], 30, 37))
-                    term.c.attr.fg = attr[i] - 30;
-                else if(BETWEEN(attr[i], 40, 47))
-                    term.c.attr.bg = attr[i] - 40;
-                break;
-            }
+    for(i = 0; i < l; i++) {
+        switch(attr[i]) {
+        case 0:
+            memset(&term.c.attr, 0, sizeof(term.c.attr));
+            term.c.attr.fg = DefaultFG;
+            term.c.attr.bg = DefaultBG;
+            break;
+        case 1:
+            term.c.attr.mode |= ATbold;     
+            break;
+        case 4: 
+            term.c.attr.mode |= ATunderline;
+            break;
+        case 7: 
+            term.c.attr.mode |= ATreverse;    
+            break;
+        case 8:
+            term.c.hidden = CShide;
+            break;
+        case 22: 
+            term.c.attr.mode &= ~ATbold;  
+            break;
+        case 24: 
+            term.c.attr.mode &= ~ATunderline;
+            break;
+        case 27: 
+            term.c.attr.mode &= ~ATreverse;     
+            break;
+        case 39:
+            term.c.attr.fg = DefaultFG;
+            break;
+        case 49:
+            term.c.attr.fg = DefaultBG;
+            break;
+        default:
+            if(BETWEEN(attr[i], 30, 37))
+                term.c.attr.fg = attr[i] - 30;
+            else if(BETWEEN(attr[i], 40, 47))
+                term.c.attr.bg = attr[i] - 40;
+            break;
         }
+    }
 }
 
 void
@@ -588,9 +596,8 @@ tsetscroll(int t, int b) {
     term.bot = b;     
 }
 
-
 void
-eschandle(void) { 
+eschandle(void) {
     switch(escseq.pre) {
     default:
         goto unknown_seq;
@@ -846,7 +853,6 @@ xgetcol(const char *s) {
     return color.pixel;
 }
 
-
 void
 xclear(int x1, int y1, int x2, int y2) {
     XClearArea(xw.dis, xw.win, 
@@ -855,7 +861,6 @@ xclear(int x1, int y1, int x2, int y2) {
             False);
 }
 
-
 void
 xscroll(void) {
     int srcy = (term.top+1) * xw.ch;
@@ -867,9 +872,6 @@ xscroll(void) {
     xclear(0, term.bot, term.col-1, term.bot);
 }
 
-
-
-
 void
 xinit(void) {
     XGCValues values;
@@ -963,14 +965,15 @@ xcursor(int mode) {
     /* remove the old cursor */
     if(term.line[oldy][oldx].state & CRset)
         xdrawc(oldx, oldy, term.line[oldy][oldx]);
-    else xclear(oldx, oldy, oldx, oldy); /* XXX: maybe a bug */
-    if(mode == CSdraw && !term.c.hidden) {
+    else 
+        xclear(oldx, oldy, oldx, oldy);
+    /* draw the new one */
+    if(mode == CSdraw) {
         xdrawc(term.c.x, term.c.y, g);
         oldx = term.c.x, oldy = term.c.y;
     }
 }
 
-
 void
 draw(int redraw_all) {
     int x, y;
@@ -978,14 +981,18 @@ draw(int redraw_all) {
 
     if(redraw_all)
         XClearWindow(xw.dis, xw.win);
+
     /* XXX: drawing could be optimised */
     for(y = 0; y < term.row; y++) {
         for(x = 0; x < term.col; x++) {
             changed = term.line[y][x].state & CRupdate;
             set = term.line[y][x].state & CRset;
-            if((changed && set) || (redraw_all && set)) {
+            if(redraw_all || changed) {
                 term.line[y][x].state &= ~CRupdate;
-                xdrawc(x, y, term.line[y][x]);
+                if(set)
+                    xdrawc(x, y, term.line[y][x]);
+                else
+                    xclear(x, y, x, y);
             }
         }
     }