freebsd-skq/lib/libncurses/lib_kernel.c
Jordan K. Hubbard 479c200dea Don't smash attributes when turning color values off. This was submitted
as a PR to GNATs but it evidently went astray somehow since I can't find
it in the database now, nor does an assigned PR# appear on the mail I got.
Sorry about that, Danny!
Submitted-By: Danny R. Johnston <danny@simn.com>
1996-09-06 05:55:48 +00:00

313 lines
4.7 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_kernel.c
*
* Misc. low-level routines:
* reset_prog_mode()
* reset_shell_mode()
* baudrate()
* erasechar()
* killchar()
* flushinp()
* savetty()
* resetty()
*
*
*/
#include "curses.priv.h"
#include "terminfo.h"
int wattron(WINDOW *win, chtype at)
{
T(("wattron(%x,%s) current = %s", win, _traceattr(at), _traceattr(win->_attrs)));
if (PAIR_NUMBER(at) > 0x00) {
win->_attrs = (win->_attrs & ~A_COLOR) | at ;
T(("new attribute is %s", _traceattr(win->_attrs)));
} else {
win->_attrs |= at;
T(("new attribute is %s", _traceattr(win->_attrs)));
}
return OK;
}
int wattroff(WINDOW *win, chtype at)
{
#define IGNORE_COLOR_OFF FALSE
T(("wattroff(%x,%s) current = %s", win, _traceattr(at), _traceattr(win->_attrs)));
if (IGNORE_COLOR_OFF == TRUE) {
if (PAIR_NUMBER(at) == 0xff) /* turn off color */
win->_attrs &= ~at;
else /* leave color alone */
win->_attrs &= ~(at & ~A_COLOR);
} else {
if (PAIR_NUMBER(at) > 0x00) /* turn off color */
win->_attrs &= ~at;
else /* leave color alone */
win->_attrs &= ~(at & ~A_COLOR);
}
T(("new attribute is %s", _traceattr(win->_attrs)));
return OK;
}
#ifndef MYTINFO
int reset_prog_mode()
{
T(("reset_prog_mode() called"));
#ifdef TERMIOS
tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb);
#else
stty(cur_term->Filedes, &cur_term->Nttyb);
#endif
return OK;
}
int reset_shell_mode()
{
T(("reset_shell_mode() called"));
#ifdef TERMIOS
tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Ottyb);
#else
stty(cur_term->Filedes, &cur_term->Ottyb);
#endif
return OK;
}
#endif
int curs_set(int vis)
{
int cursor = SP->_cursor;
T(("curs_set(%d)", vis));
if (vis < 0 || vis > 2)
return ERR;
switch(vis) {
case 2:
if (cursor_visible)
putp(cursor_visible);
break;
case 1:
if (cursor_normal)
putp(cursor_normal);
break;
case 0:
if (cursor_invisible)
putp(cursor_invisible);
break;
}
SP->_cursor = vis;
return cursor;
}
int delay_output(int ms)
{
int speed;
T(("delay_output(%d) called", ms));
if (!no_pad_char && (speed = baudrate()) == ERR)
return(ERR);
else {
register int nullcount;
if (!no_pad_char)
for (nullcount = ms * 1000 / speed; nullcount > 0; nullcount--)
putc(*pad_char, SP->_ofp);
(void) fflush(SP->_ofp);
if (no_pad_char)
napms(ms);
}
return OK;
}
/*
* erasechar()
*
* Return erase character as given in cur_term->Ottyb.
*
*/
char
erasechar()
{
T(("erasechar() called"));
#ifdef TERMIOS
return(cur_term->Ottyb.c_cc[VERASE]);
#else
return(cur_term->Ottyb.sg_erase);
#endif
}
/*
* killchar()
*
* Return kill character as given in cur_term->Ottyb.
*
*/
char
killchar()
{
T(("killchar() called"));
#ifdef TERMIOS
return(cur_term->Ottyb.c_cc[VKILL]);
#else
return(cur_term->Ottyb.sg_kill);
#endif
}
/*
* flushinp()
*
* Flush any input on cur_term->Filedes
*
*/
int flushinp()
{
T(("flushinp() called"));
#ifdef TERMIOS
tcflush(cur_term->Filedes, TCIFLUSH);
#else
ioctl(cur_term->Filedes, TIOCFLUSH, 0);
#endif
if (SP) {
SP->_fifohead = -1;
SP->_fifotail = 0;
SP->_fifopeek = 0;
}
return OK;
}
/*
* int
* baudrate()
*
* Returns the current terminal's baud rate.
*
*/
#ifndef TERMIOS
struct speed {
speed_t s;
int sp;
};
static struct speed speeds[] = {
{B0, 0},
{B50, 50},
{B75, 75},
{B110, 110},
{B134, 134},
{B150, 150},
{B200, 200},
{B300, 300},
{B600, 600},
{B1200, 1200},
{B1800, 1800},
{B2400, 2400},
{B4800, 4800},
{B9600, 9600}
#define MAX_BAUD B9600
#ifdef B19200
#undef MAX_BAUD
#define MAX_BAUD B19200
,{B19200, 19200}
#endif
#ifdef B38400
#undef MAX_BAUD
#define MAX_BAUD B38400
,{B38400, 38400}
#endif
#ifdef B57600
#undef MAX_BAUD
#define MAX_BAUD B57600
,{B57600, 57600}
#endif
#ifdef B115200
#undef MAX_BAUD
#define MAX_BAUD B115200
,{B115200, 115200}
#endif
};
#endif
int
baudrate()
{
#ifndef TERMIOS
int i, ret;
#endif
T(("baudrate() called"));
#ifdef TERMIOS
return cfgetospeed(&cur_term->Nttyb);
#else
ret = cur_term->Nttyb.sg_ospeed;
if(ret < 0 || ret > MAX_BAUD)
return ERR;
for (i = 0; i < (sizeof(speeds) / sizeof(struct speed)); i++)
if (speeds[i].s == ret)
return speeds[i].sp;
return ERR;
#endif
}
/*
** savetty() and resetty()
**
*/
static TTY buf;
int savetty()
{
T(("savetty() called"));
#ifdef TERMIOS
tcgetattr(cur_term->Filedes, &buf);
#else
gtty(cur_term->Filedes, &buf);
#endif
return OK;
}
int resetty()
{
T(("resetty() called"));
#ifdef TERMIOS
tcsetattr(cur_term->Filedes, TCSANOW, &buf);
#else
stty(cur_term->Filedes, &buf);
#endif
return OK;
}