From f13417cd686829a1230d0dd09dfc2d396cc2fbb8 Mon Sep 17 00:00:00 2001 From: William McBrine Date: Wed, 7 Dec 2005 09:52:06 +0000 Subject: [PATCH] In wborder(), whline(), and wvline(), when dealing with characters without their own defined colors, the current (wattrset) attribute would be added to them, but not the current background (wbkgd). This was visible in the testcurs demo. The same issue was fixed in PDC_chadd() in 1993. This also eliminates some redundant code. --- pdcurses/border.c | 177 ++++++++++++++++++++++------------------------ 1 file changed, 84 insertions(+), 93 deletions(-) diff --git a/pdcurses/border.c b/pdcurses/border.c index d4d580c4..8cd4245b 100644 --- a/pdcurses/border.c +++ b/pdcurses/border.c @@ -40,7 +40,7 @@ #endif #ifdef PDCDEBUG -char *rcsid_border = "$Id: border.c,v 1.3 2001/03/02 13:40:26 mark Exp $"; +char *rcsid_border = "$Id: border.c,v 1.4 2005/12/07 09:52:06 wmcbrine Exp $"; #endif /*man-start********************************************************************* @@ -108,6 +108,76 @@ char *rcsid_border = "$Id: border.c,v 1.3 2001/03/02 13:40:26 mark Exp $"; **man-end**********************************************************************/ +/*man-start********************************************************************* + PDC_attr_passthru() - Combines chtype with current and/or background + attributes of a window + + PDCurses Description: + This is a private PDCurses function. + + Takes a single chtype 'ch' and checks if the current attribute of + window 'win', as set by wattrset(), and/or the current background + of win, as set by wbkgd(), should by combined with it. Attributes + set explicitly in ch take precedence. + + PDCurses Return Value: + Returns ch, combined (or not) with existing attributes. + + PDCurses Errors: + No errors are defined for this function. + + Portability: + PDCurses chtype PDC_attr_passthru( WINDOW *win, chtype ch ); + +**man-end**********************************************************************/ + +/***********************************************************************/ +#ifdef HAVE_PROTO +chtype PDC_attr_passthru(WINDOW *win, chtype ch) +#else +chtype PDC_attr_passthru(win, ch) +WINDOW *win; +chtype ch; +#endif +/***********************************************************************/ +{ + chtype attr, bktmp; + + /* + * If the incoming character doesn't have its own attribute, + * then use the current attributes for the window. + * If the incoming character has attributes, but not a colour + * component, OR the attributes to the current attributes + * for the window. + * If the incoming character has a colour component, use only + * the attributes from the incoming character. + */ + + if ((ch & A_ATTRIBUTES) == 0) + attr = win->_attrs; + else + if ((ch & A_COLOR) == 0) + attr = (ch & A_ATTRIBUTES) | win->_attrs; + else + attr = (ch & A_ATTRIBUTES); + + /* wrs (4/10/93) + * Apply the same sort of logic for the window background, in that it + * only takes precedence if other color attributes are not there. + */ + + if ((attr & A_COLOR) == 0) + attr = (attr | (win->_bkgd & A_ATTRIBUTES)); + else + { + bktmp = (win->_bkgd & A_COLOR); + attr = (attr | ( (win->_bkgd & A_ATTRIBUTES) ^ bktmp )); + } + + ch = (ch & A_CHARTEXT) | attr; + + return ch; +} /***********************************************************************/ #ifdef HAVE_PROTO int PDC_CDECL wborder(WINDOW *win, chtype ls, chtype rs, chtype ts, chtype bs, @@ -129,8 +199,6 @@ chtype br; int ymax,xmax; int ymin,xmin; int i; - chtype vattr; - chtype hattr; #ifdef PDCDEBUG if (trace_on) PDC_debug("wborder() - called\n"); @@ -143,39 +211,14 @@ chtype br; ymin = 0; xmin = 0; - if ((ts & A_ATTRIBUTES) == 0) - hattr = win->_attrs; - else - if ((ts & A_COLOR) == 0) - hattr = (ts & A_ATTRIBUTES) | win->_attrs; - else - hattr = (ts & A_ATTRIBUTES); - - if ((ls & A_ATTRIBUTES) == 0) - vattr = win->_attrs; - else - if ((ls & A_COLOR) == 0) - vattr = (ls & A_ATTRIBUTES) | win->_attrs; - else - vattr = (ls & A_ATTRIBUTES); - - ls = (ls == 0) ? ACS_VLINE | vattr : ls; - rs = (rs == 0) ? ACS_VLINE | vattr : rs; - ts = (ts == 0) ? ACS_HLINE | hattr : ts; - bs = (bs == 0) ? ACS_HLINE | hattr : bs; - tl = (tl == 0) ? ACS_ULCORNER | vattr : tl; - tr = (tr == 0) ? ACS_URCORNER | vattr : tr; - bl = (bl == 0) ? ACS_LLCORNER | vattr : bl; - br = (br == 0) ? ACS_LRCORNER | vattr : br; - - ls = (ls & A_ATTRIBUTES) ? ls : ls | vattr; - rs = (rs & A_ATTRIBUTES) ? rs : rs | vattr; - ts = (ts & A_ATTRIBUTES) ? ts : ts | hattr; - bs = (bs & A_ATTRIBUTES) ? bs : bs | hattr; - tl = (tl & A_ATTRIBUTES) ? tl : tl | vattr; - tr = (tr & A_ATTRIBUTES) ? tr : tr | vattr; - bl = (bl & A_ATTRIBUTES) ? bl : bl | vattr; - br = (br & A_ATTRIBUTES) ? br : br | vattr; + ls = PDC_attr_passthru(win, ls ? ls : ACS_VLINE); + rs = PDC_attr_passthru(win, rs ? rs : ACS_VLINE); + ts = PDC_attr_passthru(win, ts ? ts : ACS_HLINE); + bs = PDC_attr_passthru(win, bs ? bs : ACS_HLINE); + tl = PDC_attr_passthru(win, tl ? tl : ACS_ULCORNER); + tr = PDC_attr_passthru(win, tr ? tr : ACS_URCORNER); + bl = PDC_attr_passthru(win, bl ? bl : ACS_LLCORNER); + br = PDC_attr_passthru(win, br ? br : ACS_LRCORNER); for (i = xmin + 1; i <= xmax - 1; i++) { @@ -276,17 +319,15 @@ int n; } /***********************************************************************/ #ifdef HAVE_PROTO -int PDC_CDECL whline(WINDOW *win, chtype inch, int n) +int PDC_CDECL whline(WINDOW *win, chtype ch, int n) #else -int PDC_CDECL whline(win,inch,n) +int PDC_CDECL whline(win,ch,n) WINDOW *win; -chtype inch; +chtype ch; int n; #endif /***********************************************************************/ { - chtype attr; - chtype ch=inch; int startpos; int endpos; @@ -302,34 +343,8 @@ int n; endpos = min(win->_curx + n -1, win->_maxx); - /* - ** If the incoming character doesn't have it's own attribute - ** then use the current attributes for the window. - */ + ch = PDC_attr_passthru(win, ch ? ch : ACS_HLINE); - if ((ch & A_ATTRIBUTES) == 0) - attr = win->_attrs; - else - { - if ((ch & A_COLOR) == 0) - attr = (ch & A_ATTRIBUTES) | win->_attrs; - else - attr = (ch & A_ATTRIBUTES); - } - - ch &= A_CHARTEXT; - - /* - ** If the incoming character is zero then use the default horizontal - ** line character. - */ - - if (ch == 0) -{ - ch = ACS_HLINE; -} - - ch |= attr; startpos = win->_curx; for (n = win->_curx; n <= endpos; n++) @@ -379,7 +394,6 @@ int n; #endif /***********************************************************************/ { - chtype attr; int endpos; #ifdef PDCDEBUG @@ -394,30 +408,7 @@ int n; endpos = min(win->_cury + n -1, win->_maxy); - /* - ** If the incoming character doesn't have it's own attribute - ** then use the current attributes for the window. - */ - - if ((ch & A_ATTRIBUTES) == 0) - attr = win->_attrs; - else - if ((ch & A_COLOR) == 0) - attr = (ch & A_ATTRIBUTES) | win->_attrs; - else - attr = (ch & A_ATTRIBUTES); - - ch &= A_CHARTEXT; - - /* - ** If the incoming character is zero then use the default vertical - ** line character. - */ - - if (ch == 0) - ch = ACS_VLINE; - - ch |= attr; + ch = PDC_attr_passthru(win, ch ? ch : ACS_VLINE); for (n = win->_cury; n <= endpos; n++) {