xref: /minix3/lib/libcurses/background.c (revision 51ffecc181005cb45a40108612ee28d1daaeeb86)
1*51ffecc1SBen Gras /*	$NetBSD: background.c,v 1.15 2009/07/22 16:57:14 roy Exp $	*/
2*51ffecc1SBen Gras 
3*51ffecc1SBen Gras /*-
4*51ffecc1SBen Gras  * Copyright (c) 2000 The NetBSD Foundation, Inc.
5*51ffecc1SBen Gras  * All rights reserved.
6*51ffecc1SBen Gras  *
7*51ffecc1SBen Gras  * This code is derived from software contributed to The NetBSD Foundation
8*51ffecc1SBen Gras  * by Julian Coleman.
9*51ffecc1SBen Gras  *
10*51ffecc1SBen Gras  * Redistribution and use in source and binary forms, with or without
11*51ffecc1SBen Gras  * modification, are permitted provided that the following conditions
12*51ffecc1SBen Gras  * are met:
13*51ffecc1SBen Gras  * 1. Redistributions of source code must retain the above copyright
14*51ffecc1SBen Gras  *    notice, this list of conditions and the following disclaimer.
15*51ffecc1SBen Gras  * 2. Redistributions in binary form must reproduce the above copyright
16*51ffecc1SBen Gras  *    notice, this list of conditions and the following disclaimer in the
17*51ffecc1SBen Gras  *    documentation and/or other materials provided with the distribution.
18*51ffecc1SBen Gras  *
19*51ffecc1SBen Gras  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20*51ffecc1SBen Gras  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21*51ffecc1SBen Gras  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22*51ffecc1SBen Gras  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23*51ffecc1SBen Gras  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*51ffecc1SBen Gras  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*51ffecc1SBen Gras  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*51ffecc1SBen Gras  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*51ffecc1SBen Gras  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*51ffecc1SBen Gras  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*51ffecc1SBen Gras  * POSSIBILITY OF SUCH DAMAGE.
30*51ffecc1SBen Gras  */
31*51ffecc1SBen Gras 
32*51ffecc1SBen Gras #include <sys/cdefs.h>
33*51ffecc1SBen Gras #ifndef lint
34*51ffecc1SBen Gras __RCSID("$NetBSD: background.c,v 1.15 2009/07/22 16:57:14 roy Exp $");
35*51ffecc1SBen Gras #endif				/* not lint */
36*51ffecc1SBen Gras 
37*51ffecc1SBen Gras #include <stdlib.h>
38*51ffecc1SBen Gras #include "curses.h"
39*51ffecc1SBen Gras #include "curses_private.h"
40*51ffecc1SBen Gras 
41*51ffecc1SBen Gras /*
42*51ffecc1SBen Gras  * bkgdset
43*51ffecc1SBen Gras  *	Set new background attributes on stdscr.
44*51ffecc1SBen Gras  */
45*51ffecc1SBen Gras void
bkgdset(chtype ch)46*51ffecc1SBen Gras bkgdset(chtype ch)
47*51ffecc1SBen Gras {
48*51ffecc1SBen Gras 	wbkgdset(stdscr, ch);
49*51ffecc1SBen Gras }
50*51ffecc1SBen Gras 
51*51ffecc1SBen Gras /*
52*51ffecc1SBen Gras  * bkgd --
53*51ffecc1SBen Gras  *	Set new background and new background attributes on stdscr.
54*51ffecc1SBen Gras  */
55*51ffecc1SBen Gras int
bkgd(chtype ch)56*51ffecc1SBen Gras bkgd(chtype ch)
57*51ffecc1SBen Gras {
58*51ffecc1SBen Gras 	return(wbkgd(stdscr, ch));
59*51ffecc1SBen Gras }
60*51ffecc1SBen Gras 
61*51ffecc1SBen Gras /*
62*51ffecc1SBen Gras  * wbkgdset
63*51ffecc1SBen Gras  *	Set new background attributes.
64*51ffecc1SBen Gras  */
65*51ffecc1SBen Gras void
wbkgdset(WINDOW * win,chtype ch)66*51ffecc1SBen Gras wbkgdset(WINDOW *win, chtype ch)
67*51ffecc1SBen Gras {
68*51ffecc1SBen Gras #ifdef DEBUG
69*51ffecc1SBen Gras 	__CTRACE(__CTRACE_ATTR, "wbkgdset: (%p), '%s', %08x\n",
70*51ffecc1SBen Gras 	    win, unctrl(ch & +__CHARTEXT), ch & __ATTRIBUTES);
71*51ffecc1SBen Gras #endif
72*51ffecc1SBen Gras 
73*51ffecc1SBen Gras 	/* Background character. */
74*51ffecc1SBen Gras 	if (ch & __CHARTEXT)
75*51ffecc1SBen Gras 		win->bch = (wchar_t) ch & __CHARTEXT;
76*51ffecc1SBen Gras 
77*51ffecc1SBen Gras 	/* Background attributes (check colour). */
78*51ffecc1SBen Gras 	if (__using_color && !(ch & __COLOR))
79*51ffecc1SBen Gras 		ch |= __default_color;
80*51ffecc1SBen Gras 	win->battr = (attr_t) ch & __ATTRIBUTES;
81*51ffecc1SBen Gras }
82*51ffecc1SBen Gras 
83*51ffecc1SBen Gras /*
84*51ffecc1SBen Gras  * wbkgd --
85*51ffecc1SBen Gras  *	Set new background and new background attributes.
86*51ffecc1SBen Gras  */
87*51ffecc1SBen Gras int
wbkgd(WINDOW * win,chtype ch)88*51ffecc1SBen Gras wbkgd(WINDOW *win, chtype ch)
89*51ffecc1SBen Gras {
90*51ffecc1SBen Gras 	int	y, x;
91*51ffecc1SBen Gras 
92*51ffecc1SBen Gras #ifdef DEBUG
93*51ffecc1SBen Gras 	__CTRACE(__CTRACE_ATTR, "wbkgd: (%p), '%s', %08x\n",
94*51ffecc1SBen Gras 	    win, unctrl(ch & +__CHARTEXT), ch & __ATTRIBUTES);
95*51ffecc1SBen Gras #endif
96*51ffecc1SBen Gras 
97*51ffecc1SBen Gras 	/* Background attributes (check colour). */
98*51ffecc1SBen Gras 	if (__using_color && !(ch & __COLOR))
99*51ffecc1SBen Gras 		ch |= __default_color;
100*51ffecc1SBen Gras 
101*51ffecc1SBen Gras 	win->battr = (attr_t) ch & __ATTRIBUTES;
102*51ffecc1SBen Gras 	wbkgdset(win, ch);
103*51ffecc1SBen Gras 	for (y = 0; y < win->maxy; y++)
104*51ffecc1SBen Gras 		for (x = 0; x < win->maxx; x++) {
105*51ffecc1SBen Gras 			/* Copy character if space */
106*51ffecc1SBen Gras 			if (ch & A_CHARTEXT && win->alines[y]->line[x].ch == ' ')
107*51ffecc1SBen Gras 				win->alines[y]->line[x].ch = ch & __CHARTEXT;
108*51ffecc1SBen Gras 			/* Merge attributes */
109*51ffecc1SBen Gras 			if (win->alines[y]->line[x].attr & __ALTCHARSET)
110*51ffecc1SBen Gras 				win->alines[y]->line[x].attr =
111*51ffecc1SBen Gras 				    (ch & __ATTRIBUTES) | __ALTCHARSET;
112*51ffecc1SBen Gras 			else
113*51ffecc1SBen Gras 				win->alines[y]->line[x].attr =
114*51ffecc1SBen Gras 				    ch & __ATTRIBUTES;
115*51ffecc1SBen Gras #ifdef HAVE_WCHAR
116*51ffecc1SBen Gras 			SET_WCOL(win->alines[y]->line[x], 1);
117*51ffecc1SBen Gras #endif
118*51ffecc1SBen Gras 		}
119*51ffecc1SBen Gras 	__touchwin(win);
120*51ffecc1SBen Gras 	return(OK);
121*51ffecc1SBen Gras }
122*51ffecc1SBen Gras 
123*51ffecc1SBen Gras /*
124*51ffecc1SBen Gras  * getbkgd --
125*51ffecc1SBen Gras  *	Get current background attributes.
126*51ffecc1SBen Gras  */
127*51ffecc1SBen Gras chtype
getbkgd(WINDOW * win)128*51ffecc1SBen Gras getbkgd(WINDOW *win)
129*51ffecc1SBen Gras {
130*51ffecc1SBen Gras 	attr_t	battr;
131*51ffecc1SBen Gras 
132*51ffecc1SBen Gras 	/* Background attributes (check colour). */
133*51ffecc1SBen Gras 	battr = win->battr & A_ATTRIBUTES;
134*51ffecc1SBen Gras 	if (__using_color && ((battr & __COLOR) == __default_color))
135*51ffecc1SBen Gras 		battr &= ~__default_color;
136*51ffecc1SBen Gras 
137*51ffecc1SBen Gras 	return ((chtype) ((win->bch & A_CHARTEXT) | battr));
138*51ffecc1SBen Gras }
139*51ffecc1SBen Gras 
bkgrnd(const cchar_t * wch)140*51ffecc1SBen Gras int bkgrnd(const cchar_t *wch)
141*51ffecc1SBen Gras {
142*51ffecc1SBen Gras #ifndef HAVE_WCHAR
143*51ffecc1SBen Gras 	return ERR;
144*51ffecc1SBen Gras #else
145*51ffecc1SBen Gras 	return wbkgrnd( stdscr, wch );
146*51ffecc1SBen Gras #endif /* HAVE_WCHAR */
147*51ffecc1SBen Gras }
148*51ffecc1SBen Gras 
bkgrndset(const cchar_t * wch)149*51ffecc1SBen Gras void bkgrndset(const cchar_t *wch)
150*51ffecc1SBen Gras {
151*51ffecc1SBen Gras #ifdef HAVE_WCHAR
152*51ffecc1SBen Gras 	wbkgrndset( stdscr, wch );
153*51ffecc1SBen Gras #endif /* HAVE_WCHAR */
154*51ffecc1SBen Gras }
155*51ffecc1SBen Gras 
getbkgrnd(cchar_t * wch)156*51ffecc1SBen Gras int getbkgrnd(cchar_t *wch)
157*51ffecc1SBen Gras {
158*51ffecc1SBen Gras #ifndef HAVE_WCHAR
159*51ffecc1SBen Gras 	return ERR;
160*51ffecc1SBen Gras #else
161*51ffecc1SBen Gras 	return wgetbkgrnd( stdscr, wch );
162*51ffecc1SBen Gras #endif /* HAVE_WCHAR */
163*51ffecc1SBen Gras }
164*51ffecc1SBen Gras 
wbkgrnd(WINDOW * win,const cchar_t * wch)165*51ffecc1SBen Gras int wbkgrnd(WINDOW *win, const cchar_t *wch)
166*51ffecc1SBen Gras {
167*51ffecc1SBen Gras #ifndef HAVE_WCHAR
168*51ffecc1SBen Gras 	return ERR;
169*51ffecc1SBen Gras #else
170*51ffecc1SBen Gras /* 	int	y, x, i; */
171*51ffecc1SBen Gras 	attr_t battr;
172*51ffecc1SBen Gras /* 	nschar_t *np, *tnp, *pnp; */
173*51ffecc1SBen Gras 
174*51ffecc1SBen Gras #ifdef DEBUG
175*51ffecc1SBen Gras 	__CTRACE(__CTRACE_ATTR, "wbkgrnd: (%p), '%s', %x\n",
176*51ffecc1SBen Gras 		win, (const char *) wunctrl(wch), wch->attributes);
177*51ffecc1SBen Gras #endif
178*51ffecc1SBen Gras 
179*51ffecc1SBen Gras 	/* ignore multi-column characters */
180*51ffecc1SBen Gras 	if ( !wch->elements || wcwidth( wch->vals[ 0 ]) > 1 )
181*51ffecc1SBen Gras 		return ERR;
182*51ffecc1SBen Gras 
183*51ffecc1SBen Gras 	/* Background attributes (check colour). */
184*51ffecc1SBen Gras 	battr = wch->attributes & WA_ATTRIBUTES;
185*51ffecc1SBen Gras 	if (__using_color && !( battr & __COLOR))
186*51ffecc1SBen Gras 		battr |= __default_color;
187*51ffecc1SBen Gras 
188*51ffecc1SBen Gras 	win->battr = battr;
189*51ffecc1SBen Gras 	wbkgrndset(win, wch);
190*51ffecc1SBen Gras 	__touchwin(win);
191*51ffecc1SBen Gras 	return OK;
192*51ffecc1SBen Gras #endif /* HAVE_WCHAR */
193*51ffecc1SBen Gras }
194*51ffecc1SBen Gras 
wbkgrndset(WINDOW * win,const cchar_t * wch)195*51ffecc1SBen Gras void wbkgrndset(WINDOW *win, const cchar_t *wch)
196*51ffecc1SBen Gras {
197*51ffecc1SBen Gras #ifdef HAVE_WCHAR
198*51ffecc1SBen Gras 	attr_t battr;
199*51ffecc1SBen Gras 	nschar_t *np, *tnp;
200*51ffecc1SBen Gras 	int i;
201*51ffecc1SBen Gras 
202*51ffecc1SBen Gras #ifdef DEBUG
203*51ffecc1SBen Gras 	__CTRACE(__CTRACE_ATTR, "wbkgrndset: (%p), '%s', %x\n",
204*51ffecc1SBen Gras 		win, (const char *) wunctrl(wch), wch->attributes);
205*51ffecc1SBen Gras #endif
206*51ffecc1SBen Gras 
207*51ffecc1SBen Gras 	/* ignore multi-column characters */
208*51ffecc1SBen Gras 	if ( !wch->elements || wcwidth( wch->vals[ 0 ]) > 1 )
209*51ffecc1SBen Gras 		return;
210*51ffecc1SBen Gras 
211*51ffecc1SBen Gras 	/* Background character. */
212*51ffecc1SBen Gras 	tnp = np = win->bnsp;
213*51ffecc1SBen Gras 	if ( wcwidth( wch->vals[ 0 ]))
214*51ffecc1SBen Gras 		win->bch = wch->vals[ 0 ];
215*51ffecc1SBen Gras 	else {
216*51ffecc1SBen Gras 		if ( !np ) {
217*51ffecc1SBen Gras 			np = (nschar_t *)malloc(sizeof(nschar_t));
218*51ffecc1SBen Gras 			if (!np)
219*51ffecc1SBen Gras 				return;
220*51ffecc1SBen Gras 			np->next = NULL;
221*51ffecc1SBen Gras 			win->bnsp = np;
222*51ffecc1SBen Gras 		}
223*51ffecc1SBen Gras 		np->ch = wch->vals[ 0 ];
224*51ffecc1SBen Gras 		tnp = np;
225*51ffecc1SBen Gras 		np = np->next;
226*51ffecc1SBen Gras 	}
227*51ffecc1SBen Gras 	/* add non-spacing characters */
228*51ffecc1SBen Gras 	if ( wch->elements > 1 ) {
229*51ffecc1SBen Gras 		for ( i = 1; i < wch->elements; i++ ) {
230*51ffecc1SBen Gras 			if ( !np ) {
231*51ffecc1SBen Gras 				np = (nschar_t *)malloc(sizeof(nschar_t));
232*51ffecc1SBen Gras 				if (!np)
233*51ffecc1SBen Gras 					return;
234*51ffecc1SBen Gras 				np->next = NULL;
235*51ffecc1SBen Gras 				if ( tnp )
236*51ffecc1SBen Gras 					tnp->next = np;
237*51ffecc1SBen Gras 				else
238*51ffecc1SBen Gras 					win->bnsp = np;
239*51ffecc1SBen Gras 			}
240*51ffecc1SBen Gras 			np->ch = wch->vals[ i ];
241*51ffecc1SBen Gras 			tnp = np;
242*51ffecc1SBen Gras 			np = np->next;
243*51ffecc1SBen Gras 		}
244*51ffecc1SBen Gras 	}
245*51ffecc1SBen Gras 	/* clear the old non-spacing characters */
246*51ffecc1SBen Gras 	while ( np ) {
247*51ffecc1SBen Gras 		tnp = np->next;
248*51ffecc1SBen Gras 		free( np );
249*51ffecc1SBen Gras 		np = tnp;
250*51ffecc1SBen Gras 	}
251*51ffecc1SBen Gras 
252*51ffecc1SBen Gras 	/* Background attributes (check colour). */
253*51ffecc1SBen Gras 	battr = wch->attributes & WA_ATTRIBUTES;
254*51ffecc1SBen Gras 	if (__using_color && !( battr & __COLOR))
255*51ffecc1SBen Gras 		battr |= __default_color;
256*51ffecc1SBen Gras 	win->battr = battr;
257*51ffecc1SBen Gras 	SET_BGWCOL((*win), 1);
258*51ffecc1SBen Gras #endif /* HAVE_WCHAR */
259*51ffecc1SBen Gras }
260*51ffecc1SBen Gras 
wgetbkgrnd(WINDOW * win,cchar_t * wch)261*51ffecc1SBen Gras int wgetbkgrnd(WINDOW *win, cchar_t *wch)
262*51ffecc1SBen Gras {
263*51ffecc1SBen Gras #ifndef HAVE_WCHAR
264*51ffecc1SBen Gras 	return ERR;
265*51ffecc1SBen Gras #else
266*51ffecc1SBen Gras 	nschar_t *np;
267*51ffecc1SBen Gras 
268*51ffecc1SBen Gras 	/* Background attributes (check colour). */
269*51ffecc1SBen Gras 	wch->attributes = win->battr & WA_ATTRIBUTES;
270*51ffecc1SBen Gras 	if (__using_color && (( wch->attributes & __COLOR )
271*51ffecc1SBen Gras 			== __default_color))
272*51ffecc1SBen Gras 		wch->attributes &= ~__default_color;
273*51ffecc1SBen Gras 	wch->vals[ 0 ] = win->bch;
274*51ffecc1SBen Gras 	wch->elements = 1;
275*51ffecc1SBen Gras 	np = win->bnsp;
276*51ffecc1SBen Gras 	if (np) {
277*51ffecc1SBen Gras 		while ( np && wch->elements < CURSES_CCHAR_MAX ) {
278*51ffecc1SBen Gras 			wch->vals[ wch->elements++ ] = np->ch;
279*51ffecc1SBen Gras 			np = np->next;
280*51ffecc1SBen Gras 		}
281*51ffecc1SBen Gras 	}
282*51ffecc1SBen Gras 
283*51ffecc1SBen Gras 	return OK;
284*51ffecc1SBen Gras #endif /* HAVE_WCHAR */
285*51ffecc1SBen Gras }
286