+
+ ASSERTC(write_pos, >=, 0);
+
+ // Scroll entire buffer (about to write outside limit)
+ if( write_pos >= limit )
+ {
+ ASSERTC(write_pos, <, limit + Term->TextWidth);
+ VT_int_ScrollText(Term, 1);
+ write_pos -= Term->TextWidth;
+ }
+
+ // Bring written cell into view
+ if( !(Term->Flags & VT_FLAG_ALTBUF) )
+ {
+ size_t onescreen = Term->TextWidth*Term->TextHeight;
+ if( write_pos >= Term->ViewPos + onescreen )
+ {
+ size_t new_pos = write_pos - (write_pos % Term->TextWidth) - onescreen + Term->TextWidth;
+ size_t count = (new_pos - Term->ViewPos) / Term->TextWidth;
+ VT_int_ScrollFramebuffer(Term, count);
+ //Debug("VT_int_PutChar: VScroll down to %i", new_pos/Term->TextWidth);
+ Term->ViewPos = new_pos;
+ }
+ else if( write_pos < Term->ViewPos )
+ {
+ size_t new_pos = write_pos - (write_pos % Term->TextWidth);
+ size_t count = (Term->ViewPos - new_pos) / Term->TextWidth;
+ VT_int_ScrollFramebuffer(Term, -count);
+ //Debug("VT_int_PutChar: VScroll up to %i", new_pos/Term->TextWidth);
+ Term->ViewPos = new_pos;
+ }
+ else
+ {
+ // no action, cell is visible
+ }
+ }