+ if (altToggle && histMode && !histOp)
+ memset(term.dirty, 0, sizeof(*term.dirty) * term.row);
+ int const o = !IS_SET(MODE_ALTSCREEN) && histMode && !histOp, h =rows();
+ int y;
+
+ for (y = y1; y < y2; y++) {
+ int const oy = o ? (y + insertOff - histOff + h) % h : y;
+ if (!BETWEEN(oy, 0, term.row-1) || !term.dirty[y]) continue;
+ xdrawline(term.line[y], x1, oy, x2);
+ }
+ memset(&term.dirty[y1], 0, sizeof(*term.dirty) * (y2 - y1));
+}
+
+void
+draw(void)
+{
+ int cx = term.c.x, ocx = term.ocx, ocy = term.ocy;
+
+ if (!xstartdraw())
+ return;
+
+ /* adjust cursor position */
+ LIMIT(term.ocx, 0, term.col-1);
+ LIMIT(term.ocy, 0, term.row-1);
+ if (term.line[term.ocy][term.ocx].mode & ATTR_WDUMMY)
+ term.ocx--;
+ if (term.line[term.c.y][cx].mode & ATTR_WDUMMY)
+ cx--;
+
+ if (histMode) historyPreDraw();
+ drawregion(0, 0, term.col, term.row);
+ if (!histMode)
+ xdrawcursor(cx, term.c.y, term.line[term.c.y][cx],
+ term.ocx, term.ocy, term.line[term.ocy][term.ocx]);
+ term.ocx = cx;
+ term.ocy = term.c.y;
+ xfinishdraw();
+ if (ocx != term.ocx || ocy != term.ocy)
+ xximspot(term.ocx, term.ocy);