Files
Arquivotheca.SunOS-4.1.4/usr.lib/libcurses/screen/clreolinln.c
seta75D ff309bfe1c Init
2021-10-11 18:37:13 -03:00

149 lines
4.0 KiB
C

#ifndef lint
static char sccsid[] = "@(#)clreolinln.c 1.1 94/10/31 SMI"; /* from S5R2 1.1 */
#endif
#include "curses.ext"
extern int _clearhl();
extern int _dellines();
extern int _inslines();
extern int _outch();
extern int _pos();
extern int _setwind();
extern int clreol();
extern char *tparm();
extern int tputs();
_clreol()
{
register int col;
register struct line *cb;
#ifdef DEBUG
if(outf) fprintf(outf, "_clreol().\n");
#endif
if (!move_standout_mode)
_clearhl ();
if (clr_eol) {
tputs (clr_eol, columns-SP->phys_x, _outch);
} else if (delete_line && insert_line && SP->phys_x == 0) {
_dellines (1);
_inslines (1);
} else {
/*
* Should consider using delete/insert line here, too,
* if the part that would have to be redrawn is short,
* or if we have to get rid of some cemented highlights.
* This might win on the DTC 382 or the Teleray 1061.
*/
cb = SP->cur_body[SP->phys_y+1];
for (col=SP->phys_x+1; col<cb->length; col++)
if (cb->body[col] != ' ') {
_pos(SP->phys_y, col);
_blanks(1);
}
/*
* Could save and restore SP->curptr position, but since we
* keep track of what _blanks does to it, it turns out
* that this is wasted. Not backspacing over the stuff
* cleared out is a real win on a super dumb terminal.
*/
}
}
_inslines (n)
{
register int i;
#ifdef DEBUG
if(outf) fprintf(outf, "_inslines(%d).\n", n);
#endif
if (!move_standout_mode && SP->phys_gr)
_clearhl();
if (SP->phys_y + n >= lines && clr_eos) {
/*
* Really quick -- clear to end of screen.
*/
tputs(clr_eos, lines-SP->phys_y, _outch);
return;
}
/*
* We are about to _shove something off the bottom of the screen.
* Terminals with extra memory keep this around, and it might
* show up again to haunt us later if we do a delete line or
* scroll into it, or when we exit. So we clobber it now. We
* might get better performance by somehow remembering that this
* stuff is down there and worrying about it if/when we have to.
* In particular, having to do this extra pair of SP->curptr motions
* is a lose.
*/
if (memory_below) {
int save;
save = SP->phys_y;
if (save_cursor && restore_cursor)
tputs(save_cursor, 1, _outch);
if (clr_eos) {
_pos(lines-n, 0);
tputs(clr_eos, n, _outch);
} else {
for (i=0; i<n; i++) {
_pos(lines-n+i, 0);
_clreol();
}
}
if (save_cursor && restore_cursor)
tputs(restore_cursor, 1, _outch);
else
_pos(save, 0);
}
/* Do the physical line deletion */
if (scroll_reverse && SP->phys_y == SP->des_top_mgn /* &&costSR<costAL */) {
/*
* Use reverse scroll mode of the terminal, at
* the top of the window. Reverse linefeed works
* too, since we only use it from top line of window.
*/
_setwind();
for (i = n; i > 0; i--) {
_pos(SP->phys_y, 0);
tputs(scroll_reverse, 1, _outch);
if (SP->ml_above > 0)
SP->ml_above--;
/*
* If we are at the top of the screen, and the
* terminal retains display above, then we
* should try to clear to end of line.
* Have to use CE since we don't remember what is
* actually on the line.
*/
if (clr_eol && memory_above)
tputs(clr_eol, 1, _outch);
}
} else if (parm_insert_line && (n>1 || *insert_line==0)) {
tputs(tparm(parm_insert_line, n, SP->phys_y), lines-SP->phys_y, _outch);
} else if (change_scroll_region && *insert_line==0) {
/* vt100 change scrolling region to fake AL */
tputs(save_cursor, 1, _outch);
tputs( tparm(change_scroll_region,
SP->phys_y, SP->des_bot_mgn), 1, _outch);
/* change_scroll_region homes stupid cursor */
tputs(restore_cursor, 1, _outch);
for (i=n; i>0; i--)
tputs(scroll_reverse, 1, _outch);/* should do @'s */
/* restore scrolling region */
tputs(tparm(change_scroll_region,
SP->des_top_mgn, SP->des_bot_mgn), 1, _outch);
tputs(restore_cursor, 1, _outch);/* Once again put it back */
SP->phys_top_mgn = SP->des_top_mgn;
SP->phys_bot_mgn = SP->des_bot_mgn;
} else {
tputs(insert_line, lines - SP->phys_y, _outch);
for (i = n - 1; i > 0; i--) {
tputs(insert_line, lines - SP->phys_y, _outch);
}
}
}