blob: 123cb908591237b38959ba091b93a2ee8d0ba37f [file] [log] [blame]
Patrick Georgi3b77b722011-07-07 15:41:53 +02001/* Public Domain Curses */
2
3#include <curspriv.h>
4
5RCSID("$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:
Stefan Reinauere11835e2011-10-31 12:54:00 -070048 These functions manipulate the current attributes and/or colors
49 of the named window. These attributes can be any combination
Patrick Georgi3b77b722011-07-07 15:41:53 +020050 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
Stefan Reinauere11835e2011-10-31 12:54:00 -070055 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
Patrick Georgi3b77b722011-07-07 15:41:53 +020058 any scrolling or insert/delete operations.
59
Stefan Reinauere11835e2011-10-31 12:54:00 -070060 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.
Patrick Georgi3b77b722011-07-07 15:41:53 +020063 color_set() sets the window color to the value of color_pair.
64
Stefan Reinauere11835e2011-10-31 12:54:00 -070065 standout() is the same as attron(A_STANDOUT). standend() is the
Patrick Georgi3b77b722011-07-07 15:41:53 +020066 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
100int 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
112int attroff(chtype attrs)
113{
114 PDC_LOG(("attroff() - called\n"));
115
116 return wattroff(stdscr, attrs);
117}
118
119int 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
Stefan Reinauere11835e2011-10-31 12:54:00 -0700128 if ((win->_attrs & A_COLOR) && (attrs & A_COLOR))
Patrick Georgi3b77b722011-07-07 15:41:53 +0200129 {
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
143int attron(chtype attrs)
144{
145 PDC_LOG(("attron() - called\n"));
146
147 return wattron(stdscr, attrs);
148}
149
150int 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
162int attrset(chtype attrs)
163{
164 PDC_LOG(("attrset() - called\n"));
165
166 return wattrset(stdscr, attrs);
167}
168
169int standend(void)
170{
171 PDC_LOG(("standend() - called\n"));
172
173 return wattrset(stdscr, A_NORMAL);
174}
175
176int standout(void)
177{
178 PDC_LOG(("standout() - called\n"));
179
180 return wattrset(stdscr, A_STANDOUT);
181}
182
183int wstandend(WINDOW *win)
184{
185 PDC_LOG(("wstandend() - called\n"));
186
187 return wattrset(win, A_NORMAL);
188}
189
190int wstandout(WINDOW *win)
191{
192 PDC_LOG(("wstandout() - called\n"));
193
194 return wattrset(win, A_STANDOUT);
195}
196
197chtype getattrs(WINDOW *win)
198{
199 return win ? win->_attrs : 0;
200}
201
202int 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
214int 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
221int 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
237int 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
244int 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
251int attr_off(attr_t attrs, void *opts)
252{
253 PDC_LOG(("attr_off() - called\n"));
254
255 return wattroff(stdscr, attrs);
256}
257
258int 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
265int attr_on(attr_t attrs, void *opts)
266{
267 PDC_LOG(("attr_on() - called\n"));
268
269 return wattron(stdscr, attrs);
270}
271
272int 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
284int 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
291int 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
323int 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
330int 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
340int 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}