xref: /freebsd/contrib/ncurses/ncurses/tty/lib_vidattr.c (revision 21817992b3314c908ab50f0bb88d2ee750b9c4ac)
10e3d5408SPeter Wemm /****************************************************************************
2*21817992SBaptiste Daroussin  * Copyright 2018-2020,2023 Thomas E. Dickey                                *
3e1865124SBaptiste Daroussin  * Copyright 1998-2014,2017 Free Software Foundation, Inc.                  *
40e3d5408SPeter Wemm  *                                                                          *
50e3d5408SPeter Wemm  * Permission is hereby granted, free of charge, to any person obtaining a  *
60e3d5408SPeter Wemm  * copy of this software and associated documentation files (the            *
70e3d5408SPeter Wemm  * "Software"), to deal in the Software without restriction, including      *
80e3d5408SPeter Wemm  * without limitation the rights to use, copy, modify, merge, publish,      *
90e3d5408SPeter Wemm  * distribute, distribute with modifications, sublicense, and/or sell       *
100e3d5408SPeter Wemm  * copies of the Software, and to permit persons to whom the Software is    *
110e3d5408SPeter Wemm  * furnished to do so, subject to the following conditions:                 *
120e3d5408SPeter Wemm  *                                                                          *
130e3d5408SPeter Wemm  * The above copyright notice and this permission notice shall be included  *
140e3d5408SPeter Wemm  * in all copies or substantial portions of the Software.                   *
150e3d5408SPeter Wemm  *                                                                          *
160e3d5408SPeter Wemm  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
170e3d5408SPeter Wemm  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
180e3d5408SPeter Wemm  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
190e3d5408SPeter Wemm  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
200e3d5408SPeter Wemm  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
210e3d5408SPeter Wemm  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
220e3d5408SPeter Wemm  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
230e3d5408SPeter Wemm  *                                                                          *
240e3d5408SPeter Wemm  * Except as contained in this notice, the name(s) of the above copyright   *
250e3d5408SPeter Wemm  * holders shall not be used in advertising or otherwise to promote the     *
260e3d5408SPeter Wemm  * sale, use or other dealings in this Software without prior written       *
270e3d5408SPeter Wemm  * authorization.                                                           *
280e3d5408SPeter Wemm  ****************************************************************************/
290e3d5408SPeter Wemm 
300e3d5408SPeter Wemm /****************************************************************************
310e3d5408SPeter Wemm  *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
320e3d5408SPeter Wemm  *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
3306bfebdeSXin LI  *     and: Thomas E. Dickey                        1996-on                 *
3406bfebdeSXin LI  *     and: Juergen Pfeifer                         2009                    *
350e3d5408SPeter Wemm  ****************************************************************************/
360e3d5408SPeter Wemm 
370e3d5408SPeter Wemm /*
380e3d5408SPeter Wemm  *	vidputs(newmode, outc)
390e3d5408SPeter Wemm  *
400e3d5408SPeter Wemm  *	newmode is taken to be the logical 'or' of the symbols in curses.h
410e3d5408SPeter Wemm  *	representing graphic renditions.  The terminal is set to be in all of
420e3d5408SPeter Wemm  *	the given modes, if possible.
430e3d5408SPeter Wemm  *
440e3d5408SPeter Wemm  *	if the new attribute is normal
450e3d5408SPeter Wemm  *		if exit-alt-char-set exists
460e3d5408SPeter Wemm  *			emit it
470e3d5408SPeter Wemm  *		emit exit-attribute-mode
480e3d5408SPeter Wemm  *	else if set-attributes exists
490e3d5408SPeter Wemm  *		use it to set exactly what you want
500e3d5408SPeter Wemm  *	else
510e3d5408SPeter Wemm  *		if exit-attribute-mode exists
520e3d5408SPeter Wemm  *			turn off everything
530e3d5408SPeter Wemm  *		else
540e3d5408SPeter Wemm  *			turn off those which can be turned off and aren't in
550e3d5408SPeter Wemm  *			newmode.
560e3d5408SPeter Wemm  *		turn on each mode which should be on and isn't, one by one
570e3d5408SPeter Wemm  *
580e3d5408SPeter Wemm  *	NOTE that this algorithm won't achieve the desired mix of attributes
590e3d5408SPeter Wemm  *	in some cases, but those are probably just those cases in which it is
600e3d5408SPeter Wemm  *	actually impossible, anyway, so...
610e3d5408SPeter Wemm  *
620e3d5408SPeter Wemm  * 	NOTE that we cannot assume that there's no interaction between color
630e3d5408SPeter Wemm  *	and other attribute resets.  So each time we reset color (or other
640e3d5408SPeter Wemm  *	attributes) we'll have to be prepared to restore the other.
650e3d5408SPeter Wemm  */
660e3d5408SPeter Wemm 
670e3d5408SPeter Wemm #include <curses.priv.h>
680e3d5408SPeter Wemm 
6906bfebdeSXin LI #ifndef CUR
7006bfebdeSXin LI #define CUR SP_TERMTYPE
7106bfebdeSXin LI #endif
720e3d5408SPeter Wemm 
73*21817992SBaptiste Daroussin MODULE_ID("$Id: lib_vidattr.c,v 1.79 2023/04/28 20:59:26 tom Exp $")
7406bfebdeSXin LI 
7506bfebdeSXin LI #define doPut(mode) \
7606bfebdeSXin LI 	TPUTS_TRACE(#mode); \
7706bfebdeSXin LI 	NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc)
780e3d5408SPeter Wemm 
790e3d5408SPeter Wemm #define TurnOn(mask, mode) \
80aae38d10SBaptiste Daroussin 	if ((turn_on & mask) && mode) { \
81aae38d10SBaptiste Daroussin 	    TPUTS_TRACE(#mode); \
82aae38d10SBaptiste Daroussin 	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc); \
83aae38d10SBaptiste Daroussin 	}
840e3d5408SPeter Wemm 
850e3d5408SPeter Wemm #define TurnOff(mask, mode) \
86aae38d10SBaptiste Daroussin 	if ((turn_off & mask) && mode) { \
87aae38d10SBaptiste Daroussin 	    TPUTS_TRACE(#mode); \
88aae38d10SBaptiste Daroussin 	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc); \
89aae38d10SBaptiste Daroussin 	    turn_off &= ~mask; \
90aae38d10SBaptiste Daroussin 	}
910e3d5408SPeter Wemm 
920e3d5408SPeter Wemm 	/* if there is no current screen, assume we *can* do color */
930e3d5408SPeter Wemm #define SetColorsIf(why, old_attr) \
9415589c42SPeter Wemm 	if (can_color && (why)) { \
9506bfebdeSXin LI 		int old_pair = PairNumber(old_attr); \
9618259542SPeter Wemm 		TR(TRACE_ATTRS, ("old pair = %d -- new pair = %d", old_pair, pair)); \
970e3d5408SPeter Wemm 		if ((pair != old_pair) \
9815589c42SPeter Wemm 		 || (fix_pair0 && (pair == 0)) \
990e3d5408SPeter Wemm 		 || (reverse ^ ((old_attr & A_REVERSE) != 0))) { \
10006bfebdeSXin LI 		     NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_ARGx \
10106bfebdeSXin LI 				     (short) old_pair, \
10206bfebdeSXin LI 				     (short) pair, \
10306bfebdeSXin LI 				     reverse, outc); \
1040e3d5408SPeter Wemm 		} \
1050e3d5408SPeter Wemm 	}
1060e3d5408SPeter Wemm 
1075ca44d1cSRong-En Fan #define PreviousAttr _nc_prescreen.previous_attr
1085ca44d1cSRong-En Fan 
NCURSES_EXPORT(int)1097a69bbfbSPeter Wemm NCURSES_EXPORT(int)
11006bfebdeSXin LI NCURSES_SP_NAME(vidputs) (NCURSES_SP_DCLx
11106bfebdeSXin LI 			  chtype newmode,
11206bfebdeSXin LI 			  NCURSES_SP_OUTC outc)
1130e3d5408SPeter Wemm {
1140e3d5408SPeter Wemm     attr_t turn_on, turn_off;
1150e3d5408SPeter Wemm     int pair;
1160e3d5408SPeter Wemm     bool reverse = FALSE;
11706bfebdeSXin LI     bool can_color = (SP_PARM == 0 || SP_PARM->_coloron);
11818259542SPeter Wemm #if NCURSES_EXT_FUNCS
11906bfebdeSXin LI     bool fix_pair0 = (SP_PARM != 0 && SP_PARM->_coloron && !SP_PARM->_default_color);
12015589c42SPeter Wemm #else
12115589c42SPeter Wemm #define fix_pair0 FALSE
12215589c42SPeter Wemm #endif
1230e3d5408SPeter Wemm 
1245ca44d1cSRong-En Fan     newmode &= A_ATTRIBUTES;
12506bfebdeSXin LI 
12606bfebdeSXin LI     T((T_CALLED("vidputs(%p,%s)"), (void *) SP_PARM, _traceattr(newmode)));
12706bfebdeSXin LI 
128aae38d10SBaptiste Daroussin     if (!IsValidTIScreen(SP_PARM))
12906bfebdeSXin LI 	returnCode(ERR);
1300e3d5408SPeter Wemm 
1310e3d5408SPeter Wemm     /* this allows us to go on whether or not newterm() has been called */
13206bfebdeSXin LI     if (SP_PARM)
13306bfebdeSXin LI 	PreviousAttr = AttrOf(SCREEN_ATTRS(SP_PARM));
1340e3d5408SPeter Wemm 
1355ca44d1cSRong-En Fan     TR(TRACE_ATTRS, ("previous attribute was %s", _traceattr(PreviousAttr)));
1360e3d5408SPeter Wemm 
13706bfebdeSXin LI     if ((SP_PARM != 0)
1384a1a9510SRong-En Fan 	&& (magic_cookie_glitch > 0)) {
1394a1a9510SRong-En Fan #if USE_XMC_SUPPORT
1405ca44d1cSRong-En Fan 	static const chtype table[] =
1414a1a9510SRong-En Fan 	{
1424a1a9510SRong-En Fan 	    A_STANDOUT,
1434a1a9510SRong-En Fan 	    A_UNDERLINE,
1444a1a9510SRong-En Fan 	    A_REVERSE,
1454a1a9510SRong-En Fan 	    A_BLINK,
1464a1a9510SRong-En Fan 	    A_DIM,
1474a1a9510SRong-En Fan 	    A_BOLD,
1484a1a9510SRong-En Fan 	    A_INVIS,
1494a1a9510SRong-En Fan 	    A_PROTECT,
15073f0a83dSXin LI #if USE_ITALIC
15173f0a83dSXin LI 	    A_ITALIC,
15273f0a83dSXin LI #endif
1534a1a9510SRong-En Fan 	};
1544a1a9510SRong-En Fan 	unsigned n;
1554a1a9510SRong-En Fan 	int used = 0;
156e1865124SBaptiste Daroussin #ifdef max_attributes		/* not in U/Win */
1574a1a9510SRong-En Fan 	int limit = (max_attributes <= 0) ? 1 : max_attributes;
158e1865124SBaptiste Daroussin #else
159e1865124SBaptiste Daroussin 	int limit = 1;
160e1865124SBaptiste Daroussin #endif
1614a1a9510SRong-En Fan 	chtype retain = 0;
1624a1a9510SRong-En Fan 
1634a1a9510SRong-En Fan 	/*
1644a1a9510SRong-En Fan 	 * Limit the number of attribute bits set in the newmode according to
1654a1a9510SRong-En Fan 	 * the terminfo max_attributes value.
1664a1a9510SRong-En Fan 	 */
1674a1a9510SRong-En Fan 	for (n = 0; n < SIZEOF(table); ++n) {
16806bfebdeSXin LI 	    if ((table[n] & SP_PARM->_ok_attributes) == 0) {
1694a1a9510SRong-En Fan 		newmode &= ~table[n];
1704a1a9510SRong-En Fan 	    } else if ((table[n] & newmode) != 0) {
1714a1a9510SRong-En Fan 		if (used++ >= limit) {
1724a1a9510SRong-En Fan 		    newmode &= ~table[n];
1734a1a9510SRong-En Fan 		    if (newmode == retain)
1744a1a9510SRong-En Fan 			break;
1754a1a9510SRong-En Fan 		} else {
1764a1a9510SRong-En Fan 		    retain = newmode;
1774a1a9510SRong-En Fan 		}
1784a1a9510SRong-En Fan 	    }
1794a1a9510SRong-En Fan 	}
1804a1a9510SRong-En Fan #else
18106bfebdeSXin LI 	newmode &= ~(SP_PARM->_xmc_suppress);
1820e3d5408SPeter Wemm #endif
1834a1a9510SRong-En Fan 	TR(TRACE_ATTRS, ("suppressed attribute is %s", _traceattr(newmode)));
1844a1a9510SRong-En Fan     }
1850e3d5408SPeter Wemm 
1860e3d5408SPeter Wemm     /*
1870e3d5408SPeter Wemm      * If we have a terminal that cannot combine color with video
1880e3d5408SPeter Wemm      * attributes, use the colors in preference.
1890e3d5408SPeter Wemm      */
19015589c42SPeter Wemm     if (((newmode & A_COLOR) != 0
19115589c42SPeter Wemm 	 || fix_pair0)
1920e3d5408SPeter Wemm 	&& (no_color_video > 0)) {
19318259542SPeter Wemm 	/*
19418259542SPeter Wemm 	 * If we had chosen the A_xxx definitions to correspond to the
19518259542SPeter Wemm 	 * no_color_video mask, we could simply shift it up and mask off the
19618259542SPeter Wemm 	 * attributes.  But we did not (actually copied Solaris' definitions).
19718259542SPeter Wemm 	 * However, this is still simpler/faster than a lookup table.
19818259542SPeter Wemm 	 *
19918259542SPeter Wemm 	 * The 63 corresponds to A_STANDOUT, A_UNDERLINE, A_REVERSE, A_BLINK,
20018259542SPeter Wemm 	 * A_DIM, A_BOLD which are 1:1 with no_color_video.  The bits that
20118259542SPeter Wemm 	 * correspond to A_INVIS, A_PROTECT (192) must be shifted up 1 and
20218259542SPeter Wemm 	 * A_ALTCHARSET (256) down 2 to line up.  We use the NCURSES_BITS
20318259542SPeter Wemm 	 * macro so this will work properly for the wide-character layout.
20418259542SPeter Wemm 	 */
20506bfebdeSXin LI 	unsigned value = (unsigned) no_color_video;
2067a69bbfbSPeter Wemm 	attr_t mask = NCURSES_BITS((value & 63)
2077a69bbfbSPeter Wemm 				   | ((value & 192) << 1)
2087a69bbfbSPeter Wemm 				   | ((value & 256) >> 2), 8);
20915589c42SPeter Wemm 
2107a69bbfbSPeter Wemm 	if ((mask & A_REVERSE) != 0
2117a69bbfbSPeter Wemm 	    && (newmode & A_REVERSE) != 0) {
2120e3d5408SPeter Wemm 	    reverse = TRUE;
21318259542SPeter Wemm 	    mask &= ~A_REVERSE;
2140e3d5408SPeter Wemm 	}
21518259542SPeter Wemm 	newmode &= ~mask;
2160e3d5408SPeter Wemm     }
2170e3d5408SPeter Wemm 
2185ca44d1cSRong-En Fan     if (newmode == PreviousAttr)
2190e3d5408SPeter Wemm 	returnCode(OK);
2200e3d5408SPeter Wemm 
22106bfebdeSXin LI     pair = PairNumber(newmode);
2220e3d5408SPeter Wemm 
2230e3d5408SPeter Wemm     if (reverse) {
2240e3d5408SPeter Wemm 	newmode &= ~A_REVERSE;
2250e3d5408SPeter Wemm     }
2260e3d5408SPeter Wemm 
2275ca44d1cSRong-En Fan     turn_off = (~newmode & PreviousAttr) & ALL_BUT_COLOR;
228aae38d10SBaptiste Daroussin     turn_on = (newmode & ~(PreviousAttr & TPARM_ATTR)) & ALL_BUT_COLOR;
2290e3d5408SPeter Wemm 
2305ca44d1cSRong-En Fan     SetColorsIf(((pair == 0) && !fix_pair0), PreviousAttr);
2310e3d5408SPeter Wemm 
2320e3d5408SPeter Wemm     if (newmode == A_NORMAL) {
2335ca44d1cSRong-En Fan 	if ((PreviousAttr & A_ALTCHARSET) && exit_alt_charset_mode) {
2340e3d5408SPeter Wemm 	    doPut(exit_alt_charset_mode);
2355ca44d1cSRong-En Fan 	    PreviousAttr &= ~A_ALTCHARSET;
2360e3d5408SPeter Wemm 	}
2375ca44d1cSRong-En Fan 	if (PreviousAttr) {
23818259542SPeter Wemm 	    if (exit_attribute_mode) {
2390e3d5408SPeter Wemm 		doPut(exit_attribute_mode);
24018259542SPeter Wemm 	    } else {
24106bfebdeSXin LI 		if (!SP_PARM || SP_PARM->_use_rmul) {
24218259542SPeter Wemm 		    TurnOff(A_UNDERLINE, exit_underline_mode);
24318259542SPeter Wemm 		}
24406bfebdeSXin LI 		if (!SP_PARM || SP_PARM->_use_rmso) {
24518259542SPeter Wemm 		    TurnOff(A_STANDOUT, exit_standout_mode);
24618259542SPeter Wemm 		}
24773f0a83dSXin LI #if USE_ITALIC
24873f0a83dSXin LI 		if (!SP_PARM || SP_PARM->_use_ritm) {
24973f0a83dSXin LI 		    TurnOff(A_ITALIC, exit_italics_mode);
25073f0a83dSXin LI 		}
25173f0a83dSXin LI #endif
252*21817992SBaptiste Daroussin 		(void) turn_off;
25318259542SPeter Wemm 	    }
2545ca44d1cSRong-En Fan 	    PreviousAttr &= ALL_BUT_COLOR;
2550e3d5408SPeter Wemm 	}
2560e3d5408SPeter Wemm 
2575ca44d1cSRong-En Fan 	SetColorsIf((pair != 0) || fix_pair0, PreviousAttr);
25839f2269fSPeter Wemm     } else if (set_attributes) {
2590e3d5408SPeter Wemm 	if (turn_on || turn_off) {
2600e3d5408SPeter Wemm 	    TPUTS_TRACE("set_attributes");
26106bfebdeSXin LI 	    NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
2627a656419SBaptiste Daroussin 				    TIPARM_9(set_attributes,
2630e3d5408SPeter Wemm 					     (newmode & A_STANDOUT) != 0,
2640e3d5408SPeter Wemm 					     (newmode & A_UNDERLINE) != 0,
2650e3d5408SPeter Wemm 					     (newmode & A_REVERSE) != 0,
2660e3d5408SPeter Wemm 					     (newmode & A_BLINK) != 0,
2670e3d5408SPeter Wemm 					     (newmode & A_DIM) != 0,
2680e3d5408SPeter Wemm 					     (newmode & A_BOLD) != 0,
2690e3d5408SPeter Wemm 					     (newmode & A_INVIS) != 0,
2700e3d5408SPeter Wemm 					     (newmode & A_PROTECT) != 0,
27106bfebdeSXin LI 					     (newmode & A_ALTCHARSET) != 0),
27206bfebdeSXin LI 				    1, outc);
2735ca44d1cSRong-En Fan 	    PreviousAttr &= ALL_BUT_COLOR;
2740e3d5408SPeter Wemm 	}
27573f0a83dSXin LI #if USE_ITALIC
27673f0a83dSXin LI 	if (!SP_PARM || SP_PARM->_use_ritm) {
27773f0a83dSXin LI 	    if (turn_on & A_ITALIC) {
27873f0a83dSXin LI 		TurnOn(A_ITALIC, enter_italics_mode);
27973f0a83dSXin LI 	    } else if (turn_off & A_ITALIC) {
28073f0a83dSXin LI 		TurnOff(A_ITALIC, exit_italics_mode);
28173f0a83dSXin LI 	    }
282*21817992SBaptiste Daroussin 	    (void) turn_off;
28373f0a83dSXin LI 	}
28473f0a83dSXin LI #endif
2855ca44d1cSRong-En Fan 	SetColorsIf((pair != 0) || fix_pair0, PreviousAttr);
2860e3d5408SPeter Wemm     } else {
2870e3d5408SPeter Wemm 
28818259542SPeter Wemm 	TR(TRACE_ATTRS, ("turning %s off", _traceattr(turn_off)));
2890e3d5408SPeter Wemm 
2900e3d5408SPeter Wemm 	TurnOff(A_ALTCHARSET, exit_alt_charset_mode);
2910e3d5408SPeter Wemm 
29206bfebdeSXin LI 	if (!SP_PARM || SP_PARM->_use_rmul) {
2930e3d5408SPeter Wemm 	    TurnOff(A_UNDERLINE, exit_underline_mode);
2940e3d5408SPeter Wemm 	}
2950e3d5408SPeter Wemm 
29606bfebdeSXin LI 	if (!SP_PARM || SP_PARM->_use_rmso) {
2970e3d5408SPeter Wemm 	    TurnOff(A_STANDOUT, exit_standout_mode);
2980e3d5408SPeter Wemm 	}
29973f0a83dSXin LI #if USE_ITALIC
30073f0a83dSXin LI 	if (!SP_PARM || SP_PARM->_use_ritm) {
30173f0a83dSXin LI 	    TurnOff(A_ITALIC, exit_italics_mode);
30273f0a83dSXin LI 	}
30373f0a83dSXin LI #endif
3040e3d5408SPeter Wemm 	if (turn_off && exit_attribute_mode) {
3050e3d5408SPeter Wemm 	    doPut(exit_attribute_mode);
3064a1a9510SRong-En Fan 	    turn_on |= (newmode & ALL_BUT_COLOR);
3075ca44d1cSRong-En Fan 	    PreviousAttr &= ALL_BUT_COLOR;
3080e3d5408SPeter Wemm 	}
3095ca44d1cSRong-En Fan 	SetColorsIf((pair != 0) || fix_pair0, PreviousAttr);
3100e3d5408SPeter Wemm 
31118259542SPeter Wemm 	TR(TRACE_ATTRS, ("turning %s on", _traceattr(turn_on)));
31215589c42SPeter Wemm 	/* *INDENT-OFF* */
3130e3d5408SPeter Wemm 	TurnOn(A_ALTCHARSET,	enter_alt_charset_mode);
3140e3d5408SPeter Wemm 	TurnOn(A_BLINK,		enter_blink_mode);
3150e3d5408SPeter Wemm 	TurnOn(A_BOLD,		enter_bold_mode);
3160e3d5408SPeter Wemm 	TurnOn(A_DIM,		enter_dim_mode);
3170e3d5408SPeter Wemm 	TurnOn(A_REVERSE,	enter_reverse_mode);
3180e3d5408SPeter Wemm 	TurnOn(A_STANDOUT,	enter_standout_mode);
3190e3d5408SPeter Wemm 	TurnOn(A_PROTECT,	enter_protected_mode);
3200e3d5408SPeter Wemm 	TurnOn(A_INVIS,		enter_secure_mode);
3210e3d5408SPeter Wemm 	TurnOn(A_UNDERLINE,	enter_underline_mode);
32273f0a83dSXin LI #if USE_ITALIC
32373f0a83dSXin LI 	TurnOn(A_ITALIC,	enter_italics_mode);
32473f0a83dSXin LI #endif
325aae38d10SBaptiste Daroussin #if USE_WIDEC_SUPPORT && defined(enter_horizontal_hl_mode)
3260e3d5408SPeter Wemm 	TurnOn(A_HORIZONTAL,	enter_horizontal_hl_mode);
3270e3d5408SPeter Wemm 	TurnOn(A_LEFT,		enter_left_hl_mode);
3280e3d5408SPeter Wemm 	TurnOn(A_LOW,		enter_low_hl_mode);
3290e3d5408SPeter Wemm 	TurnOn(A_RIGHT,		enter_right_hl_mode);
3300e3d5408SPeter Wemm 	TurnOn(A_TOP,		enter_top_hl_mode);
3310e3d5408SPeter Wemm 	TurnOn(A_VERTICAL,	enter_vertical_hl_mode);
33239f2269fSPeter Wemm #endif
33315589c42SPeter Wemm 	/* *INDENT-ON* */
3340e3d5408SPeter Wemm     }
3350e3d5408SPeter Wemm 
3360e3d5408SPeter Wemm     if (reverse)
3370e3d5408SPeter Wemm 	newmode |= A_REVERSE;
3380e3d5408SPeter Wemm 
33906bfebdeSXin LI     if (SP_PARM)
34006bfebdeSXin LI 	SetAttr(SCREEN_ATTRS(SP_PARM), newmode);
3410e3d5408SPeter Wemm     else
3425ca44d1cSRong-En Fan 	PreviousAttr = newmode;
3430e3d5408SPeter Wemm 
3440e3d5408SPeter Wemm     returnCode(OK);
3450e3d5408SPeter Wemm }
3460e3d5408SPeter Wemm 
34706bfebdeSXin LI #if NCURSES_SP_FUNCS
34806bfebdeSXin LI NCURSES_EXPORT(int)
vidputs(chtype newmode,NCURSES_OUTC outc)34906bfebdeSXin LI vidputs(chtype newmode, NCURSES_OUTC outc)
35006bfebdeSXin LI {
35106bfebdeSXin LI     SetSafeOutcWrapper(outc);
35206bfebdeSXin LI     return NCURSES_SP_NAME(vidputs) (CURRENT_SCREEN,
35306bfebdeSXin LI 				     newmode,
35406bfebdeSXin LI 				     _nc_outc_wrapper);
35506bfebdeSXin LI }
35606bfebdeSXin LI #endif
35706bfebdeSXin LI 
35806bfebdeSXin LI NCURSES_EXPORT(int)
NCURSES_SP_NAME(vidattr)35906bfebdeSXin LI NCURSES_SP_NAME(vidattr) (NCURSES_SP_DCLx chtype newmode)
36006bfebdeSXin LI {
36106bfebdeSXin LI     T((T_CALLED("vidattr(%p,%s)"), (void *) SP_PARM, _traceattr(newmode)));
36206bfebdeSXin LI     returnCode(NCURSES_SP_NAME(vidputs) (NCURSES_SP_ARGx
36306bfebdeSXin LI 					 newmode,
36473f0a83dSXin LI 					 NCURSES_SP_NAME(_nc_putchar)));
36506bfebdeSXin LI }
36606bfebdeSXin LI 
36706bfebdeSXin LI #if NCURSES_SP_FUNCS
3687a69bbfbSPeter Wemm NCURSES_EXPORT(int)
vidattr(chtype newmode)36939f2269fSPeter Wemm vidattr(chtype newmode)
3700e3d5408SPeter Wemm {
37106bfebdeSXin LI     return NCURSES_SP_NAME(vidattr) (CURRENT_SCREEN, newmode);
3720e3d5408SPeter Wemm }
37306bfebdeSXin LI #endif
3740e3d5408SPeter Wemm 
3757a69bbfbSPeter Wemm NCURSES_EXPORT(chtype)
NCURSES_SP_NAME(termattrs)37606bfebdeSXin LI NCURSES_SP_NAME(termattrs) (NCURSES_SP_DCL0)
3770e3d5408SPeter Wemm {
3780e3d5408SPeter Wemm     chtype attrs = A_NORMAL;
3790e3d5408SPeter Wemm 
38006bfebdeSXin LI     T((T_CALLED("termattrs(%p)"), (void *) SP_PARM));
38173f0a83dSXin LI 
38273f0a83dSXin LI     if (HasTerminal(SP_PARM)) {
38306bfebdeSXin LI #ifdef USE_TERM_DRIVER
384aae38d10SBaptiste Daroussin 	attrs = CallDriver(SP_PARM, td_conattr);
38573f0a83dSXin LI #else /* ! USE_TERM_DRIVER */
38606bfebdeSXin LI 
3870e3d5408SPeter Wemm 	if (enter_alt_charset_mode)
3880e3d5408SPeter Wemm 	    attrs |= A_ALTCHARSET;
3890e3d5408SPeter Wemm 
3900e3d5408SPeter Wemm 	if (enter_blink_mode)
3910e3d5408SPeter Wemm 	    attrs |= A_BLINK;
3920e3d5408SPeter Wemm 
3930e3d5408SPeter Wemm 	if (enter_bold_mode)
3940e3d5408SPeter Wemm 	    attrs |= A_BOLD;
3950e3d5408SPeter Wemm 
3960e3d5408SPeter Wemm 	if (enter_dim_mode)
3970e3d5408SPeter Wemm 	    attrs |= A_DIM;
3980e3d5408SPeter Wemm 
3990e3d5408SPeter Wemm 	if (enter_reverse_mode)
4000e3d5408SPeter Wemm 	    attrs |= A_REVERSE;
4010e3d5408SPeter Wemm 
4020e3d5408SPeter Wemm 	if (enter_standout_mode)
4030e3d5408SPeter Wemm 	    attrs |= A_STANDOUT;
4040e3d5408SPeter Wemm 
4050e3d5408SPeter Wemm 	if (enter_protected_mode)
4060e3d5408SPeter Wemm 	    attrs |= A_PROTECT;
4070e3d5408SPeter Wemm 
4080e3d5408SPeter Wemm 	if (enter_secure_mode)
4090e3d5408SPeter Wemm 	    attrs |= A_INVIS;
4100e3d5408SPeter Wemm 
4110e3d5408SPeter Wemm 	if (enter_underline_mode)
4120e3d5408SPeter Wemm 	    attrs |= A_UNDERLINE;
4130e3d5408SPeter Wemm 
41406bfebdeSXin LI 	if (SP_PARM->_coloron)
4150e3d5408SPeter Wemm 	    attrs |= A_COLOR;
4160e3d5408SPeter Wemm 
41773f0a83dSXin LI #if USE_ITALIC
41873f0a83dSXin LI 	if (enter_italics_mode)
41973f0a83dSXin LI 	    attrs |= A_ITALIC;
42006bfebdeSXin LI #endif
42173f0a83dSXin LI 
42273f0a83dSXin LI #endif /* USE_TERM_DRIVER */
42373f0a83dSXin LI     }
42406bfebdeSXin LI     returnChtype(attrs);
4250e3d5408SPeter Wemm }
42606bfebdeSXin LI 
42706bfebdeSXin LI #if NCURSES_SP_FUNCS
42806bfebdeSXin LI NCURSES_EXPORT(chtype)
termattrs(void)42906bfebdeSXin LI termattrs(void)
43006bfebdeSXin LI {
43106bfebdeSXin LI     return NCURSES_SP_NAME(termattrs) (CURRENT_SCREEN);
43206bfebdeSXin LI }
43306bfebdeSXin LI #endif
434