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