wbkgrnd.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright (c) 1995-1998 by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26
27#pragma ident	"%Z%%M%	%I%	%E% SMI"
28
29/* LINTLIBRARY */
30
31/*
32 * wbkgrnd.c
33 *
34 * XCurses Library
35 *
36 * Copyright 1990, 1995 by Mortice Kern Systems Inc.  All rights reserved.
37 *
38 */
39
40#ifdef M_RCSID
41#ifndef lint
42static char rcsID[] =
43"$Header: /team/ps/sun_xcurses/archive/local_changes/xcurses/src/lib/"
44"libxcurses/src/libc/xcurses/rcs/wbkgrnd.c 1.11 1998/05/29 14:48:51 "
45"cbates Exp $";
46#endif
47#endif
48
49#include <private.h>
50
51/*
52 * Combine the new background setting with every position in the window.
53 * The background is any combination of attributes and a character.
54 * Only the attribute part is used to set the background of non-blank
55 * characters, while both character and attributes are used for blank
56 * positions.
57 */
58int
59wbkgrnd(WINDOW *w, const cchar_t *bg)
60{
61	short	y, x;
62	short	acolor;
63	cchar_t	old_bg, *cp;
64
65	old_bg = w->_bg;
66	w->_bg = *bg;
67	w->_fg._at = (w->_fg._at & ~old_bg._at) | bg->_at;
68
69	if ((acolor = w->_fg._co) != 0) {
70		if (acolor == old_bg._co) {
71			w->_fg._co = bg->_co;
72		}
73	} else {
74		w->_fg._co = bg->_co;
75	}
76
77	for (y = 0; y < w->_maxy; ++y) {
78		for (cp = w->_line[y], x = 0; x < w->_maxx; ++x, ++cp) {
79			int	_at = cp->_at;
80
81			old_bg._f = cp->_f;
82			acolor = cp->_co;
83			if (__m_cc_equal(cp, &old_bg)) {
84				*cp = *bg;
85			}
86			if (acolor != 0) {
87				if (acolor == old_bg._co) {
88					cp->_co = bg->_co;
89				} else {
90					cp->_co = acolor;
91				}
92			} else {
93				cp->_co = bg->_co;
94			}
95			cp->_at = (_at & ~old_bg._at) | bg->_at;
96		}
97
98		/* Mark line as touched. */
99		w->_first[y] = 0;
100		w->_last[y] = x;
101	}
102
103	WSYNC(w);
104
105	return (WFLUSH(w));
106}
107