Change-Id: If881ec130833c7e7e62caa3d31e350a531f5bc8e Signed-off-by: Stefan Reinauer <stefan.reinauer@coreboot.org> Reviewed-on: http://review.coreboot.org/12398 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <pgeorgi@google.com>
		
			
				
	
	
		
			221 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			221 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* 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
 |