redraw if we scroll on resize
[st.git] / st.c
diff --git a/st.c b/st.c
index 16462c7..ed8e2a8 100644 (file)
--- a/st.c
+++ b/st.c
@@ -170,7 +170,7 @@ static void tputtab(void);
 static void tputc(char);
 static void tputs(char*, int);
 static void treset(void);
-static void tresize(int, int);
+static int tresize(int, int);
 static void tscrollup(int, int);
 static void tscrolldown(int, int);
 static void tsetattr(int*, int);
@@ -190,6 +190,7 @@ static void xdrawcursor(void);
 static void xinit(void);
 static void xloadcols(void);
 static void xseturgency(int);
+static void xresize(int, int);
 
 static void expose(XEvent *);
 static void visibility(XEvent *);
@@ -1168,6 +1169,8 @@ tputc(char c) {
                case '\r':
                        tmoveto(0, term.c.y);
                        break;
+               case '\f':
+               case '\v':
                case '\n':
                        /* go to first col if the mode is set */
                        tnewline(IS_SET(MODE_CRLF));
@@ -1199,7 +1202,7 @@ tputs(char *s, int len) {
                tputc(*s++);
 }
 
-void
+int
 tresize(int col, int row) {
        int i, x;
        int minrow = MIN(row, term.row);
@@ -1207,7 +1210,7 @@ tresize(int col, int row) {
        int slide = term.c.y - row + 1;
 
        if(col < 1 || row < 1)
-               return;
+               return 0;
 
        /* free unneeded rows */
        i = 0;
@@ -1253,6 +1256,37 @@ tresize(int col, int row) {
        tmoveto(term.c.x, term.c.y);
        /* reset scrolling region */
        tsetscroll(0, row-1);
+       return (slide > 0);
+}
+
+void
+xresize(int col, int row) {
+       Pixmap newbuf;
+       int oldw, oldh;
+
+       oldw = xw.bufw;
+       oldh = xw.bufh;
+       xw.bufw = MAX(1, col * xw.cw);
+       xw.bufh = MAX(1, row * xw.ch);
+       newbuf = XCreatePixmap(xw.dis, xw.win, xw.bufw, xw.bufh, XDefaultDepth(xw.dis, xw.scr));
+       XCopyArea(xw.dis, xw.buf, newbuf, dc.gc, 0, 0, xw.bufw, xw.bufh, 0, 0);
+       XFreePixmap(xw.dis, xw.buf);
+       XSetForeground(xw.dis, dc.gc, dc.col[DefaultBG]);
+       if(xw.bufw > oldw)
+               XFillRectangle(xw.dis, newbuf, dc.gc, oldw, 0,
+                               xw.bufw-oldw, MIN(xw.bufh, oldh));
+       else if(xw.bufw < oldw && (BORDER > 0 || xw.w > xw.bufw))
+               XClearArea(xw.dis, xw.win, BORDER+xw.bufw, BORDER,
+                               xw.w-xw.bufh-BORDER, BORDER+MIN(xw.bufh, oldh),
+                               False);
+       if(xw.bufh > oldh)
+               XFillRectangle(xw.dis, newbuf, dc.gc, 0, oldh,
+                               xw.bufw, xw.bufh-oldh);
+       else if(xw.bufh < oldh && (BORDER > 0 || xw.h > xw.bufh))
+               XClearArea(xw.dis, xw.win, BORDER, BORDER+xw.bufh,
+                               xw.w-2*BORDER, xw.h-xw.bufh-BORDER,
+                               False);
+       xw.buf = newbuf;
 }
 
 void
@@ -1613,16 +1647,14 @@ resize(XEvent *e) {
        
        xw.w = e->xconfigure.width;
        xw.h = e->xconfigure.height;
-       xw.bufw = xw.w - 2*BORDER;
-       xw.bufh = xw.h - 2*BORDER;
-       col = xw.bufw / xw.cw;
-       row = xw.bufh / xw.ch;
-       tresize(col, row);
+       col = (xw.w - 2*BORDER) / xw.cw;
+       row = (xw.h - 2*BORDER) / xw.ch;
+       if(col == term.col && row == term.row)
+               return;
+       if(tresize(col, row))
+               draw(SCREEN_REDRAW);
        ttyresize(col, row);
-       xw.bufh = MAX(1, xw.bufh);
-       xw.bufw = MAX(1, xw.bufw);
-       XFreePixmap(xw.dis, xw.buf);
-       xw.buf = XCreatePixmap(xw.dis, xw.win, xw.bufw, xw.bufh, XDefaultDepth(xw.dis, xw.scr));
+       xresize(col, row);
 }
 
 void