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