blob: d511efe8b3abf61ca2f180fb7675bdacb39b3f04 [file] [log] [blame]
Patrick Georgi3b77b722011-07-07 15:41:53 +02001/* Public Domain Curses */
2
3#include <curspriv.h>
4
5RCSID("$Id: bkgd.c,v 1.39 2008/07/13 16:08:18 wmcbrine Exp $")
6
7/*man-start**************************************************************
8
9 Name: bkgd
10
11 Synopsis:
12 int bkgd(chtype ch);
13 void bkgdset(chtype ch);
14 chtype getbkgd(WINDOW *win);
15 int wbkgd(WINDOW *win, chtype ch);
16 void wbkgdset(WINDOW *win, chtype ch);
17
18 int bkgrnd(const cchar_t *wch);
19 void bkgrndset(const cchar_t *wch);
20 int getbkgrnd(cchar_t *wch);
21 int wbkgrnd(WINDOW *win, const cchar_t *wch);
22 void wbkgrndset(WINDOW *win, const cchar_t *wch);
23 int wgetbkgrnd(WINDOW *win, cchar_t *wch);
24
25 Description:
26 bkgdset() and wbkgdset() manipulate the background of a window.
27 The background is a chtype consisting of any combination of
28 attributes and a character; it is combined with each chtype
29 added or inserted to the window by waddch() or winsch(). Only
30 the attribute part is used to set the background of non-blank
31 characters, while both character and attributes are used for
32 blank positions.
33
34 bkgd() and wbkgd() not only change the background, but apply it
35 immediately to every cell in the window.
36
37 The attributes that are defined with the attrset()/attron() set
38 of functions take precedence over the background attributes if
39 there is a conflict (e.g., different color pairs).
40
41 Return Value:
Stefan Reinauere11835e2011-10-31 12:54:00 -070042 bkgd() and wbkgd() return OK, unless the window is NULL, in
Patrick Georgi3b77b722011-07-07 15:41:53 +020043 which case they return ERR.
44
45 Portability X/Open BSD SYS V
46 bkgd Y - 4.0
47 bkgdset Y - 4.0
48 getbkgd Y
49 wbkgd Y - 4.0
50 wbkgdset Y - 4.0
51 bkgrnd Y
52 bkgrndset Y
53 getbkgrnd Y
54 wbkgrnd Y
55 wbkgrndset Y
56 wgetbkgrnd Y
57
58**man-end****************************************************************/
59
60int wbkgd(WINDOW *win, chtype ch)
61{
62 int x, y;
63 chtype oldcolr, oldch, newcolr, newch, colr, attr;
64 chtype oldattr = 0, newattr = 0;
65 chtype *winptr;
66
67 PDC_LOG(("wbkgd() - called\n"));
68
69 if (!win)
70 return ERR;
71
72 if (win->_bkgd == ch)
73 return OK;
74
75 oldcolr = win->_bkgd & A_COLOR;
76 if (oldcolr)
77 oldattr = (win->_bkgd & A_ATTRIBUTES) ^ oldcolr;
78
79 oldch = win->_bkgd & A_CHARTEXT;
80
81 wbkgdset(win, ch);
82
83 newcolr = win->_bkgd & A_COLOR;
84 if (newcolr)
85 newattr = (win->_bkgd & A_ATTRIBUTES) ^ newcolr;
86
87 newch = win->_bkgd & A_CHARTEXT;
88
Stefan Reinauere11835e2011-10-31 12:54:00 -070089 /* what follows is what seems to occur in the System V
Patrick Georgi3b77b722011-07-07 15:41:53 +020090 implementation of this routine */
91
92 for (y = 0; y < win->_maxy; y++)
93 {
94 for (x = 0; x < win->_maxx; x++)
95 {
96 winptr = win->_y[y] + x;
97
98 ch = *winptr;
99
Stefan Reinauere11835e2011-10-31 12:54:00 -0700100 /* determine the colors and attributes of the character read
Patrick Georgi3b77b722011-07-07 15:41:53 +0200101 from the window */
102
103 colr = ch & A_COLOR;
104 attr = ch & (A_ATTRIBUTES ^ A_COLOR);
105
Stefan Reinauere11835e2011-10-31 12:54:00 -0700106 /* if the color is the same as the old background color,
Patrick Georgi3b77b722011-07-07 15:41:53 +0200107 then make it the new background color, otherwise leave it */
108
109 if (colr == oldcolr)
110 colr = newcolr;
111
Stefan Reinauere11835e2011-10-31 12:54:00 -0700112 /* remove any attributes (non color) from the character that
113 were part of the old background, then combine the
Patrick Georgi3b77b722011-07-07 15:41:53 +0200114 remaining ones with the new background */
115
116 attr ^= oldattr;
117 attr |= newattr;
118
Stefan Reinauere11835e2011-10-31 12:54:00 -0700119 /* change character if it is there because it was the old
Patrick Georgi3b77b722011-07-07 15:41:53 +0200120 background character */
121
122 ch &= A_CHARTEXT;
123 if (ch == oldch)
124 ch = newch;
125
126 ch |= (attr | colr);
127
128 *winptr = ch;
129
130 }
131 }
132
133 touchwin(win);
134 PDC_sync(win);
135 return OK;
136}
137
138int bkgd(chtype ch)
139{
140 PDC_LOG(("bkgd() - called\n"));
141
142 return wbkgd(stdscr, ch);
143}
144
145void wbkgdset(WINDOW *win, chtype ch)
146{
147 PDC_LOG(("wbkgdset() - called\n"));
148
149 if (win)
150 {
151 if (!(ch & A_CHARTEXT))
152 ch |= ' ';
153
154 win->_bkgd = ch;
155 }
156}
157
158void bkgdset(chtype ch)
159{
160 PDC_LOG(("bkgdset() - called\n"));
161
162 wbkgdset(stdscr, ch);
163}
164
165chtype getbkgd(WINDOW *win)
166{
167 PDC_LOG(("getbkgd() - called\n"));
168
169 return win ? win->_bkgd : (chtype)ERR;
170}
171
172#ifdef PDC_WIDE
173int wbkgrnd(WINDOW *win, const cchar_t *wch)
174{
175 PDC_LOG(("wbkgrnd() - called\n"));
176
177 return wch ? wbkgd(win, *wch) : ERR;
178}
179
180int bkgrnd(const cchar_t *wch)
181{
182 PDC_LOG(("bkgrnd() - called\n"));
183
184 return wbkgrnd(stdscr, wch);
185}
186
187void wbkgrndset(WINDOW *win, const cchar_t *wch)
188{
189 PDC_LOG(("wbkgdset() - called\n"));
190
191 if (wch)
192 wbkgdset(win, *wch);
193}
194
195void bkgrndset(const cchar_t *wch)
196{
197 PDC_LOG(("bkgrndset() - called\n"));
198
199 wbkgrndset(stdscr, wch);
200}
201
202int wgetbkgrnd(WINDOW *win, cchar_t *wch)
203{
204 PDC_LOG(("wgetbkgrnd() - called\n"));
205
206 if (!win || !wch)
207 return ERR;
208
209 *wch = win->_bkgd;
210
211 return OK;
212}
213
214int getbkgrnd(cchar_t *wch)
215{
216 PDC_LOG(("getbkgrnd() - called\n"));
217
218 return wgetbkgrnd(stdscr, wch);
219}
220#endif