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);
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 *);
tputc(*s++);
}
-void
+int
tresize(int col, int row) {
int i, x;
int minrow = MIN(row, term.row);
int slide = term.c.y - row + 1;
if(col < 1 || row < 1)
- return;
+ return 0;
/* free unneeded rows */
i = 0;
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
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