get rid of artifacts in border on resize down
[st.git] / st.c
diff --git a/st.c b/st.c
index 594b0d3..1089087 100644 (file)
--- a/st.c
+++ b/st.c
@@ -1260,10 +1260,32 @@ tresize(int col, int row) {
 
 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);
-       xw.buf = XCreatePixmap(xw.dis, xw.win, xw.bufw, xw.bufh, XDefaultDepth(xw.dis, xw.scr));
+       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