87 lines
1.5 KiB
C
87 lines
1.5 KiB
C
|
|
/* This work is copyrighted. See COPYRIGHT.OLD & COPYRIGHT.NEW for *
|
|
* details. If they are missing then this copy is in violation of *
|
|
* the copyright conditions. */
|
|
|
|
/*
|
|
** lib_addch.c
|
|
**
|
|
** The routine waddch().
|
|
**
|
|
*/
|
|
|
|
#include "curses.priv.h"
|
|
#include "unctrl.h"
|
|
|
|
int
|
|
waddch(WINDOW *win, chtype c)
|
|
{
|
|
int x, y;
|
|
int newx;
|
|
chtype ch = c;
|
|
|
|
#if 0
|
|
/* enabling this causes tons of tracing output
|
|
and slow ncurses down to a crawl */
|
|
T(("waddch(%x,%c (%x)) called", win, ch&A_CHARTEXT, ch));
|
|
#endif
|
|
|
|
x = win->_curx;
|
|
y = win->_cury;
|
|
|
|
if (y > win->_maxy || x > win->_maxx || y < 0 || x < 0)
|
|
return(ERR);
|
|
|
|
switch (ch&A_CHARTEXT) {
|
|
case '\t':
|
|
for (newx = x + (8 - (x & 07)); x < newx; x++)
|
|
if (waddch(win, ' ') == ERR)
|
|
return(ERR);
|
|
return(OK);
|
|
case '\n':
|
|
wclrtoeol(win);
|
|
x = 0;
|
|
goto newline;
|
|
case '\r':
|
|
x = 0;
|
|
break;
|
|
case '\b':
|
|
if (--x < 0)
|
|
x = 0;
|
|
break;
|
|
default:
|
|
if (ch < ' ')
|
|
return(waddstr(win, unctrl(ch)));
|
|
|
|
ch |= win->_attrs;
|
|
|
|
if (win->_line[y][x] != ch) {
|
|
if (win->_firstchar[y] == _NOCHANGE)
|
|
win->_firstchar[y] = win->_lastchar[y] = x;
|
|
else if (x < win->_firstchar[y])
|
|
win->_firstchar[y] = x;
|
|
else if (x > win->_lastchar[y])
|
|
win->_lastchar[y] = x;
|
|
|
|
}
|
|
|
|
win->_line[y][x++] = ch;
|
|
if (x > win->_maxx) {
|
|
x = 0;
|
|
newline:
|
|
y++;
|
|
if (y > win->_regbottom) {
|
|
y--;
|
|
if (win->_scroll)
|
|
scroll(win);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
win->_curx = x;
|
|
win->_cury = y;
|
|
|
|
return(OK);
|
|
}
|