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