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 42 static 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 */ 58 int 59 wbkgrnd(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