xref: /freebsd/contrib/ncurses/ncurses/tty/lib_vidattr.c (revision aae38d10b4eebf81c0942947e8b83a9bb8651d88)
10e3d5408SPeter Wemm /****************************************************************************
2*aae38d10SBaptiste Daroussin  * Copyright (c) 1998-2018,2019 Free Software Foundation, Inc.              *
30e3d5408SPeter Wemm  *                                                                          *
40e3d5408SPeter Wemm  * Permission is hereby granted, free of charge, to any person obtaining a  *
50e3d5408SPeter Wemm  * copy of this software and associated documentation files (the            *
60e3d5408SPeter Wemm  * "Software"), to deal in the Software without restriction, including      *
70e3d5408SPeter Wemm  * without limitation the rights to use, copy, modify, merge, publish,      *
80e3d5408SPeter Wemm  * distribute, distribute with modifications, sublicense, and/or sell       *
90e3d5408SPeter Wemm  * copies of the Software, and to permit persons to whom the Software is    *
100e3d5408SPeter Wemm  * furnished to do so, subject to the following conditions:                 *
110e3d5408SPeter Wemm  *                                                                          *
120e3d5408SPeter Wemm  * The above copyright notice and this permission notice shall be included  *
130e3d5408SPeter Wemm  * in all copies or substantial portions of the Software.                   *
140e3d5408SPeter Wemm  *                                                                          *
150e3d5408SPeter Wemm  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
160e3d5408SPeter Wemm  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
170e3d5408SPeter Wemm  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
180e3d5408SPeter Wemm  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
190e3d5408SPeter Wemm  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
200e3d5408SPeter Wemm  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
210e3d5408SPeter Wemm  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
220e3d5408SPeter Wemm  *                                                                          *
230e3d5408SPeter Wemm  * Except as contained in this notice, the name(s) of the above copyright   *
240e3d5408SPeter Wemm  * holders shall not be used in advertising or otherwise to promote the     *
250e3d5408SPeter Wemm  * sale, use or other dealings in this Software without prior written       *
260e3d5408SPeter Wemm  * authorization.                                                           *
270e3d5408SPeter Wemm  ****************************************************************************/
280e3d5408SPeter Wemm 
290e3d5408SPeter Wemm /****************************************************************************
300e3d5408SPeter Wemm  *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
310e3d5408SPeter Wemm  *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
3206bfebdeSXin LI  *     and: Thomas E. Dickey                        1996-on                 *
3306bfebdeSXin LI  *     and: Juergen Pfeifer                         2009                    *
340e3d5408SPeter Wemm  ****************************************************************************/
350e3d5408SPeter Wemm 
360e3d5408SPeter Wemm /*
370e3d5408SPeter Wemm  *	vidputs(newmode, outc)
380e3d5408SPeter Wemm  *
390e3d5408SPeter Wemm  *	newmode is taken to be the logical 'or' of the symbols in curses.h
400e3d5408SPeter Wemm  *	representing graphic renditions.  The terminal is set to be in all of
410e3d5408SPeter Wemm  *	the given modes, if possible.
420e3d5408SPeter Wemm  *
430e3d5408SPeter Wemm  *	if the new attribute is normal
440e3d5408SPeter Wemm  *		if exit-alt-char-set exists
450e3d5408SPeter Wemm  *			emit it
460e3d5408SPeter Wemm  *		emit exit-attribute-mode
470e3d5408SPeter Wemm  *	else if set-attributes exists
480e3d5408SPeter Wemm  *		use it to set exactly what you want
490e3d5408SPeter Wemm  *	else
500e3d5408SPeter Wemm  *		if exit-attribute-mode exists
510e3d5408SPeter Wemm  *			turn off everything
520e3d5408SPeter Wemm  *		else
530e3d5408SPeter Wemm  *			turn off those which can be turned off and aren't in
540e3d5408SPeter Wemm  *			newmode.
550e3d5408SPeter Wemm  *		turn on each mode which should be on and isn't, one by one
560e3d5408SPeter Wemm  *
570e3d5408SPeter Wemm  *	NOTE that this algorithm won't achieve the desired mix of attributes
580e3d5408SPeter Wemm  *	in some cases, but those are probably just those cases in which it is
590e3d5408SPeter Wemm  *	actually impossible, anyway, so...
600e3d5408SPeter Wemm  *
610e3d5408SPeter Wemm  * 	NOTE that we cannot assume that there's no interaction between color
620e3d5408SPeter Wemm  *	and other attribute resets.  So each time we reset color (or other
630e3d5408SPeter Wemm  *	attributes) we'll have to be prepared to restore the other.
640e3d5408SPeter Wemm  */
650e3d5408SPeter Wemm 
660e3d5408SPeter Wemm #include <curses.priv.h>
670e3d5408SPeter Wemm 
6806bfebdeSXin LI #ifndef CUR
6906bfebdeSXin LI #define CUR SP_TERMTYPE
7006bfebdeSXin LI #endif
710e3d5408SPeter Wemm 
72*aae38d10SBaptiste Daroussin MODULE_ID("$Id: lib_vidattr.c,v 1.74 2019/04/13 22:40:54 tom Exp $")
7306bfebdeSXin LI 
7406bfebdeSXin LI #define doPut(mode) \
7506bfebdeSXin LI 	TPUTS_TRACE(#mode); \
7606bfebdeSXin LI 	NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc)
770e3d5408SPeter Wemm 
780e3d5408SPeter Wemm #define TurnOn(mask, mode) \
79*aae38d10SBaptiste Daroussin 	if ((turn_on & mask) && mode) { \
80*aae38d10SBaptiste Daroussin 	    TPUTS_TRACE(#mode); \
81*aae38d10SBaptiste Daroussin 	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc); \
82*aae38d10SBaptiste Daroussin 	}
830e3d5408SPeter Wemm 
840e3d5408SPeter Wemm #define TurnOff(mask, mode) \
85*aae38d10SBaptiste Daroussin 	if ((turn_off & mask) && mode) { \
86*aae38d10SBaptiste Daroussin 	    TPUTS_TRACE(#mode); \
87*aae38d10SBaptiste Daroussin 	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc); \
88*aae38d10SBaptiste Daroussin 	    turn_off &= ~mask; \
89*aae38d10SBaptiste Daroussin 	}
900e3d5408SPeter Wemm 
910e3d5408SPeter Wemm 	/* if there is no current screen, assume we *can* do color */
920e3d5408SPeter Wemm #define SetColorsIf(why, old_attr) \
9315589c42SPeter Wemm 	if (can_color && (why)) { \
9406bfebdeSXin LI 		int old_pair = PairNumber(old_attr); \
9518259542SPeter Wemm 		TR(TRACE_ATTRS, ("old pair = %d -- new pair = %d", old_pair, pair)); \
960e3d5408SPeter Wemm 		if ((pair != old_pair) \
9715589c42SPeter Wemm 		 || (fix_pair0 && (pair == 0)) \
980e3d5408SPeter Wemm 		 || (reverse ^ ((old_attr & A_REVERSE) != 0))) { \
9906bfebdeSXin LI 		     NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_ARGx \
10006bfebdeSXin LI 				     (short) old_pair, \
10106bfebdeSXin LI 				     (short) pair, \
10206bfebdeSXin LI 				     reverse, outc); \
1030e3d5408SPeter Wemm 		} \
1040e3d5408SPeter Wemm 	}
1050e3d5408SPeter Wemm 
1065ca44d1cSRong-En Fan #define PreviousAttr _nc_prescreen.previous_attr
1075ca44d1cSRong-En Fan 
1087a69bbfbSPeter Wemm NCURSES_EXPORT(int)
10906bfebdeSXin LI NCURSES_SP_NAME(vidputs) (NCURSES_SP_DCLx
11006bfebdeSXin LI 			  chtype newmode,
11106bfebdeSXin LI 			  NCURSES_SP_OUTC outc)
1120e3d5408SPeter Wemm {
1130e3d5408SPeter Wemm     attr_t turn_on, turn_off;
1140e3d5408SPeter Wemm     int pair;
1150e3d5408SPeter Wemm     bool reverse = FALSE;
11606bfebdeSXin LI     bool can_color = (SP_PARM == 0 || SP_PARM->_coloron);
11718259542SPeter Wemm #if NCURSES_EXT_FUNCS
11806bfebdeSXin LI     bool fix_pair0 = (SP_PARM != 0 && SP_PARM->_coloron && !SP_PARM->_default_color);
11915589c42SPeter Wemm #else
12015589c42SPeter Wemm #define fix_pair0 FALSE
12115589c42SPeter Wemm #endif
1220e3d5408SPeter Wemm 
1235ca44d1cSRong-En Fan     newmode &= A_ATTRIBUTES;
12406bfebdeSXin LI 
12506bfebdeSXin LI     T((T_CALLED("vidputs(%p,%s)"), (void *) SP_PARM, _traceattr(newmode)));
12606bfebdeSXin LI 
127*aae38d10SBaptiste Daroussin     if (!IsValidTIScreen(SP_PARM))
12806bfebdeSXin LI 	returnCode(ERR);
1290e3d5408SPeter Wemm 
1300e3d5408SPeter Wemm     /* this allows us to go on whether or not newterm() has been called */
13106bfebdeSXin LI     if (SP_PARM)
13206bfebdeSXin LI 	PreviousAttr = AttrOf(SCREEN_ATTRS(SP_PARM));
1330e3d5408SPeter Wemm 
1345ca44d1cSRong-En Fan     TR(TRACE_ATTRS, ("previous attribute was %s", _traceattr(PreviousAttr)));
1350e3d5408SPeter Wemm 
13606bfebdeSXin LI     if ((SP_PARM != 0)
1374a1a9510SRong-En Fan 	&& (magic_cookie_glitch > 0)) {
1384a1a9510SRong-En Fan #if USE_XMC_SUPPORT
1395ca44d1cSRong-En Fan 	static const chtype table[] =
1404a1a9510SRong-En Fan 	{
1414a1a9510SRong-En Fan 	    A_STANDOUT,
1424a1a9510SRong-En Fan 	    A_UNDERLINE,
1434a1a9510SRong-En Fan 	    A_REVERSE,
1444a1a9510SRong-En Fan 	    A_BLINK,
1454a1a9510SRong-En Fan 	    A_DIM,
1464a1a9510SRong-En Fan 	    A_BOLD,
1474a1a9510SRong-En Fan 	    A_INVIS,
1484a1a9510SRong-En Fan 	    A_PROTECT,
14973f0a83dSXin LI #if USE_ITALIC
15073f0a83dSXin LI 	    A_ITALIC,
15173f0a83dSXin LI #endif
1524a1a9510SRong-En Fan 	};
1534a1a9510SRong-En Fan 	unsigned n;
1544a1a9510SRong-En Fan 	int used = 0;
1554a1a9510SRong-En Fan 	int limit = (max_attributes <= 0) ? 1 : max_attributes;
1564a1a9510SRong-En Fan 	chtype retain = 0;
1574a1a9510SRong-En Fan 
1584a1a9510SRong-En Fan 	/*
1594a1a9510SRong-En Fan 	 * Limit the number of attribute bits set in the newmode according to
1604a1a9510SRong-En Fan 	 * the terminfo max_attributes value.
1614a1a9510SRong-En Fan 	 */
1624a1a9510SRong-En Fan 	for (n = 0; n < SIZEOF(table); ++n) {
16306bfebdeSXin LI 	    if ((table[n] & SP_PARM->_ok_attributes) == 0) {
1644a1a9510SRong-En Fan 		newmode &= ~table[n];
1654a1a9510SRong-En Fan 	    } else if ((table[n] & newmode) != 0) {
1664a1a9510SRong-En Fan 		if (used++ >= limit) {
1674a1a9510SRong-En Fan 		    newmode &= ~table[n];
1684a1a9510SRong-En Fan 		    if (newmode == retain)
1694a1a9510SRong-En Fan 			break;
1704a1a9510SRong-En Fan 		} else {
1714a1a9510SRong-En Fan 		    retain = newmode;
1724a1a9510SRong-En Fan 		}
1734a1a9510SRong-En Fan 	    }
1744a1a9510SRong-En Fan 	}
1754a1a9510SRong-En Fan #else
17606bfebdeSXin LI 	newmode &= ~(SP_PARM->_xmc_suppress);
1770e3d5408SPeter Wemm #endif
1784a1a9510SRong-En Fan 	TR(TRACE_ATTRS, ("suppressed attribute is %s", _traceattr(newmode)));
1794a1a9510SRong-En Fan     }
1800e3d5408SPeter Wemm 
1810e3d5408SPeter Wemm     /*
1820e3d5408SPeter Wemm      * If we have a terminal that cannot combine color with video
1830e3d5408SPeter Wemm      * attributes, use the colors in preference.
1840e3d5408SPeter Wemm      */
18515589c42SPeter Wemm     if (((newmode & A_COLOR) != 0
18615589c42SPeter Wemm 	 || fix_pair0)
1870e3d5408SPeter Wemm 	&& (no_color_video > 0)) {
18818259542SPeter Wemm 	/*
18918259542SPeter Wemm 	 * If we had chosen the A_xxx definitions to correspond to the
19018259542SPeter Wemm 	 * no_color_video mask, we could simply shift it up and mask off the
19118259542SPeter Wemm 	 * attributes.  But we did not (actually copied Solaris' definitions).
19218259542SPeter Wemm 	 * However, this is still simpler/faster than a lookup table.
19318259542SPeter Wemm 	 *
19418259542SPeter Wemm 	 * The 63 corresponds to A_STANDOUT, A_UNDERLINE, A_REVERSE, A_BLINK,
19518259542SPeter Wemm 	 * A_DIM, A_BOLD which are 1:1 with no_color_video.  The bits that
19618259542SPeter Wemm 	 * correspond to A_INVIS, A_PROTECT (192) must be shifted up 1 and
19718259542SPeter Wemm 	 * A_ALTCHARSET (256) down 2 to line up.  We use the NCURSES_BITS
19818259542SPeter Wemm 	 * macro so this will work properly for the wide-character layout.
19918259542SPeter Wemm 	 */
20006bfebdeSXin LI 	unsigned value = (unsigned) no_color_video;
2017a69bbfbSPeter Wemm 	attr_t mask = NCURSES_BITS((value & 63)
2027a69bbfbSPeter Wemm 				   | ((value & 192) << 1)
2037a69bbfbSPeter Wemm 				   | ((value & 256) >> 2), 8);
20415589c42SPeter Wemm 
2057a69bbfbSPeter Wemm 	if ((mask & A_REVERSE) != 0
2067a69bbfbSPeter Wemm 	    && (newmode & A_REVERSE) != 0) {
2070e3d5408SPeter Wemm 	    reverse = TRUE;
20818259542SPeter Wemm 	    mask &= ~A_REVERSE;
2090e3d5408SPeter Wemm 	}
21018259542SPeter Wemm 	newmode &= ~mask;
2110e3d5408SPeter Wemm     }
2120e3d5408SPeter Wemm 
2135ca44d1cSRong-En Fan     if (newmode == PreviousAttr)
2140e3d5408SPeter Wemm 	returnCode(OK);
2150e3d5408SPeter Wemm 
21606bfebdeSXin LI     pair = PairNumber(newmode);
2170e3d5408SPeter Wemm 
2180e3d5408SPeter Wemm     if (reverse) {
2190e3d5408SPeter Wemm 	newmode &= ~A_REVERSE;
2200e3d5408SPeter Wemm     }
2210e3d5408SPeter Wemm 
2225ca44d1cSRong-En Fan     turn_off = (~newmode & PreviousAttr) & ALL_BUT_COLOR;
223*aae38d10SBaptiste Daroussin     turn_on = (newmode & ~(PreviousAttr & TPARM_ATTR)) & ALL_BUT_COLOR;
2240e3d5408SPeter Wemm 
2255ca44d1cSRong-En Fan     SetColorsIf(((pair == 0) && !fix_pair0), PreviousAttr);
2260e3d5408SPeter Wemm 
2270e3d5408SPeter Wemm     if (newmode == A_NORMAL) {
2285ca44d1cSRong-En Fan 	if ((PreviousAttr & A_ALTCHARSET) && exit_alt_charset_mode) {
2290e3d5408SPeter Wemm 	    doPut(exit_alt_charset_mode);
2305ca44d1cSRong-En Fan 	    PreviousAttr &= ~A_ALTCHARSET;
2310e3d5408SPeter Wemm 	}
2325ca44d1cSRong-En Fan 	if (PreviousAttr) {
23318259542SPeter Wemm 	    if (exit_attribute_mode) {
2340e3d5408SPeter Wemm 		doPut(exit_attribute_mode);
23518259542SPeter Wemm 	    } else {
23606bfebdeSXin LI 		if (!SP_PARM || SP_PARM->_use_rmul) {
23718259542SPeter Wemm 		    TurnOff(A_UNDERLINE, exit_underline_mode);
23818259542SPeter Wemm 		}
23906bfebdeSXin LI 		if (!SP_PARM || SP_PARM->_use_rmso) {
24018259542SPeter Wemm 		    TurnOff(A_STANDOUT, exit_standout_mode);
24118259542SPeter Wemm 		}
24273f0a83dSXin LI #if USE_ITALIC
24373f0a83dSXin LI 		if (!SP_PARM || SP_PARM->_use_ritm) {
24473f0a83dSXin LI 		    TurnOff(A_ITALIC, exit_italics_mode);
24573f0a83dSXin LI 		}
24673f0a83dSXin LI #endif
24718259542SPeter Wemm 	    }
2485ca44d1cSRong-En Fan 	    PreviousAttr &= ALL_BUT_COLOR;
2490e3d5408SPeter Wemm 	}
2500e3d5408SPeter Wemm 
2515ca44d1cSRong-En Fan 	SetColorsIf((pair != 0) || fix_pair0, PreviousAttr);
25239f2269fSPeter Wemm     } else if (set_attributes) {
2530e3d5408SPeter Wemm 	if (turn_on || turn_off) {
2540e3d5408SPeter Wemm 	    TPUTS_TRACE("set_attributes");
25506bfebdeSXin LI 	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
25606bfebdeSXin LI 				    tparm(set_attributes,
2570e3d5408SPeter Wemm 					  (newmode & A_STANDOUT) != 0,
2580e3d5408SPeter Wemm 					  (newmode & A_UNDERLINE) != 0,
2590e3d5408SPeter Wemm 					  (newmode & A_REVERSE) != 0,
2600e3d5408SPeter Wemm 					  (newmode & A_BLINK) != 0,
2610e3d5408SPeter Wemm 					  (newmode & A_DIM) != 0,
2620e3d5408SPeter Wemm 					  (newmode & A_BOLD) != 0,
2630e3d5408SPeter Wemm 					  (newmode & A_INVIS) != 0,
2640e3d5408SPeter Wemm 					  (newmode & A_PROTECT) != 0,
26506bfebdeSXin LI 					  (newmode & A_ALTCHARSET) != 0),
26606bfebdeSXin LI 				    1, outc);
2675ca44d1cSRong-En Fan 	    PreviousAttr &= ALL_BUT_COLOR;
2680e3d5408SPeter Wemm 	}
26973f0a83dSXin LI #if USE_ITALIC
27073f0a83dSXin LI 	if (!SP_PARM || SP_PARM->_use_ritm) {
27173f0a83dSXin LI 	    if (turn_on & A_ITALIC) {
27273f0a83dSXin LI 		TurnOn(A_ITALIC, enter_italics_mode);
27373f0a83dSXin LI 	    } else if (turn_off & A_ITALIC) {
27473f0a83dSXin LI 		TurnOff(A_ITALIC, exit_italics_mode);
27573f0a83dSXin LI 	    }
27673f0a83dSXin LI 	}
27773f0a83dSXin LI #endif
2785ca44d1cSRong-En Fan 	SetColorsIf((pair != 0) || fix_pair0, PreviousAttr);
2790e3d5408SPeter Wemm     } else {
2800e3d5408SPeter Wemm 
28118259542SPeter Wemm 	TR(TRACE_ATTRS, ("turning %s off", _traceattr(turn_off)));
2820e3d5408SPeter Wemm 
2830e3d5408SPeter Wemm 	TurnOff(A_ALTCHARSET, exit_alt_charset_mode);
2840e3d5408SPeter Wemm 
28506bfebdeSXin LI 	if (!SP_PARM || SP_PARM->_use_rmul) {
2860e3d5408SPeter Wemm 	    TurnOff(A_UNDERLINE, exit_underline_mode);
2870e3d5408SPeter Wemm 	}
2880e3d5408SPeter Wemm 
28906bfebdeSXin LI 	if (!SP_PARM || SP_PARM->_use_rmso) {
2900e3d5408SPeter Wemm 	    TurnOff(A_STANDOUT, exit_standout_mode);
2910e3d5408SPeter Wemm 	}
29273f0a83dSXin LI #if USE_ITALIC
29373f0a83dSXin LI 	if (!SP_PARM || SP_PARM->_use_ritm) {
29473f0a83dSXin LI 	    TurnOff(A_ITALIC, exit_italics_mode);
29573f0a83dSXin LI 	}
29673f0a83dSXin LI #endif
2970e3d5408SPeter Wemm 	if (turn_off && exit_attribute_mode) {
2980e3d5408SPeter Wemm 	    doPut(exit_attribute_mode);
2994a1a9510SRong-En Fan 	    turn_on |= (newmode & ALL_BUT_COLOR);
3005ca44d1cSRong-En Fan 	    PreviousAttr &= ALL_BUT_COLOR;
3010e3d5408SPeter Wemm 	}
3025ca44d1cSRong-En Fan 	SetColorsIf((pair != 0) || fix_pair0, PreviousAttr);
3030e3d5408SPeter Wemm 
30418259542SPeter Wemm 	TR(TRACE_ATTRS, ("turning %s on", _traceattr(turn_on)));
30515589c42SPeter Wemm 	/* *INDENT-OFF* */
3060e3d5408SPeter Wemm 	TurnOn(A_ALTCHARSET,	enter_alt_charset_mode);
3070e3d5408SPeter Wemm 	TurnOn(A_BLINK,		enter_blink_mode);
3080e3d5408SPeter Wemm 	TurnOn(A_BOLD,		enter_bold_mode);
3090e3d5408SPeter Wemm 	TurnOn(A_DIM,		enter_dim_mode);
3100e3d5408SPeter Wemm 	TurnOn(A_REVERSE,	enter_reverse_mode);
3110e3d5408SPeter Wemm 	TurnOn(A_STANDOUT,	enter_standout_mode);
3120e3d5408SPeter Wemm 	TurnOn(A_PROTECT,	enter_protected_mode);
3130e3d5408SPeter Wemm 	TurnOn(A_INVIS,		enter_secure_mode);
3140e3d5408SPeter Wemm 	TurnOn(A_UNDERLINE,	enter_underline_mode);
31573f0a83dSXin LI #if USE_ITALIC
31673f0a83dSXin LI 	TurnOn(A_ITALIC,	enter_italics_mode);
31773f0a83dSXin LI #endif
318*aae38d10SBaptiste Daroussin #if USE_WIDEC_SUPPORT && defined(enter_horizontal_hl_mode)
3190e3d5408SPeter Wemm 	TurnOn(A_HORIZONTAL,	enter_horizontal_hl_mode);
3200e3d5408SPeter Wemm 	TurnOn(A_LEFT,		enter_left_hl_mode);
3210e3d5408SPeter Wemm 	TurnOn(A_LOW,		enter_low_hl_mode);
3220e3d5408SPeter Wemm 	TurnOn(A_RIGHT,		enter_right_hl_mode);
3230e3d5408SPeter Wemm 	TurnOn(A_TOP,		enter_top_hl_mode);
3240e3d5408SPeter Wemm 	TurnOn(A_VERTICAL,	enter_vertical_hl_mode);
32539f2269fSPeter Wemm #endif
32615589c42SPeter Wemm 	/* *INDENT-ON* */
32715589c42SPeter Wemm 
3280e3d5408SPeter Wemm     }
3290e3d5408SPeter Wemm 
3300e3d5408SPeter Wemm     if (reverse)
3310e3d5408SPeter Wemm 	newmode |= A_REVERSE;
3320e3d5408SPeter Wemm 
33306bfebdeSXin LI     if (SP_PARM)
33406bfebdeSXin LI 	SetAttr(SCREEN_ATTRS(SP_PARM), newmode);
3350e3d5408SPeter Wemm     else
3365ca44d1cSRong-En Fan 	PreviousAttr = newmode;
3370e3d5408SPeter Wemm 
3380e3d5408SPeter Wemm     returnCode(OK);
3390e3d5408SPeter Wemm }
3400e3d5408SPeter Wemm 
34106bfebdeSXin LI #if NCURSES_SP_FUNCS
34206bfebdeSXin LI NCURSES_EXPORT(int)
34306bfebdeSXin LI vidputs(chtype newmode, NCURSES_OUTC outc)
34406bfebdeSXin LI {
34506bfebdeSXin LI     SetSafeOutcWrapper(outc);
34606bfebdeSXin LI     return NCURSES_SP_NAME(vidputs) (CURRENT_SCREEN,
34706bfebdeSXin LI 				     newmode,
34806bfebdeSXin LI 				     _nc_outc_wrapper);
34906bfebdeSXin LI }
35006bfebdeSXin LI #endif
35106bfebdeSXin LI 
35206bfebdeSXin LI NCURSES_EXPORT(int)
35306bfebdeSXin LI NCURSES_SP_NAME(vidattr) (NCURSES_SP_DCLx chtype newmode)
35406bfebdeSXin LI {
35506bfebdeSXin LI     T((T_CALLED("vidattr(%p,%s)"), (void *) SP_PARM, _traceattr(newmode)));
35606bfebdeSXin LI     returnCode(NCURSES_SP_NAME(vidputs) (NCURSES_SP_ARGx
35706bfebdeSXin LI 					 newmode,
35873f0a83dSXin LI 					 NCURSES_SP_NAME(_nc_putchar)));
35906bfebdeSXin LI }
36006bfebdeSXin LI 
36106bfebdeSXin LI #if NCURSES_SP_FUNCS
3627a69bbfbSPeter Wemm NCURSES_EXPORT(int)
36339f2269fSPeter Wemm vidattr(chtype newmode)
3640e3d5408SPeter Wemm {
36506bfebdeSXin LI     return NCURSES_SP_NAME(vidattr) (CURRENT_SCREEN, newmode);
3660e3d5408SPeter Wemm }
36706bfebdeSXin LI #endif
3680e3d5408SPeter Wemm 
3697a69bbfbSPeter Wemm NCURSES_EXPORT(chtype)
37006bfebdeSXin LI NCURSES_SP_NAME(termattrs) (NCURSES_SP_DCL0)
3710e3d5408SPeter Wemm {
3720e3d5408SPeter Wemm     chtype attrs = A_NORMAL;
3730e3d5408SPeter Wemm 
37406bfebdeSXin LI     T((T_CALLED("termattrs(%p)"), (void *) SP_PARM));
37573f0a83dSXin LI 
37673f0a83dSXin LI     if (HasTerminal(SP_PARM)) {
37706bfebdeSXin LI #ifdef USE_TERM_DRIVER
378*aae38d10SBaptiste Daroussin 	attrs = CallDriver(SP_PARM, td_conattr);
37973f0a83dSXin LI #else /* ! USE_TERM_DRIVER */
38006bfebdeSXin LI 
3810e3d5408SPeter Wemm 	if (enter_alt_charset_mode)
3820e3d5408SPeter Wemm 	    attrs |= A_ALTCHARSET;
3830e3d5408SPeter Wemm 
3840e3d5408SPeter Wemm 	if (enter_blink_mode)
3850e3d5408SPeter Wemm 	    attrs |= A_BLINK;
3860e3d5408SPeter Wemm 
3870e3d5408SPeter Wemm 	if (enter_bold_mode)
3880e3d5408SPeter Wemm 	    attrs |= A_BOLD;
3890e3d5408SPeter Wemm 
3900e3d5408SPeter Wemm 	if (enter_dim_mode)
3910e3d5408SPeter Wemm 	    attrs |= A_DIM;
3920e3d5408SPeter Wemm 
3930e3d5408SPeter Wemm 	if (enter_reverse_mode)
3940e3d5408SPeter Wemm 	    attrs |= A_REVERSE;
3950e3d5408SPeter Wemm 
3960e3d5408SPeter Wemm 	if (enter_standout_mode)
3970e3d5408SPeter Wemm 	    attrs |= A_STANDOUT;
3980e3d5408SPeter Wemm 
3990e3d5408SPeter Wemm 	if (enter_protected_mode)
4000e3d5408SPeter Wemm 	    attrs |= A_PROTECT;
4010e3d5408SPeter Wemm 
4020e3d5408SPeter Wemm 	if (enter_secure_mode)
4030e3d5408SPeter Wemm 	    attrs |= A_INVIS;
4040e3d5408SPeter Wemm 
4050e3d5408SPeter Wemm 	if (enter_underline_mode)
4060e3d5408SPeter Wemm 	    attrs |= A_UNDERLINE;
4070e3d5408SPeter Wemm 
40806bfebdeSXin LI 	if (SP_PARM->_coloron)
4090e3d5408SPeter Wemm 	    attrs |= A_COLOR;
4100e3d5408SPeter Wemm 
41173f0a83dSXin LI #if USE_ITALIC
41273f0a83dSXin LI 	if (enter_italics_mode)
41373f0a83dSXin LI 	    attrs |= A_ITALIC;
41406bfebdeSXin LI #endif
41573f0a83dSXin LI 
41673f0a83dSXin LI #endif /* USE_TERM_DRIVER */
41773f0a83dSXin LI     }
41806bfebdeSXin LI     returnChtype(attrs);
4190e3d5408SPeter Wemm }
42006bfebdeSXin LI 
42106bfebdeSXin LI #if NCURSES_SP_FUNCS
42206bfebdeSXin LI NCURSES_EXPORT(chtype)
42306bfebdeSXin LI termattrs(void)
42406bfebdeSXin LI {
42506bfebdeSXin LI     return NCURSES_SP_NAME(termattrs) (CURRENT_SCREEN);
42606bfebdeSXin LI }
42706bfebdeSXin LI #endif
428