X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftty%2Flib_vidattr.c;h=184d9b976d5492f65789b2af606d8a3e5ad41203;hp=20cc2b138011c528a4f162aadee7ecfedb58d239;hb=3eda6f30a84d53844d2ebceadb457e2e7e9cfbf3;hpb=0eb88fc5281804773e2a0c7a488a4452463535ce diff --git a/ncurses/tty/lib_vidattr.c b/ncurses/tty/lib_vidattr.c index 20cc2b13..184d9b97 100644 --- a/ncurses/tty/lib_vidattr.c +++ b/ncurses/tty/lib_vidattr.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998 Free Software Foundation, Inc. * + * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -29,6 +29,8 @@ /**************************************************************************** * Author: Zeyd M. Ben-Halim 1992,1995 * * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * ****************************************************************************/ /* @@ -62,217 +64,357 @@ */ #include -#include -MODULE_ID("$Id: lib_vidattr.c,v 1.23 1999/06/12 21:20:41 tom Exp $") +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_vidattr.c,v 1.71 2014/09/04 22:01:27 tom Exp $") -#define doPut(mode) TPUTS_TRACE(#mode); tputs(mode, 1, outc) +#define doPut(mode) \ + TPUTS_TRACE(#mode); \ + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc) -#define TurnOn(mask,mode) \ +#define TurnOn(mask, mode) \ if ((turn_on & mask) && mode) { doPut(mode); } -#define TurnOff(mask,mode) \ +#define TurnOff(mask, mode) \ if ((turn_off & mask) && mode) { doPut(mode); turn_off &= ~mask; } /* if there is no current screen, assume we *can* do color */ -#define SetColorsIf(why,old_attr) \ - if ((!SP || SP->_coloron) && (why)) { \ - int old_pair = PAIR_NUMBER(old_attr); \ - T(("old pair = %d -- new pair = %d", old_pair, pair)); \ +#define SetColorsIf(why, old_attr) \ + if (can_color && (why)) { \ + int old_pair = PairNumber(old_attr); \ + TR(TRACE_ATTRS, ("old pair = %d -- new pair = %d", old_pair, pair)); \ if ((pair != old_pair) \ + || (fix_pair0 && (pair == 0)) \ || (reverse ^ ((old_attr & A_REVERSE) != 0))) { \ - _nc_do_color(pair, reverse, outc); \ + NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_ARGx \ + (short) old_pair, \ + (short) pair, \ + reverse, outc); \ } \ } -int vidputs(attr_t newmode, int (*outc)(int)) -{ -static attr_t previous_attr = A_NORMAL; -attr_t turn_on, turn_off; -int pair; -bool reverse = FALSE; -bool used_ncv = FALSE; - - T((T_CALLED("vidputs(%s)"), _traceattr(newmode))); - - /* this allows us to go on whether or not newterm() has been called */ - if (SP) - previous_attr = SP->_current_attr; +#define PreviousAttr _nc_prescreen.previous_attr - T(("previous attribute was %s", _traceattr(previous_attr))); +NCURSES_EXPORT(int) +NCURSES_SP_NAME(vidputs) (NCURSES_SP_DCLx + chtype newmode, + NCURSES_SP_OUTC outc) +{ + attr_t turn_on, turn_off; + int pair; + bool reverse = FALSE; + bool can_color = (SP_PARM == 0 || SP_PARM->_coloron); +#if NCURSES_EXT_FUNCS + bool fix_pair0 = (SP_PARM != 0 && SP_PARM->_coloron && !SP_PARM->_default_color); +#else +#define fix_pair0 FALSE +#endif -#if !USE_XMC_SUPPORT - if ((SP != 0) - && (magic_cookie_glitch > 0)) - newmode &= ~(SP->_xmc_suppress); + newmode &= A_ATTRIBUTES; + + T((T_CALLED("vidputs(%p,%s)"), (void *) SP_PARM, _traceattr(newmode))); + + if (!IsTermInfo(SP_PARM)) + returnCode(ERR); + + /* this allows us to go on whether or not newterm() has been called */ + if (SP_PARM) + PreviousAttr = AttrOf(SCREEN_ATTRS(SP_PARM)); + + TR(TRACE_ATTRS, ("previous attribute was %s", _traceattr(PreviousAttr))); + + if ((SP_PARM != 0) + && (magic_cookie_glitch > 0)) { +#if USE_XMC_SUPPORT + static const chtype table[] = + { + A_STANDOUT, + A_UNDERLINE, + A_REVERSE, + A_BLINK, + A_DIM, + A_BOLD, + A_INVIS, + A_PROTECT, +#if USE_ITALIC + A_ITALIC, #endif + }; + unsigned n; + int used = 0; + int limit = (max_attributes <= 0) ? 1 : max_attributes; + chtype retain = 0; /* - * If we have a terminal that cannot combine color with video - * attributes, use the colors in preference. + * Limit the number of attribute bits set in the newmode according to + * the terminfo max_attributes value. */ - if ((newmode & A_COLOR) - && (no_color_video > 0)) { - static const struct { - attr_t video; - unsigned bit; - } table[] = { - { A_STANDOUT, 1 }, - { A_UNDERLINE, 2 }, - { A_REVERSE, 4 }, - { A_BLINK, 8 }, - { A_DIM, 16 }, - { A_BOLD, 32 }, - { A_INVIS, 64 }, - { A_PROTECT, 128 }, - { A_ALTCHARSET, 256 }, - }; - size_t n; - for (n = 0; n < SIZEOF(table); n++) { - if ((table[n].bit & no_color_video) - && (table[n].video & newmode)) { - used_ncv = TRUE; - if (table[n].video == A_REVERSE) - reverse = TRUE; - else - newmode &= ~table[n].video; - } + for (n = 0; n < SIZEOF(table); ++n) { + if ((table[n] & SP_PARM->_ok_attributes) == 0) { + newmode &= ~table[n]; + } else if ((table[n] & newmode) != 0) { + if (used++ >= limit) { + newmode &= ~table[n]; + if (newmode == retain) + break; + } else { + retain = newmode; } + } + } +#else + newmode &= ~(SP_PARM->_xmc_suppress); +#endif + TR(TRACE_ATTRS, ("suppressed attribute is %s", _traceattr(newmode))); + } + + /* + * If we have a terminal that cannot combine color with video + * attributes, use the colors in preference. + */ + if (((newmode & A_COLOR) != 0 + || fix_pair0) + && (no_color_video > 0)) { + /* + * If we had chosen the A_xxx definitions to correspond to the + * no_color_video mask, we could simply shift it up and mask off the + * attributes. But we did not (actually copied Solaris' definitions). + * However, this is still simpler/faster than a lookup table. + * + * The 63 corresponds to A_STANDOUT, A_UNDERLINE, A_REVERSE, A_BLINK, + * A_DIM, A_BOLD which are 1:1 with no_color_video. The bits that + * correspond to A_INVIS, A_PROTECT (192) must be shifted up 1 and + * A_ALTCHARSET (256) down 2 to line up. We use the NCURSES_BITS + * macro so this will work properly for the wide-character layout. + */ + unsigned value = (unsigned) no_color_video; + attr_t mask = NCURSES_BITS((value & 63) + | ((value & 192) << 1) + | ((value & 256) >> 2), 8); + + if ((mask & A_REVERSE) != 0 + && (newmode & A_REVERSE) != 0) { + reverse = TRUE; + mask &= ~A_REVERSE; } + newmode &= ~mask; + } - if (newmode == previous_attr) - returnCode(OK); + if (newmode == PreviousAttr) + returnCode(OK); - pair = PAIR_NUMBER(newmode); + pair = PairNumber(newmode); - if (reverse) { - newmode &= ~A_REVERSE; - } + if (reverse) { + newmode &= ~A_REVERSE; + } - turn_off = (~newmode & previous_attr) & ALL_BUT_COLOR; - turn_on = (newmode & ~previous_attr) & ALL_BUT_COLOR; + turn_off = (~newmode & PreviousAttr) & ALL_BUT_COLOR; + turn_on = (newmode & ~(PreviousAttr & TPARM_ATTR)) & ALL_BUT_COLOR; - SetColorsIf(pair == 0, previous_attr); + SetColorsIf(((pair == 0) && !fix_pair0), PreviousAttr); - if (newmode == A_NORMAL) { - if((previous_attr & A_ALTCHARSET) && exit_alt_charset_mode) { - doPut(exit_alt_charset_mode); - previous_attr &= ~A_ALTCHARSET; + if (newmode == A_NORMAL) { + if ((PreviousAttr & A_ALTCHARSET) && exit_alt_charset_mode) { + doPut(exit_alt_charset_mode); + PreviousAttr &= ~A_ALTCHARSET; + } + if (PreviousAttr) { + if (exit_attribute_mode) { + doPut(exit_attribute_mode); + } else { + if (!SP_PARM || SP_PARM->_use_rmul) { + TurnOff(A_UNDERLINE, exit_underline_mode); } - if (previous_attr) { - doPut(exit_attribute_mode); - previous_attr &= ~A_COLOR; + if (!SP_PARM || SP_PARM->_use_rmso) { + TurnOff(A_STANDOUT, exit_standout_mode); } - - SetColorsIf(pair != 0, previous_attr); - } else if (set_attributes && !used_ncv) { - if (turn_on || turn_off) { - TPUTS_TRACE("set_attributes"); - tputs(tparm(set_attributes, - (newmode & A_STANDOUT) != 0, - (newmode & A_UNDERLINE) != 0, - (newmode & A_REVERSE) != 0, - (newmode & A_BLINK) != 0, - (newmode & A_DIM) != 0, - (newmode & A_BOLD) != 0, - (newmode & A_INVIS) != 0, - (newmode & A_PROTECT) != 0, - (newmode & A_ALTCHARSET) != 0), 1, outc); - previous_attr &= ~A_COLOR; +#if USE_ITALIC + if (!SP_PARM || SP_PARM->_use_ritm) { + TurnOff(A_ITALIC, exit_italics_mode); } - SetColorsIf(pair != 0, previous_attr); - } else { +#endif + } + PreviousAttr &= ALL_BUT_COLOR; + } - T(("turning %s off", _traceattr(turn_off))); + SetColorsIf((pair != 0) || fix_pair0, PreviousAttr); + } else if (set_attributes) { + if (turn_on || turn_off) { + TPUTS_TRACE("set_attributes"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + tparm(set_attributes, + (newmode & A_STANDOUT) != 0, + (newmode & A_UNDERLINE) != 0, + (newmode & A_REVERSE) != 0, + (newmode & A_BLINK) != 0, + (newmode & A_DIM) != 0, + (newmode & A_BOLD) != 0, + (newmode & A_INVIS) != 0, + (newmode & A_PROTECT) != 0, + (newmode & A_ALTCHARSET) != 0), + 1, outc); + PreviousAttr &= ALL_BUT_COLOR; + } +#if USE_ITALIC + if (!SP_PARM || SP_PARM->_use_ritm) { + if (turn_on & A_ITALIC) { + TurnOn(A_ITALIC, enter_italics_mode); + } else if (turn_off & A_ITALIC) { + TurnOff(A_ITALIC, exit_italics_mode); + } + } +#endif + SetColorsIf((pair != 0) || fix_pair0, PreviousAttr); + } else { - TurnOff(A_ALTCHARSET, exit_alt_charset_mode); + TR(TRACE_ATTRS, ("turning %s off", _traceattr(turn_off))); - if (!SP || SP->_use_rmul) { - TurnOff(A_UNDERLINE, exit_underline_mode); - } + TurnOff(A_ALTCHARSET, exit_alt_charset_mode); - if (!SP || SP->_use_rmso) { - TurnOff(A_STANDOUT, exit_standout_mode); - } + if (!SP_PARM || SP_PARM->_use_rmul) { + TurnOff(A_UNDERLINE, exit_underline_mode); + } - if (turn_off && exit_attribute_mode) { - doPut(exit_attribute_mode); - turn_on |= (newmode & (chtype)(~A_COLOR)); - previous_attr &= ~A_COLOR; - } - SetColorsIf(pair != 0, previous_attr); - - T(("turning %s on", _traceattr(turn_on))); - - TurnOn (A_ALTCHARSET, enter_alt_charset_mode); - TurnOn (A_BLINK, enter_blink_mode); - TurnOn (A_BOLD, enter_bold_mode); - TurnOn (A_DIM, enter_dim_mode); - TurnOn (A_REVERSE, enter_reverse_mode); - TurnOn (A_STANDOUT, enter_standout_mode); - TurnOn (A_PROTECT, enter_protected_mode); - TurnOn (A_INVIS, enter_secure_mode); - TurnOn (A_UNDERLINE, enter_underline_mode); - TurnOn (A_HORIZONTAL, enter_horizontal_hl_mode); - TurnOn (A_LEFT, enter_left_hl_mode); - TurnOn (A_LOW, enter_low_hl_mode); - TurnOn (A_RIGHT, enter_right_hl_mode); - TurnOn (A_TOP, enter_top_hl_mode); - TurnOn (A_VERTICAL, enter_vertical_hl_mode); + if (!SP_PARM || SP_PARM->_use_rmso) { + TurnOff(A_STANDOUT, exit_standout_mode); + } +#if USE_ITALIC + if (!SP_PARM || SP_PARM->_use_ritm) { + TurnOff(A_ITALIC, exit_italics_mode); + } +#endif + if (turn_off && exit_attribute_mode) { + doPut(exit_attribute_mode); + turn_on |= (newmode & ALL_BUT_COLOR); + PreviousAttr &= ALL_BUT_COLOR; } + SetColorsIf((pair != 0) || fix_pair0, PreviousAttr); + + TR(TRACE_ATTRS, ("turning %s on", _traceattr(turn_on))); + /* *INDENT-OFF* */ + TurnOn(A_ALTCHARSET, enter_alt_charset_mode); + TurnOn(A_BLINK, enter_blink_mode); + TurnOn(A_BOLD, enter_bold_mode); + TurnOn(A_DIM, enter_dim_mode); + TurnOn(A_REVERSE, enter_reverse_mode); + TurnOn(A_STANDOUT, enter_standout_mode); + TurnOn(A_PROTECT, enter_protected_mode); + TurnOn(A_INVIS, enter_secure_mode); + TurnOn(A_UNDERLINE, enter_underline_mode); +#if USE_ITALIC + TurnOn(A_ITALIC, enter_italics_mode); +#endif +#if USE_WIDEC_SUPPORT + TurnOn(A_HORIZONTAL, enter_horizontal_hl_mode); + TurnOn(A_LEFT, enter_left_hl_mode); + TurnOn(A_LOW, enter_low_hl_mode); + TurnOn(A_RIGHT, enter_right_hl_mode); + TurnOn(A_TOP, enter_top_hl_mode); + TurnOn(A_VERTICAL, enter_vertical_hl_mode); +#endif + /* *INDENT-ON* */ - if (reverse) - newmode |= A_REVERSE; + } - if (SP) - SP->_current_attr = newmode; - else - previous_attr = newmode; + if (reverse) + newmode |= A_REVERSE; - returnCode(OK); + if (SP_PARM) + SetAttr(SCREEN_ATTRS(SP_PARM), newmode); + else + PreviousAttr = newmode; + + returnCode(OK); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +vidputs(chtype newmode, NCURSES_OUTC outc) +{ + SetSafeOutcWrapper(outc); + return NCURSES_SP_NAME(vidputs) (CURRENT_SCREEN, + newmode, + _nc_outc_wrapper); } +#endif -int vidattr(attr_t newmode) +NCURSES_EXPORT(int) +NCURSES_SP_NAME(vidattr) (NCURSES_SP_DCLx chtype newmode) { - T((T_CALLED("vidattr(%s)"), _traceattr(newmode))); + T((T_CALLED("vidattr(%p,%s)"), (void *) SP_PARM, _traceattr(newmode))); + returnCode(NCURSES_SP_NAME(vidputs) (NCURSES_SP_ARGx + newmode, + NCURSES_SP_NAME(_nc_putchar))); +} - returnCode(vidputs(newmode, _nc_outch)); +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +vidattr(chtype newmode) +{ + return NCURSES_SP_NAME(vidattr) (CURRENT_SCREEN, newmode); } +#endif -chtype termattrs(void) +NCURSES_EXPORT(chtype) +NCURSES_SP_NAME(termattrs) (NCURSES_SP_DCL0) { - chtype attrs = A_NORMAL; + chtype attrs = A_NORMAL; + + T((T_CALLED("termattrs(%p)"), (void *) SP_PARM)); + + if (HasTerminal(SP_PARM)) { +#ifdef USE_TERM_DRIVER + attrs = CallDriver(SP_PARM, td_conattr); +#else /* ! USE_TERM_DRIVER */ if (enter_alt_charset_mode) - attrs |= A_ALTCHARSET; + attrs |= A_ALTCHARSET; if (enter_blink_mode) - attrs |= A_BLINK; + attrs |= A_BLINK; if (enter_bold_mode) - attrs |= A_BOLD; + attrs |= A_BOLD; if (enter_dim_mode) - attrs |= A_DIM; + attrs |= A_DIM; if (enter_reverse_mode) - attrs |= A_REVERSE; + attrs |= A_REVERSE; if (enter_standout_mode) - attrs |= A_STANDOUT; + attrs |= A_STANDOUT; if (enter_protected_mode) - attrs |= A_PROTECT; + attrs |= A_PROTECT; if (enter_secure_mode) - attrs |= A_INVIS; + attrs |= A_INVIS; if (enter_underline_mode) - attrs |= A_UNDERLINE; + attrs |= A_UNDERLINE; - if (SP->_coloron) - attrs |= A_COLOR; + if (SP_PARM->_coloron) + attrs |= A_COLOR; - return(attrs); +#if USE_ITALIC + if (enter_italics_mode) + attrs |= A_ITALIC; +#endif + +#endif /* USE_TERM_DRIVER */ + } + returnChtype(attrs); } +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(chtype) +termattrs(void) +{ + return NCURSES_SP_NAME(termattrs) (CURRENT_SCREEN); +} +#endif