X-Git-Url: http://ncurses.scripts.mit.edu/?a=blobdiff_plain;f=ncurses%2Fbase%2Flib_bkgd.c;h=4f99080835e80f6cb2d2d0fcdb5b2e375211f509;hb=214f159cd8c0ea4fba47beb249379d0da2dfb8ca;hp=d0d39d845364fcbb396ad6fc43ac5db76dd56897;hpb=321b81e6b3fa425daddac02420d862100dc3aac8;p=ncurses.git diff --git a/ncurses/base/lib_bkgd.c b/ncurses/base/lib_bkgd.c index d0d39d84..4f990808 100644 --- a/ncurses/base/lib_bkgd.c +++ b/ncurses/base/lib_bkgd.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2016,2018 Free Software Foundation, Inc. * + * Copyright 2018-2020,2021 Thomas E. Dickey * + * Copyright 1998-2014,2016 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 * @@ -36,7 +37,9 @@ #include -MODULE_ID("$Id: lib_bkgd.c,v 1.52 2018/12/09 00:09:17 tom Exp $") +MODULE_ID("$Id: lib_bkgd.c,v 1.63 2021/05/08 14:58:12 tom Exp $") + +static const NCURSES_CH_T blank = NewChar(BLANK_TEXT); /* * Set the window's background information. @@ -48,7 +51,7 @@ static NCURSES_INLINE void #endif wbkgrndset(WINDOW *win, const ARG_CH_T ch) { - T((T_CALLED("wbkgdset(%p,%s)"), (void *) win, _tracech_t(ch))); + T((T_CALLED("wbkgrndset(%p,%s)"), (void *) win, _tracech_t(ch))); if (win) { attr_t off = AttrOf(win->_nc_bkgd); @@ -61,7 +64,7 @@ wbkgrndset(WINDOW *win, const ARG_CH_T ch) { int pair; - if ((pair = GetPair(win->_nc_bkgd)) != 0) + if (GetPair(win->_nc_bkgd) != 0) SET_WINDOW_PAIR(win, 0); if ((pair = GetPair(CHDEREF(ch))) != 0) SET_WINDOW_PAIR(win, pair); @@ -102,26 +105,36 @@ NCURSES_EXPORT(void) wbkgdset(WINDOW *win, chtype ch) { NCURSES_CH_T wch; + T((T_CALLED("wbkgdset(%p,%s)"), (void *) win, _tracechtype(ch))); SetChar2(wch, ch); wbkgrndset(win, CHREF(wch)); + returnVoid; } /* * Set the window's background information and apply it to each cell. */ -#if USE_WIDEC_SUPPORT -NCURSES_EXPORT(int) -#else static NCURSES_INLINE int -#undef wbkgrnd -#endif -wbkgrnd(WINDOW *win, const ARG_CH_T ch) +_nc_background(WINDOW *win, const ARG_CH_T ch, bool narrow) { #undef SP_PARM #define SP_PARM SP /* to use Charable() */ int code = ERR; - T((T_CALLED("wbkgd(%p,%s)"), (void *) win, _tracech_t(ch))); +#if USE_WIDEC_SUPPORT + T((T_CALLED("%s(%p,%s)"), + narrow ? "wbkgd" : "wbkgrnd", + (void *) win, + _tracecchar_t(ch))); +#define TraceChar(c) _tracecchar_t2(1, &(c)) +#else + T((T_CALLED("%s(%p,%s)"), + "wbkgd", + (void *) win, + _tracech_t(ch))); + (void) narrow; +#define TraceChar(c) _tracechar(CharOf(c)) +#endif if (SP == 0) { ; @@ -142,9 +155,22 @@ wbkgrnd(WINDOW *win, const ARG_CH_T ch) SetPair(new_bkgd, 0); } + /* avoid setting background-character to a null */ + if (CharOf(new_bkgd) == 0) { + NCURSES_CH_T tmp_bkgd = blank; + SetAttr(tmp_bkgd, AttrOf(new_bkgd)); + SetPair(tmp_bkgd, GetPair(new_bkgd)); + new_bkgd = tmp_bkgd; + } + memset(&old_bkgd, 0, sizeof(old_bkgd)); (void) wgetbkgrnd(win, &old_bkgd); + if (!memcmp(&old_bkgd, &new_bkgd, sizeof(new_bkgd))) { + T(("...unchanged")); + returnCode(OK); + } + old_char = old_bkgd; RemAttr(old_char, ~A_CHARTEXT); old_attr = AttrOf(old_bkgd); @@ -153,6 +179,8 @@ wbkgrnd(WINDOW *win, const ARG_CH_T ch) if (!(old_attr & A_COLOR)) { old_pair = 0; } + T(("... old background char %s, attr %s, pair %d", + TraceChar(old_char), _traceattr(old_attr), old_pair)); new_char = new_bkgd; RemAttr(new_char, ~A_CHARTEXT); @@ -160,18 +188,27 @@ wbkgrnd(WINDOW *win, const ARG_CH_T ch) new_pair = GetPair(new_bkgd); /* SVr4 limits background character to printable 7-bits */ - if (!Charable(new_bkgd)) { + if ( +#if USE_WIDEC_SUPPORT + narrow && +#endif + !Charable(new_bkgd)) { new_char = old_char; } + if (!(new_attr & A_COLOR)) { + new_pair = 0; + } + T(("... new background char %s, attr %s, pair %d", + TraceChar(new_char), _traceattr(new_attr), new_pair)); (void) wbkgrndset(win, CHREF(new_bkgd)); /* SVr4 updates color pair if old/new match, otherwise just attrs */ if ((new_pair != 0) && (new_pair == old_pair)) { - SetAttr(win->_nc_bkgd, new_attr); - SetPair(win->_nc_bkgd, new_pair); + WINDOW_ATTRS(win) = new_attr; + SET_WINDOW_PAIR(win, new_pair); } else { - SetAttr(win->_nc_bkgd, new_attr); + WINDOW_ATTRS(win) = new_attr; } for (y = 0; y <= win->_maxy; y++) { @@ -183,7 +220,19 @@ wbkgrnd(WINDOW *win, const ARG_CH_T ch) attr_t tmp_attr = AttrOf(*cp); if (CharEq(*cp, old_bkgd)) { - SetChar2(*cp, CharOf(new_char)); +#if USE_WIDEC_SUPPORT + if (!narrow) { + if (Charable(new_bkgd)) { + SetChar2(*cp, CharOf(new_char)); + } else { + SetChar(*cp, L' ', AttrOf(new_char)); + } + memcpy(cp->chars, + new_char.chars, + CCHARW_MAX * sizeof(cp->chars[0])); + } else +#endif + SetChar2(*cp, CharOf(new_char)); } if (tmp_pair != 0) { if (tmp_pair == old_pair) { @@ -195,7 +244,7 @@ wbkgrnd(WINDOW *win, const ARG_CH_T ch) | (new_attr & ALL_BUT_COLOR)); } } else { - SetAttr(*cp, new_attr); + SetAttr(*cp, (tmp_attr & ~old_attr) | new_attr); SetPair(*cp, new_pair); } } @@ -207,10 +256,18 @@ wbkgrnd(WINDOW *win, const ARG_CH_T ch) returnCode(code); } +#if USE_WIDEC_SUPPORT +NCURSES_EXPORT(int) +wbkgrnd(WINDOW *win, const ARG_CH_T ch) +{ + return _nc_background(win, ch, FALSE); +} +#endif + NCURSES_EXPORT(int) wbkgd(WINDOW *win, chtype ch) { NCURSES_CH_T wch; SetChar2(wch, ch); - return wbkgrnd(win, CHREF(wch)); + return _nc_background(win, CHREF(wch), TRUE); }