summaryrefslogtreecommitdiff
path: root/lib/libcurses
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libcurses')
-rw-r--r--lib/libcurses/Makefile3
-rw-r--r--lib/libcurses/cr_put.c24
-rw-r--r--lib/libcurses/curses.h1
-rw-r--r--lib/libcurses/refresh.c42
-rw-r--r--lib/libcurses/setterm.c27
-rw-r--r--lib/libcurses/tstp.c8
-rw-r--r--lib/libcurses/tty.c41
7 files changed, 95 insertions, 51 deletions
diff --git a/lib/libcurses/Makefile b/lib/libcurses/Makefile
index 74baf7974571..b089a988b78a 100644
--- a/lib/libcurses/Makefile
+++ b/lib/libcurses/Makefile
@@ -9,7 +9,8 @@ SRCS= addbytes.c addch.c addnstr.c box.c clear.c clrtobot.c clrtoeol.c \
standout.c toucholap.c touchwin.c tscroll.c tstp.c tty.c unctrl.c
MAN3= curses.3
-CFLAGS+=-D_CURSES_PRIVATE -I${.CURDIR}
+CFLAGS+=-D_CURSES_PRIVATE
+SHARED_LDADD+= -ltermcap
beforeinstall:
-cd ${.CURDIR}; cmp -s curses.h ${DESTDIR}/usr/include/curses.h > \
diff --git a/lib/libcurses/cr_put.c b/lib/libcurses/cr_put.c
index b50875c91211..0afaf3a344d7 100644
--- a/lib/libcurses/cr_put.c
+++ b/lib/libcurses/cr_put.c
@@ -101,11 +101,11 @@ fgoto(in_refresh)
while (l > 0) {
if (__pfast)
if (CR)
- tputs(CR, 0, __cputchar);
+ tputs(CR, 1, __cputchar);
else
putchar('\r');
if (NL)
- tputs(NL, 0, __cputchar);
+ tputs(NL, 1, __cputchar);
else
putchar('\n');
l--;
@@ -146,7 +146,7 @@ fgoto(in_refresh)
* Eggert's Superbee description which wins better.
*/
if (NL /* && !XB */ && __pfast)
- tputs(NL, 0, __cputchar);
+ tputs(NL, 1, __cputchar);
else
putchar('\n');
l--;
@@ -166,7 +166,7 @@ fgoto(in_refresh)
if (outcol != COLS - 1 && plod(strlen(cgp), in_refresh) > 0)
plod(0, in_refresh);
else
- tputs(cgp, 0, __cputchar);
+ tputs(cgp, 1, __cputchar);
} else
plod(0, in_refresh);
outline = destline;
@@ -243,7 +243,7 @@ plod(cnt, in_refresh)
* Cheaper to home. Do it now and pretend it's a
* regular local motion.
*/
- tputs(HO, 0, plodput);
+ tputs(HO, 1, plodput);
outcol = outline = 0;
} else if (LL) {
/*
@@ -252,7 +252,7 @@ plod(cnt, in_refresh)
*/
k = (LINES - 1) - destline;
if (i + k + 2 < j && (k <= 0 || UP)) {
- tputs(LL, 0, plodput);
+ tputs(LL, 1, plodput);
outcol = 0;
outline = LINES - 1;
}
@@ -302,12 +302,12 @@ plod(cnt, in_refresh)
* into account.
*/
if (CR)
- tputs(CR, 0, plodput);
+ tputs(CR, 1, plodput);
else
plodput('\r');
if (NC) {
if (NL)
- tputs(NL, 0, plodput);
+ tputs(NL, 1, plodput);
else
plodput('\n');
outline++;
@@ -318,7 +318,7 @@ plod(cnt, in_refresh)
dontcr: while (outline < destline) {
outline++;
if (NL)
- tputs(NL, 0, plodput);
+ tputs(NL, 1, plodput);
else
plodput('\n');
if (plodcnt < 0)
@@ -333,7 +333,7 @@ dontcr: while (outline < destline) {
goto out;
#ifdef notdef
if (BT && outcol - destcol > k + 4) {
- tputs(BT, 0, plodput);
+ tputs(BT, 1, plodput);
outcol--;
outcol &= ~7;
continue;
@@ -357,14 +357,14 @@ dontcr: while (outline < destline) {
if (i > destcol)
break;
if (TA)
- tputs(TA, 0, plodput);
+ tputs(TA, 1, plodput);
else
plodput('\t');
outcol = i;
}
if (destcol - outcol > 4 && i < COLS && (BC || BS)) {
if (TA)
- tputs(TA, 0, plodput);
+ tputs(TA, 1, plodput);
else
plodput('\t');
outcol = i;
diff --git a/lib/libcurses/curses.h b/lib/libcurses/curses.h
index 14e82deac58a..fa68e08c79dc 100644
--- a/lib/libcurses/curses.h
+++ b/lib/libcurses/curses.h
@@ -199,6 +199,7 @@ typedef struct termios SGTTY;
extern SGTTY __orig_termios; /* Terminal state before curses */
extern SGTTY __baset; /* Our base terminal state */
extern int __tcaction; /* If terminal hardware set. */
+extern int __tty_fileno; /* Terminal file descriptor */
extern int COLS; /* Columns on the screen. */
extern int LINES; /* Lines on the screen. */
diff --git a/lib/libcurses/refresh.c b/lib/libcurses/refresh.c
index 1a371fe45b2a..b0a84b1dc4f2 100644
--- a/lib/libcurses/refresh.c
+++ b/lib/libcurses/refresh.c
@@ -76,7 +76,11 @@ wrefresh(win)
if (win->flags & __CLEAROK || curscr->flags & __CLEAROK || curwin) {
if ((win->flags & __FULLWIN) || curscr->flags & __CLEAROK) {
- tputs(CL, 0, __cputchar);
+ if (curscr->flags & __WSTANDOUT) {
+ tputs(SE, 0, __cputchar);
+ curscr->flags &= ~__WSTANDOUT;
+ }
+ tputs(CL, win->maxy, __cputchar);
ly = 0;
lx = 0;
if (!curwin) {
@@ -266,9 +270,9 @@ makech(win, wy)
if (force) {
if (CM)
- tputs(tgoto(CM, lx, ly), 0, __cputchar);
+ tputs(tgoto(CM, lx, ly), 1, __cputchar);
else {
- tputs(HO, 0, __cputchar);
+ tputs(HO, 1, __cputchar);
__mvcur(0, 0, ly, lx, 1);
}
}
@@ -298,7 +302,7 @@ makech(win, wy)
&& wx <= lch) {
if (ce != NULL && win->maxx + win->begx ==
- curscr->maxx && wx >= nlsp && nsp->ch == ' ') {
+ curscr->maxx && wx >= nlsp && nsp->ch == ' ' && nsp->attr == 0) {
/* Check for clear to end-of-line. */
cep = &curscr->lines[win->begy + wy]->line[win->begx + win->maxx - 1];
while (cep->ch == ' ' && cep->attr == 0)
@@ -315,7 +319,11 @@ makech(win, wy)
#ifdef DEBUG
__CTRACE("makech: using CE\n");
#endif
- tputs(CE, 0, __cputchar);
+ if (curscr->flags & __WSTANDOUT) {
+ tputs(SE, 0, __cputchar);
+ curscr->flags &= ~__WSTANDOUT;
+ }
+ tputs(CE, 1, __cputchar);
lx = wx + win->begx;
while (wx++ <= clsp) {
csp->ch = ' ';
@@ -695,37 +703,37 @@ scrolln(starts, startw, curs, bot, top)
__mvcur(oy, ox, top, 0, 1);
/* Scroll up the block */
if (DL && (!dl || n > 1))
- tputs(__tscroll(DL, n), 0, __cputchar);
+ tputs(__tscroll(DL, n), n, __cputchar);
else
for(i = 0; i < n; i++)
- tputs(dl, 0, __cputchar);
+ tputs(dl, 1, __cputchar);
/*
* Push down the bottom region.
*/
__mvcur(top, 0, bot - n + 1, 0, 1);
if (AL && (!al || n > 1))
- tputs(__tscroll(AL, n), 0, __cputchar);
+ tputs(__tscroll(AL, n), n, __cputchar);
else
for(i = 0; i < n; i++)
- tputs(al, 0, __cputchar);
+ tputs(al, 1, __cputchar);
__mvcur(bot - n + 1, 0, oy, ox, 1);
} else {
/* Preserve the bottom lines */
__mvcur(oy, ox, bot + n + 1, 0, 1); /* n < 0 */
if (DL && (!dl || -n > 1))
- tputs(__tscroll(DL, -n), 0, __cputchar);
+ tputs(__tscroll(DL, -n), -n, __cputchar);
else
for(i = n; i < 0; i++)
- tputs(dl, 0, __cputchar);
+ tputs(dl, 1, __cputchar);
__mvcur(bot + n + 1, 0, top, 0, 1);
/* Scroll the block down */
if (AL && (!al || -n > 1))
- tputs(__tscroll(AL, -n), 0, __cputchar);
+ tputs(__tscroll(AL, -n), -n, __cputchar);
else
for(i = n; i < 0; i++)
- tputs(al, 0, __cputchar);
+ tputs(al, 1, __cputchar);
__mvcur(top, 0, oy, ox, 1);
}
} else { /* Use change scroll region */
@@ -735,11 +743,11 @@ scrolln(starts, startw, curs, bot, top)
__mvcur(oy, ox, bot, 0, 1);
/* Scroll up the block */
if (SF && n > 1)
- tputs(__tscroll(SF, n), 0, __cputchar);
+ tputs(__tscroll(SF, n), n, __cputchar);
else
for(i = 0; i < n; i++)
if (NL && __pfast)
- tputs(NL, 0, __cputchar);
+ tputs(NL, 1, __cputchar);
else
putchar('\n');
__mvcur(bot, 0, oy, ox, 1);
@@ -747,10 +755,10 @@ scrolln(starts, startw, curs, bot, top)
__mvcur(oy, ox, top, 0, 1);
/* Scroll the block down */
if (SR && (!sr || -n > 1))
- tputs(__tscroll(SR, -n), 0, __cputchar);
+ tputs(__tscroll(SR, -n), -n, __cputchar);
else
for(i = n; i < 0; i++)
- tputs(sr, 0, __cputchar);
+ tputs(sr, 1, __cputchar);
__mvcur(top, 0, oy, ox, 1);
}
if (bot != curscr->maxy - 1 || top != 0)
diff --git a/lib/libcurses/setterm.c b/lib/libcurses/setterm.c
index 35e4e55b26d6..b949ae337843 100644
--- a/lib/libcurses/setterm.c
+++ b/lib/libcurses/setterm.c
@@ -35,6 +35,7 @@
static char sccsid[] = "@(#)setterm.c 8.3 (Berkeley) 1/2/94";
#endif /* not lint */
+#include <termios.h>
#include <sys/ioctl.h>
#include <curses.h>
@@ -42,6 +43,9 @@ static char sccsid[] = "@(#)setterm.c 8.3 (Berkeley) 1/2/94";
#include <string.h>
#include <unistd.h>
+#undef ospeed
+extern short ospeed;
+
static void zap __P((void));
static char *sflags[] = {
@@ -149,6 +153,29 @@ setterm(type)
CA = 1;
PC = _PC ? _PC[0] : 0;
+
+ switch(cfgetospeed(&__baset)) {
+ case B0: ospeed = 0; break;
+ case B50: ospeed = 1; break;
+ case B75: ospeed = 2; break;
+ case B110: ospeed = 3; break;
+ case B134: ospeed = 4; break;
+ case B150: ospeed = 5; break;
+ case B200: ospeed = 6; break;
+ case B300: ospeed = 7; break;
+ case B600: ospeed = 8; break;
+ case B1200: ospeed = 9; break;
+ case B1800: ospeed = 10; break;
+ case B2400: ospeed = 11; break;
+ case B4800: ospeed = 12; break;
+ case B9600: ospeed = 13; break;
+ case EXTA: ospeed = 14; break;
+ case EXTB: ospeed = 15; break;
+ case B57600: ospeed = 16; break;
+ default:
+ case B115200: ospeed = 17; break;
+ }
+
aoftspace = tspace;
ttytype = longname(genbuf, __ttytype);
diff --git a/lib/libcurses/tstp.c b/lib/libcurses/tstp.c
index daac9174d745..164f10bdd8b0 100644
--- a/lib/libcurses/tstp.c
+++ b/lib/libcurses/tstp.c
@@ -54,8 +54,8 @@ __stop_signal_handler(signo)
sigset_t oset, set;
/* Get the current terminal state (which the user may have changed). */
- if (tcgetattr(STDIN_FILENO, &save))
- return;
+ if (tcgetattr(__tty_fileno, &save))
+ return;
/*
* Block window change and timer signals. The latter is because
@@ -87,10 +87,10 @@ __stop_signal_handler(signo)
__set_stophandler();
/* save the new "default" terminal state */
- (void)tcgetattr(STDIN_FILENO, &__orig_termios);
+ (void)tcgetattr(__tty_fileno, &__orig_termios);
/* Reset the terminal state to the mode just before we stopped. */
- (void)tcsetattr(STDIN_FILENO, __tcaction ?
+ (void)tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, &save);
/* Restart the screen. */
diff --git a/lib/libcurses/tty.c b/lib/libcurses/tty.c
index d0345bfba993..3f9eabdb3a98 100644
--- a/lib/libcurses/tty.c
+++ b/lib/libcurses/tty.c
@@ -36,10 +36,12 @@ static char sccsid[] = "@(#)tty.c 8.2 (Berkeley) 1/2/94";
#endif /* not lint */
#include <sys/ioctl.h>
+#include <sys/file.h>
#include <curses.h>
#include <termios.h>
#include <unistd.h>
+#include <paths.h>
/*
* In general, curses should leave tty hardware settings alone (speed, parity,
@@ -54,6 +56,7 @@ int __tcaction = 1; /* Ignore hardware settings. */
int __tcaction = 0;
#endif
+int __tty_fileno;
struct termios __orig_termios, __baset;
static struct termios cbreakt, rawt, *curt;
static int useraw;
@@ -75,8 +78,12 @@ gettmode()
{
useraw = 0;
- if (tcgetattr(STDIN_FILENO, &__orig_termios))
- return (ERR);
+ if (tcgetattr(__tty_fileno = STDIN_FILENO, &__orig_termios)) {
+ if ((__tty_fileno = open(_PATH_TTY, O_RDONLY, 0)) < 0)
+ return (ERR);
+ else if (tcgetattr(__tty_fileno, &__orig_termios))
+ return (ERR);
+ }
__baset = __orig_termios;
__baset.c_oflag &= ~OXTABS;
@@ -116,7 +123,7 @@ gettmode()
}
curt = &__baset;
- return (tcsetattr(STDIN_FILENO, __tcaction ?
+ return (tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, curt) ? ERR : OK);
}
@@ -125,7 +132,7 @@ raw()
{
useraw = __pfast = __rawmode = 1;
curt = &rawt;
- return (tcsetattr(STDIN_FILENO, __tcaction ?
+ return (tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, curt));
}
@@ -134,7 +141,7 @@ noraw()
{
useraw = __pfast = __rawmode = 0;
curt = &__baset;
- return (tcsetattr(STDIN_FILENO, __tcaction ?
+ return (tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, curt));
}
@@ -144,7 +151,7 @@ cbreak()
__rawmode = 1;
curt = useraw ? &rawt : &cbreakt;
- return (tcsetattr(STDIN_FILENO, __tcaction ?
+ return (tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, curt));
}
@@ -154,7 +161,7 @@ nocbreak()
__rawmode = 0;
curt = useraw ? &rawt : &__baset;
- return (tcsetattr(STDIN_FILENO, __tcaction ?
+ return (tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, curt));
}
@@ -166,7 +173,7 @@ echo()
__baset.c_lflag |= ECHO;
__echoit = 1;
- return (tcsetattr(STDIN_FILENO, __tcaction ?
+ return (tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, curt));
}
@@ -178,7 +185,7 @@ noecho()
__baset.c_lflag &= ~ECHO;
__echoit = 0;
- return (tcsetattr(STDIN_FILENO, __tcaction ?
+ return (tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, curt));
}
@@ -193,7 +200,7 @@ nl()
__baset.c_oflag |= ONLCR;
__pfast = __rawmode;
- return (tcsetattr(STDIN_FILENO, __tcaction ?
+ return (tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, curt));
}
@@ -208,7 +215,7 @@ nonl()
__baset.c_oflag &= ~ONLCR;
__pfast = 1;
- return (tcsetattr(STDIN_FILENO, __tcaction ?
+ return (tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, curt));
}
@@ -216,9 +223,9 @@ void
__set_scroll_region(top, bot)
int top, bot;
{
- tputs(SC, 0, __cputchar);
- tputs(tgoto(CS, bot, top), 0, __cputchar);
- tputs(RC, 0, __cputchar);
+ tputs(SC, 1, __cputchar);
+ tputs(tgoto(CS, bot, top), 1, __cputchar);
+ tputs(RC, 1, __cputchar);
}
void
@@ -253,7 +260,7 @@ endwin()
(void)fflush(stdout);
(void)setvbuf(stdout, NULL, _IOLBF, 0);
- return (tcsetattr(STDIN_FILENO, __tcaction ?
+ return (tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, &__orig_termios));
}
@@ -266,12 +273,12 @@ static struct termios savedtty;
int
savetty()
{
- return (tcgetattr(STDIN_FILENO, &savedtty));
+ return (tcgetattr(__tty_fileno, &savedtty));
}
int
resetty()
{
- return (tcsetattr(STDIN_FILENO, __tcaction ?
+ return (tcsetattr(__tty_fileno, __tcaction ?
TCSASOFT | TCSADRAIN : TCSADRAIN, &savedtty));
}