1 /* Public Domain Curses */
2 
3 #include <curspriv.h>
4 
5 RCSID("$Id: attr.c,v 1.41 2008/07/13 16:08:17 wmcbrine Exp $")
6 
7 /*man-start**************************************************************
8 
9   Name:                                                         attr
10 
11   Synopsis:
12         int attroff(chtype attrs);
13         int wattroff(WINDOW *win, chtype attrs);
14         int attron(chtype attrs);
15         int wattron(WINDOW *win, chtype attrs);
16         int attrset(chtype attrs);
17         int wattrset(WINDOW *win, chtype attrs);
18         int standend(void);
19         int wstandend(WINDOW *win);
20         int standout(void);
21         int wstandout(WINDOW *win);
22 
23         int color_set(short color_pair, void *opts);
24         int wcolor_set(WINDOW *win, short color_pair, void *opts);
25 
26         int attr_get(attr_t *attrs, short *color_pair, void *opts);
27         int attr_off(attr_t attrs, void *opts);
28         int attr_on(attr_t attrs, void *opts);
29         int attr_set(attr_t attrs, short color_pair, void *opts);
30         int wattr_get(WINDOW *win, attr_t *attrs, short *color_pair,
31                 void *opts);
32         int wattr_off(WINDOW *win, attr_t attrs, void *opts);
33         int wattr_on(WINDOW *win, attr_t attrs, void *opts);
34         int wattr_set(WINDOW *win, attr_t attrs, short color_pair,
35                 void *opts);
36 
37         int chgat(int n, attr_t attr, short color, const void *opts);
38         int mvchgat(int y, int x, int n, attr_t attr, short color,
39                 const void *opts);
40         int mvwchgat(WINDOW *win, int y, int x, int n, attr_t attr,
41                 short color, const void *opts);
42         int wchgat(WINDOW *win, int n, attr_t attr, short color,
43                 const void *opts);
44 
45         chtype getattrs(WINDOW *win);
46 
47   Description:
48         These functions manipulate the current attributes and/or colors
49         of the named window.  These attributes can be any combination
50         of A_STANDOUT, A_REVERSE, A_BOLD, A_DIM, A_BLINK, A_UNDERLINE.
51 
52         These constants are defined in <curses.h> and can be combined
53         with the bitwise-OR operator (|).
54 
55         The current attributes of a window are applied to all chtypes
56         that are written into the window with waddch(). Attributes are
57         a property of the chtype, and move with the character through
58         any scrolling or insert/delete operations.
59 
60         attrset() sets the current attributes of the given window to
61         attrs. attroff() turns off the named attributes without
62         affecting any other attributes; attron() turns them on.
63         color_set() sets the window color to the value of color_pair.
64 
65         standout() is the same as attron(A_STANDOUT). standend() is the
66         same as attrset(A_NORMAL); that is, it turns off all attributes.
67 
68   Return Value:
69         All functions return OK on success and ERR on error.
70 
71   Portability                                X/Open    BSD    SYS V
72         attroff                                 Y       Y       Y
73         wattroff                                Y       Y       Y
74         attron                                  Y       Y       Y
75         wattron                                 Y       Y       Y
76         attrset                                 Y       Y       Y
77         wattrset                                Y       Y       Y
78         standend                                Y       Y       Y
79         wstandend                               Y       Y       Y
80         standout                                Y       Y       Y
81         wstandout                               Y       Y       Y
82         color_set                               Y
83         wcolor_set                              Y
84         attr_get                                Y
85         wattr_get                               Y
86         attr_on                                 Y
87         wattr_on                                Y
88         attr_off                                Y
89         wattr_off                               Y
90         attr_set                                Y
91         wattr_set                               Y
92         chgat                                   Y
93         wchgat                                  Y
94         mvchgat                                 Y
95         mvwchgat                                Y
96         getattrs                                -
97 
98 **man-end****************************************************************/
99 
wattroff(WINDOW * win,chtype attrs)100 int wattroff(WINDOW *win, chtype attrs)
101 {
102     PDC_LOG(("wattroff() - called\n"));
103 
104     if (!win)
105         return ERR;
106 
107     win->_attrs &= (~attrs & A_ATTRIBUTES);
108 
109     return OK;
110 }
111 
attroff(chtype attrs)112 int attroff(chtype attrs)
113 {
114     PDC_LOG(("attroff() - called\n"));
115 
116     return wattroff(stdscr, attrs);
117 }
118 
wattron(WINDOW * win,chtype attrs)119 int wattron(WINDOW *win, chtype attrs)
120 {
121     chtype newcolr, oldcolr, newattr, oldattr;
122 
123     PDC_LOG(("wattron() - called\n"));
124 
125     if (!win)
126         return ERR;
127 
128     if ((win->_attrs & A_COLOR) && (attrs & A_COLOR))
129     {
130         oldcolr = win->_attrs & A_COLOR;
131         oldattr = win->_attrs ^ oldcolr;
132         newcolr = attrs & A_COLOR;
133         newattr = (attrs & A_ATTRIBUTES) ^ newcolr;
134         newattr |= oldattr;
135         win->_attrs = newattr | newcolr;
136     }
137     else
138         win->_attrs |= (attrs & A_ATTRIBUTES);
139 
140     return OK;
141 }
142 
attron(chtype attrs)143 int attron(chtype attrs)
144 {
145     PDC_LOG(("attron() - called\n"));
146 
147     return wattron(stdscr, attrs);
148 }
149 
wattrset(WINDOW * win,chtype attrs)150 int wattrset(WINDOW *win, chtype attrs)
151 {
152     PDC_LOG(("wattrset() - called\n"));
153 
154     if (!win)
155         return ERR;
156 
157     win->_attrs = attrs & A_ATTRIBUTES;
158 
159     return OK;
160 }
161 
attrset(chtype attrs)162 int attrset(chtype attrs)
163 {
164     PDC_LOG(("attrset() - called\n"));
165 
166     return wattrset(stdscr, attrs);
167 }
168 
standend(void)169 int standend(void)
170 {
171     PDC_LOG(("standend() - called\n"));
172 
173     return wattrset(stdscr, A_NORMAL);
174 }
175 
standout(void)176 int standout(void)
177 {
178     PDC_LOG(("standout() - called\n"));
179 
180     return wattrset(stdscr, A_STANDOUT);
181 }
182 
wstandend(WINDOW * win)183 int wstandend(WINDOW *win)
184 {
185     PDC_LOG(("wstandend() - called\n"));
186 
187     return wattrset(win, A_NORMAL);
188 }
189 
wstandout(WINDOW * win)190 int wstandout(WINDOW *win)
191 {
192     PDC_LOG(("wstandout() - called\n"));
193 
194     return wattrset(win, A_STANDOUT);
195 }
196 
getattrs(WINDOW * win)197 chtype getattrs(WINDOW *win)
198 {
199     return win ? win->_attrs : 0;
200 }
201 
wcolor_set(WINDOW * win,short color_pair,void * opts)202 int wcolor_set(WINDOW *win, short color_pair, void *opts)
203 {
204     PDC_LOG(("wcolor_set() - called\n"));
205 
206     if (!win)
207         return ERR;
208 
209     win->_attrs = (win->_attrs & ~A_COLOR) | COLOR_PAIR(color_pair);
210 
211     return OK;
212 }
213 
color_set(short color_pair,void * opts)214 int color_set(short color_pair, void *opts)
215 {
216     PDC_LOG(("color_set() - called\n"));
217 
218     return wcolor_set(stdscr, color_pair, opts);
219 }
220 
wattr_get(WINDOW * win,attr_t * attrs,short * color_pair,void * opts)221 int wattr_get(WINDOW *win, attr_t *attrs, short *color_pair, void *opts)
222 {
223     PDC_LOG(("wattr_get() - called\n"));
224 
225     if (!win)
226         return ERR;
227 
228     if (attrs)
229         *attrs = win->_attrs & (A_ATTRIBUTES & ~A_COLOR);
230 
231     if (color_pair)
232         *color_pair = PAIR_NUMBER(win->_attrs);
233 
234     return OK;
235 }
236 
attr_get(attr_t * attrs,short * color_pair,void * opts)237 int attr_get(attr_t *attrs, short *color_pair, void *opts)
238 {
239     PDC_LOG(("attr_get() - called\n"));
240 
241     return wattr_get(stdscr, attrs, color_pair, opts);
242 }
243 
wattr_off(WINDOW * win,attr_t attrs,void * opts)244 int wattr_off(WINDOW *win, attr_t attrs, void *opts)
245 {
246     PDC_LOG(("wattr_off() - called\n"));
247 
248     return wattroff(win, attrs);
249 }
250 
attr_off(attr_t attrs,void * opts)251 int attr_off(attr_t attrs, void *opts)
252 {
253     PDC_LOG(("attr_off() - called\n"));
254 
255     return wattroff(stdscr, attrs);
256 }
257 
wattr_on(WINDOW * win,attr_t attrs,void * opts)258 int wattr_on(WINDOW *win, attr_t attrs, void *opts)
259 {
260     PDC_LOG(("wattr_off() - called\n"));
261 
262     return wattron(win, attrs);
263 }
264 
attr_on(attr_t attrs,void * opts)265 int attr_on(attr_t attrs, void *opts)
266 {
267     PDC_LOG(("attr_on() - called\n"));
268 
269     return wattron(stdscr, attrs);
270 }
271 
wattr_set(WINDOW * win,attr_t attrs,short color_pair,void * opts)272 int wattr_set(WINDOW *win, attr_t attrs, short color_pair, void *opts)
273 {
274     PDC_LOG(("wattr_set() - called\n"));
275 
276     if (!win)
277         return ERR;
278 
279     win->_attrs = (attrs & (A_ATTRIBUTES & ~A_COLOR)) | COLOR_PAIR(color_pair);
280 
281     return OK;
282 }
283 
attr_set(attr_t attrs,short color_pair,void * opts)284 int attr_set(attr_t attrs, short color_pair, void *opts)
285 {
286     PDC_LOG(("attr_get() - called\n"));
287 
288     return wattr_set(stdscr, attrs, color_pair, opts);
289 }
290 
wchgat(WINDOW * win,int n,attr_t attr,short color,const void * opts)291 int wchgat(WINDOW *win, int n, attr_t attr, short color, const void *opts)
292 {
293     chtype *dest, newattr;
294     int startpos, endpos;
295 
296     PDC_LOG(("wchgat() - called\n"));
297 
298     if (!win)
299         return ERR;
300 
301     newattr = (attr & A_ATTRIBUTES) | COLOR_PAIR(color);
302 
303     startpos = win->_curx;
304     endpos = ((n < 0) ? win->_maxx : min(startpos + n, win->_maxx)) - 1;
305     dest = win->_y[win->_cury];
306 
307     for (n = startpos; n <= endpos; n++)
308         dest[n] = (dest[n] & A_CHARTEXT) | newattr;
309 
310     n = win->_cury;
311 
312     if (startpos < win->_firstch[n] || win->_firstch[n] == _NO_CHANGE)
313         win->_firstch[n] = startpos;
314 
315     if (endpos > win->_lastch[n])
316         win->_lastch[n] = endpos;
317 
318     PDC_sync(win);
319 
320     return OK;
321 }
322 
chgat(int n,attr_t attr,short color,const void * opts)323 int chgat(int n, attr_t attr, short color, const void *opts)
324 {
325     PDC_LOG(("chgat() - called\n"));
326 
327     return wchgat(stdscr, n, attr, color, opts);
328 }
329 
mvchgat(int y,int x,int n,attr_t attr,short color,const void * opts)330 int mvchgat(int y, int x, int n, attr_t attr, short color, const void *opts)
331 {
332     PDC_LOG(("mvchgat() - called\n"));
333 
334     if (move(y, x) == ERR)
335         return ERR;
336 
337     return wchgat(stdscr, n, attr, color, opts);
338 }
339 
mvwchgat(WINDOW * win,int y,int x,int n,attr_t attr,short color,const void * opts)340 int mvwchgat(WINDOW *win, int y, int x, int n, attr_t attr, short color,
341              const void *opts)
342 {
343     PDC_LOG(("mvwchgat() - called\n"));
344 
345     if (wmove(win, y, x) == ERR)
346         return ERR;
347 
348     return wchgat(win, n, attr, color, opts);
349 }
350