attributes.c revision 1.12 1 1.12 jdc /* $NetBSD: attributes.c,v 1.12 2003/03/30 07:38:42 jdc Exp $ */
2 1.1 mrg
3 1.3 jdc /*-
4 1.3 jdc * Copyright (c) 1999 The NetBSD Foundation, Inc.
5 1.1 mrg * All rights reserved.
6 1.1 mrg *
7 1.3 jdc * This code is derived from software contributed to The NetBSD Foundation
8 1.3 jdc * by Julian Coleman.
9 1.3 jdc *
10 1.1 mrg * Redistribution and use in source and binary forms, with or without
11 1.1 mrg * modification, are permitted provided that the following conditions
12 1.1 mrg * are met:
13 1.1 mrg * 1. Redistributions of source code must retain the above copyright
14 1.1 mrg * notice, this list of conditions and the following disclaimer.
15 1.3 jdc * 2. Redistributions in binary form must reproduce the above copyright
16 1.3 jdc * notice, this list of conditions and the following disclaimer in the
17 1.3 jdc * documentation and/or other materials provided with the distribution.
18 1.3 jdc * 3. All advertising materials mentioning features or use of this software
19 1.3 jdc * must display the following acknowledgement:
20 1.3 jdc * This product includes software developed by the NetBSD
21 1.3 jdc * Foundation, Inc. and its contributors.
22 1.3 jdc * 4. Neither the name of The NetBSD Foundation nor the names of its
23 1.3 jdc * contributors may be used to endorse or promote products derived
24 1.3 jdc * from this software without specific prior written permission.
25 1.1 mrg *
26 1.3 jdc * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 1.3 jdc * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 1.3 jdc * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 1.3 jdc * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 1.3 jdc * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 1.3 jdc * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 1.3 jdc * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 1.3 jdc * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 1.3 jdc * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 1.3 jdc * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 1.3 jdc * POSSIBILITY OF SUCH DAMAGE.
37 1.1 mrg */
38 1.6 blymn
39 1.6 blymn #include <sys/cdefs.h>
40 1.6 blymn #ifndef lint
41 1.12 jdc __RCSID("$NetBSD: attributes.c,v 1.12 2003/03/30 07:38:42 jdc Exp $");
42 1.6 blymn #endif /* not lint */
43 1.1 mrg
44 1.1 mrg #include "curses.h"
45 1.2 blymn #include "curses_private.h"
46 1.1 mrg
47 1.12 jdc void __wcolor_set(WINDOW *, attr_t);
48 1.12 jdc
49 1.4 blymn #ifndef _CURSES_USE_MACROS
50 1.4 blymn /*
51 1.12 jdc * attr_get --
52 1.12 jdc * Get attributes and color pair from stdscr
53 1.12 jdc */
54 1.12 jdc /* ARGSUSED */
55 1.12 jdc int
56 1.12 jdc attr_get(attr_t *attr, short *pair, void *opt)
57 1.12 jdc {
58 1.12 jdc return wattr_get(stdscr, attr, pair, opt);
59 1.12 jdc }
60 1.12 jdc
61 1.12 jdc /*
62 1.12 jdc * attr_on --
63 1.12 jdc * Test and set attributes on stdscr
64 1.12 jdc */
65 1.12 jdc /* ARGSUSED */
66 1.12 jdc int
67 1.12 jdc attr_on(attr_t attr, void *opt)
68 1.12 jdc {
69 1.12 jdc return wattr_on(stdscr, attr, opt);
70 1.12 jdc }
71 1.12 jdc
72 1.12 jdc /*
73 1.12 jdc * attr_off --
74 1.12 jdc * Test and unset attributes on stdscr
75 1.12 jdc */
76 1.12 jdc /* ARGSUSED */
77 1.12 jdc int
78 1.12 jdc attr_off(attr_t attr, void *opt)
79 1.12 jdc {
80 1.12 jdc return wattr_off(stdscr, attr, opt);
81 1.12 jdc }
82 1.12 jdc
83 1.12 jdc /*
84 1.12 jdc * attr_set --
85 1.12 jdc * Set attributes and color pair on stdscr
86 1.12 jdc */
87 1.12 jdc /* ARGSUSED */
88 1.12 jdc int
89 1.12 jdc attr_set(attr_t attr, short pair, void *opt)
90 1.12 jdc {
91 1.12 jdc return wattr_set(stdscr, attr, pair, opt);
92 1.12 jdc }
93 1.12 jdc
94 1.12 jdc /*
95 1.12 jdc * color_set --
96 1.12 jdc * Set color pair on stdscr
97 1.12 jdc */
98 1.12 jdc /* ARGSUSED */
99 1.12 jdc int
100 1.12 jdc color_set(short pair, void *opt)
101 1.12 jdc {
102 1.12 jdc return wcolor_set(stdscr, pair, opt);
103 1.12 jdc }
104 1.12 jdc
105 1.12 jdc /*
106 1.8 jdc * attron --
107 1.4 blymn * Test and set attributes on stdscr
108 1.4 blymn */
109 1.4 blymn int
110 1.4 blymn attron(int attr)
111 1.4 blymn {
112 1.12 jdc return wattr_on(stdscr, (attr_t) attr, NULL);
113 1.4 blymn }
114 1.4 blymn
115 1.4 blymn /*
116 1.8 jdc * attroff --
117 1.4 blymn * Test and unset attributes on stdscr.
118 1.4 blymn */
119 1.4 blymn int
120 1.4 blymn attroff(int attr)
121 1.4 blymn {
122 1.12 jdc return wattr_off(stdscr, (attr_t) attr, NULL);
123 1.4 blymn }
124 1.4 blymn
125 1.4 blymn /*
126 1.8 jdc * attrset --
127 1.4 blymn * Set specific attribute modes.
128 1.4 blymn * Unset others. On stdscr.
129 1.4 blymn */
130 1.4 blymn int
131 1.4 blymn attrset(int attr)
132 1.4 blymn {
133 1.4 blymn return wattrset(stdscr, attr);
134 1.4 blymn }
135 1.12 jdc #endif /* _CURSES_USE_MACROS */
136 1.4 blymn
137 1.12 jdc /*
138 1.12 jdc * wattr_get --
139 1.12 jdc * Get attributes and colour pair from window
140 1.12 jdc * Note that attributes also includes colour.
141 1.12 jdc */
142 1.12 jdc /* ARGSUSED */
143 1.12 jdc int
144 1.12 jdc wattr_get(WINDOW *win, attr_t *attr, short *pair, void *opt)
145 1.12 jdc {
146 1.12 jdc #ifdef DEBUG
147 1.12 jdc __CTRACE ("wattr_get: win %p\n", win);
148 1.4 blymn #endif
149 1.12 jdc if (attr != NULL)
150 1.12 jdc *attr = win->wattr;
151 1.12 jdc if (pair != NULL)
152 1.12 jdc *pair = PAIR_NUMBER(win->wattr);
153 1.12 jdc return OK;
154 1.12 jdc }
155 1.4 blymn
156 1.1 mrg /*
157 1.12 jdc * wattr_on --
158 1.12 jdc * Test and set attributes on stdscr
159 1.1 mrg *
160 1.1 mrg * Modes are blinking, bold (extra bright), dim (half-bright),
161 1.1 mrg * blanking (invisible), protected and reverse video
162 1.1 mrg */
163 1.12 jdc /* ARGSUSED */
164 1.1 mrg int
165 1.12 jdc wattr_on(WINDOW *win, attr_t attr, void *opt)
166 1.1 mrg {
167 1.3 jdc #ifdef DEBUG
168 1.12 jdc __CTRACE ("wattr_on: win %p, attr %08x\n", win, attr);
169 1.3 jdc #endif
170 1.7 mycroft /* If can enter modes, set the relevent attribute bits. */
171 1.9 jdc if (__tc_me != NULL) {
172 1.12 jdc if (attr & __BLINK && __tc_mb != NULL)
173 1.2 blymn win->wattr |= __BLINK;
174 1.12 jdc if (attr & __BOLD && __tc_md != NULL)
175 1.2 blymn win->wattr |= __BOLD;
176 1.12 jdc if (attr & __DIM && __tc_mh != NULL)
177 1.2 blymn win->wattr |= __DIM;
178 1.12 jdc if (attr & __BLANK && __tc_mk != NULL)
179 1.2 blymn win->wattr |= __BLANK;
180 1.12 jdc if (attr & __PROTECT && __tc_mp != NULL)
181 1.2 blymn win->wattr |= __PROTECT;
182 1.12 jdc if (attr & __REVERSE && __tc_mr != NULL)
183 1.2 blymn win->wattr |= __REVERSE;
184 1.1 mrg }
185 1.12 jdc if (attr & __STANDOUT)
186 1.2 blymn wstandout(win);
187 1.12 jdc if (attr & __UNDERSCORE)
188 1.1 mrg wunderscore(win);
189 1.12 jdc if ((attr_t) attr & __COLOR)
190 1.12 jdc __wcolor_set(win, (attr_t) attr);
191 1.12 jdc return OK;
192 1.1 mrg }
193 1.1 mrg
194 1.1 mrg /*
195 1.12 jdc * wattr_off --
196 1.12 jdc * Test and unset attributes on stdscr
197 1.1 mrg *
198 1.1 mrg * Note that the 'me' sequence unsets all attributes. We handle
199 1.1 mrg * which attributes should really be set in refresh.c:makech().
200 1.1 mrg */
201 1.12 jdc /* ARGSUSED */
202 1.1 mrg int
203 1.12 jdc wattr_off(WINDOW *win, attr_t attr, void *opt)
204 1.1 mrg {
205 1.3 jdc #ifdef DEBUG
206 1.12 jdc __CTRACE ("wattr_off: win %p, attr %08x\n", win, attr);
207 1.3 jdc #endif
208 1.3 jdc /* If can do exit modes, unset the relevent attribute bits. */
209 1.9 jdc if (__tc_me != NULL) {
210 1.12 jdc if (attr & __BLINK)
211 1.2 blymn win->wattr &= ~__BLINK;
212 1.12 jdc if (attr & __BOLD)
213 1.2 blymn win->wattr &= ~__BOLD;
214 1.12 jdc if (attr & __DIM)
215 1.2 blymn win->wattr &= ~__DIM;
216 1.12 jdc if (attr & __BLANK)
217 1.2 blymn win->wattr &= ~__BLANK;
218 1.12 jdc if (attr & __PROTECT)
219 1.2 blymn win->wattr &= ~__PROTECT;
220 1.12 jdc if (attr & __REVERSE)
221 1.2 blymn win->wattr &= ~__REVERSE;
222 1.1 mrg }
223 1.12 jdc if (attr & __STANDOUT)
224 1.2 blymn wstandend(win);
225 1.12 jdc if (attr & __UNDERSCORE)
226 1.1 mrg wunderend(win);
227 1.3 jdc if ((attr_t) attr & __COLOR) {
228 1.9 jdc if (__tc_Co != NULL)
229 1.3 jdc win->wattr &= ~__COLOR;
230 1.3 jdc }
231 1.12 jdc return OK;
232 1.12 jdc }
233 1.12 jdc
234 1.12 jdc /*
235 1.12 jdc * wattr_set --
236 1.12 jdc * Set attributes and color pair on stdscr
237 1.12 jdc */
238 1.12 jdc /* ARGSUSED */
239 1.12 jdc int
240 1.12 jdc wattr_set(WINDOW *win, attr_t attr, short pair, void *opt)
241 1.12 jdc {
242 1.12 jdc #ifdef DEBUG
243 1.12 jdc __CTRACE ("wattr_set: win %p, attr %08x, pair %d\n", win, attr, pair);
244 1.12 jdc #endif
245 1.12 jdc wattr_on(win, attr, NULL);
246 1.12 jdc wattr_off(win, (~attr & ~__COLOR) | ((attr & __COLOR) ? 0 : __COLOR),
247 1.12 jdc NULL);
248 1.12 jdc /*
249 1.12 jdc * This overwrites any colour setting from the attributes
250 1.12 jdc * and is compatible with ncurses.
251 1.12 jdc */
252 1.12 jdc __wcolor_set(win, (attr_t) COLOR_PAIR(pair));
253 1.12 jdc return OK;
254 1.12 jdc }
255 1.12 jdc
256 1.12 jdc /*
257 1.12 jdc * wattron --
258 1.12 jdc * Test and set attributes.
259 1.12 jdc */
260 1.12 jdc
261 1.12 jdc int
262 1.12 jdc wattron(WINDOW *win, int attr)
263 1.12 jdc {
264 1.12 jdc #ifdef DEBUG
265 1.12 jdc __CTRACE ("wattron: win %p, attr %08x\n", win, attr);
266 1.12 jdc #endif
267 1.12 jdc return wattr_on(win, (attr_t) attr, NULL);
268 1.12 jdc }
269 1.12 jdc
270 1.12 jdc /*
271 1.12 jdc * wattroff --
272 1.12 jdc * Test and unset attributes.
273 1.12 jdc */
274 1.12 jdc int
275 1.12 jdc wattroff(WINDOW *win, int attr)
276 1.12 jdc {
277 1.12 jdc #ifdef DEBUG
278 1.12 jdc __CTRACE ("wattroff: win %p, attr %08x\n", win, attr);
279 1.12 jdc #endif
280 1.12 jdc return wattr_off(win, (attr_t) attr, NULL);
281 1.1 mrg }
282 1.1 mrg
283 1.1 mrg /*
284 1.8 jdc * wattrset --
285 1.1 mrg * Set specific attribute modes.
286 1.1 mrg * Unset others.
287 1.1 mrg */
288 1.1 mrg int
289 1.4 blymn wattrset(WINDOW *win, int attr)
290 1.1 mrg {
291 1.5 jdc #ifdef DEBUG
292 1.11 dsl __CTRACE ("wattrset: win %p, attr %08x\n", win, attr);
293 1.5 jdc #endif
294 1.12 jdc wattr_on(win, (attr_t) attr, NULL);
295 1.12 jdc wattr_off(win,
296 1.12 jdc (attr_t) (~attr & ~__COLOR) | ((attr & __COLOR) ? 0 : __COLOR),
297 1.12 jdc NULL);
298 1.12 jdc return OK;
299 1.12 jdc }
300 1.12 jdc
301 1.12 jdc /*
302 1.12 jdc * wcolor_set --
303 1.12 jdc * Set color pair on window
304 1.12 jdc */
305 1.12 jdc /* ARGSUSED */
306 1.12 jdc int
307 1.12 jdc wcolor_set(WINDOW *win, short pair, void *opt)
308 1.12 jdc {
309 1.12 jdc #ifdef DEBUG
310 1.12 jdc __CTRACE ("wolor_set: win %p, pair %%d\n", win, pair);
311 1.12 jdc #endif
312 1.12 jdc __wcolor_set(win, (attr_t) COLOR_PAIR(pair));
313 1.12 jdc return OK;
314 1.8 jdc }
315 1.8 jdc
316 1.8 jdc /*
317 1.8 jdc * getattrs --
318 1.8 jdc * Get window attributes.
319 1.8 jdc */
320 1.8 jdc chtype
321 1.8 jdc getattrs(WINDOW *win)
322 1.8 jdc {
323 1.8 jdc #ifdef DEBUG
324 1.11 dsl __CTRACE ("getattrs: win %p\n", win);
325 1.8 jdc #endif
326 1.8 jdc return((chtype) win->wattr);
327 1.12 jdc }
328 1.12 jdc
329 1.12 jdc /*
330 1.12 jdc * __wcolor_set --
331 1.12 jdc * Set color attribute on window
332 1.12 jdc */
333 1.12 jdc void
334 1.12 jdc __wcolor_set(WINDOW *win, attr_t attr)
335 1.12 jdc {
336 1.12 jdc /* If another color pair is set, turn that off first. */
337 1.12 jdc win->wattr &= ~__COLOR;
338 1.12 jdc /* If can do color video, set the color pair bits. */
339 1.12 jdc if (__tc_Co != NULL && attr & __COLOR)
340 1.12 jdc win->wattr |= attr & __COLOR;
341 1.1 mrg }
342