Fri, 24 Jul 2015 04:24:38 +0300
Apply Leonard's patch for fixing the colors:
The colors were broken again.
* isprint for some reason returned true when the given byte is higher than 255.
The char cast of the byte was then printed which resulted in odd characters
popping up. Black appeared as ^@ which is NULL in caret notation.
* After that, the colors were all messed up because the RLINE enum didn't take
in account the color swapping.
So instead of messing up the enum order/number I went for a new "range-like"
method.
* After fixing all of that, I noticed the Interface::render_colorline had a
broken loop since the VS2010 commits.
This made the lines not print entierely and messed up the colors etc.
/* Public Domain Curses */ #include <curspriv.h> RCSID("$Id: bkgd.c,v 1.39 2008/07/13 16:08:18 wmcbrine Exp $") /*man-start************************************************************** Name: bkgd Synopsis: int bkgd(chtype ch); void bkgdset(chtype ch); chtype getbkgd(WINDOW *win); int wbkgd(WINDOW *win, chtype ch); void wbkgdset(WINDOW *win, chtype ch); int bkgrnd(const cchar_t *wch); void bkgrndset(const cchar_t *wch); int getbkgrnd(cchar_t *wch); int wbkgrnd(WINDOW *win, const cchar_t *wch); void wbkgrndset(WINDOW *win, const cchar_t *wch); int wgetbkgrnd(WINDOW *win, cchar_t *wch); Description: bkgdset() and wbkgdset() manipulate the background of a window. The background is a chtype consisting of any combination of attributes and a character; it is combined with each chtype added or inserted to the window by waddch() or winsch(). Only the attribute part is used to set the background of non-blank characters, while both character and attributes are used for blank positions. bkgd() and wbkgd() not only change the background, but apply it immediately to every cell in the window. The attributes that are defined with the attrset()/attron() set of functions take precedence over the background attributes if there is a conflict (e.g., different color pairs). Return Value: bkgd() and wbkgd() return OK, unless the window is NULL, in which case they return ERR. Portability X/Open BSD SYS V bkgd Y - 4.0 bkgdset Y - 4.0 getbkgd Y wbkgd Y - 4.0 wbkgdset Y - 4.0 bkgrnd Y bkgrndset Y getbkgrnd Y wbkgrnd Y wbkgrndset Y wgetbkgrnd Y **man-end****************************************************************/ int wbkgd(WINDOW *win, chtype ch) { int x, y; chtype oldcolr, oldch, newcolr, newch, colr, attr; chtype oldattr = 0, newattr = 0; chtype *winptr; PDC_LOG(("wbkgd() - called\n")); if (!win) return ERR; if (win->_bkgd == ch) return OK; oldcolr = win->_bkgd & A_COLOR; if (oldcolr) oldattr = (win->_bkgd & A_ATTRIBUTES) ^ oldcolr; oldch = win->_bkgd & A_CHARTEXT; wbkgdset(win, ch); newcolr = win->_bkgd & A_COLOR; if (newcolr) newattr = (win->_bkgd & A_ATTRIBUTES) ^ newcolr; newch = win->_bkgd & A_CHARTEXT; /* what follows is what seems to occur in the System V implementation of this routine */ for (y = 0; y < win->_maxy; y++) { for (x = 0; x < win->_maxx; x++) { winptr = win->_y[y] + x; ch = *winptr; /* determine the colors and attributes of the character read from the window */ colr = ch & A_COLOR; attr = ch & (A_ATTRIBUTES ^ A_COLOR); /* if the color is the same as the old background color, then make it the new background color, otherwise leave it */ if (colr == oldcolr) colr = newcolr; /* remove any attributes (non color) from the character that were part of the old background, then combine the remaining ones with the new background */ attr ^= oldattr; attr |= newattr; /* change character if it is there because it was the old background character */ ch &= A_CHARTEXT; if (ch == oldch) ch = newch; ch |= (attr | colr); *winptr = ch; } } touchwin(win); PDC_sync(win); return OK; } int bkgd(chtype ch) { PDC_LOG(("bkgd() - called\n")); return wbkgd(stdscr, ch); } void wbkgdset(WINDOW *win, chtype ch) { PDC_LOG(("wbkgdset() - called\n")); if (win) { if (!(ch & A_CHARTEXT)) ch |= ' '; win->_bkgd = ch; } } void bkgdset(chtype ch) { PDC_LOG(("bkgdset() - called\n")); wbkgdset(stdscr, ch); } chtype getbkgd(WINDOW *win) { PDC_LOG(("getbkgd() - called\n")); return win ? win->_bkgd : (chtype)ERR; } #ifdef PDC_WIDE int wbkgrnd(WINDOW *win, const cchar_t *wch) { PDC_LOG(("wbkgrnd() - called\n")); return wch ? wbkgd(win, *wch) : ERR; } int bkgrnd(const cchar_t *wch) { PDC_LOG(("bkgrnd() - called\n")); return wbkgrnd(stdscr, wch); } void wbkgrndset(WINDOW *win, const cchar_t *wch) { PDC_LOG(("wbkgdset() - called\n")); if (wch) wbkgdset(win, *wch); } void bkgrndset(const cchar_t *wch) { PDC_LOG(("bkgrndset() - called\n")); wbkgrndset(stdscr, wch); } int wgetbkgrnd(WINDOW *win, cchar_t *wch) { PDC_LOG(("wgetbkgrnd() - called\n")); if (!win || !wch) return ERR; *wch = win->_bkgd; return OK; } int getbkgrnd(cchar_t *wch) { PDC_LOG(("getbkgrnd() - called\n")); return wgetbkgrnd(stdscr, wch); } #endif