/****************************************************************************
- * Copyright (c) 1998-2016,2018 Free Software Foundation, Inc. *
+ * Copyright 2018-2019,2020 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 *
#include <curses.priv.h>
-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.55 2020/03/02 01:34:48 tom Exp $")
+
+static const NCURSES_CH_T blank = NewChar(BLANK_TEXT);
/*
* Set the window's background information.
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);
if (!(old_attr & A_COLOR)) {
old_pair = 0;
}
+ T(("... old background char %s, attr %s, pair %d",
+ _tracechar(CharOf(old_char)), _traceattr(old_attr), old_pair));
new_char = new_bkgd;
RemAttr(new_char, ~A_CHARTEXT);
if (!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(CharOf(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++) {
| (new_attr & ALL_BUT_COLOR));
}
} else {
- SetAttr(*cp, new_attr);
+ SetAttr(*cp, (tmp_attr & ~old_attr) | new_attr);
SetPair(*cp, new_pair);
}
}