border.c revision 1.9 1 /* $NetBSD: border.c,v 1.9 2007/01/21 13:25:36 jdc Exp $ */
2
3 /*
4 * Copyright (c) 2000 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: border.c,v 1.9 2007/01/21 13:25:36 jdc Exp $");
42 #endif /* not lint */
43
44 #include "curses.h"
45 #include "curses_private.h"
46
47 #ifndef _CURSES_USE_MACROS
48
49 /*
50 * border --
51 * Draw a border around stdscr using the specified
52 * delimiting characters.
53 */
54 int
55 border(chtype left, chtype right, chtype top, chtype bottom, chtype topleft,
56 chtype topright, chtype botleft, chtype botright)
57 {
58 return wborder(stdscr, left, right, top, bottom, topleft, topright,
59 botleft, botright);
60 }
61
62 #endif
63
64 /*
65 * wborder --
66 * Draw a border around the given window using the specified delimiting
67 * characters.
68 */
69 int
70 wborder(WINDOW *win, chtype left, chtype right, chtype top, chtype bottom,
71 chtype topleft, chtype topright, chtype botleft, chtype botright)
72 {
73 int endy, endx, i;
74 __LDATA *fp, *lp;
75
76 if (!(left & __CHARTEXT))
77 left |= ACS_VLINE;
78 if (!(right & __CHARTEXT))
79 right |= ACS_VLINE;
80 if (!(top & __CHARTEXT))
81 top |= ACS_HLINE;
82 if (!(bottom & __CHARTEXT))
83 bottom |= ACS_HLINE;
84 if (!(topleft & __CHARTEXT))
85 topleft |= ACS_ULCORNER;
86 if (!(topright & __CHARTEXT))
87 topright |= ACS_URCORNER;
88 if (!(botleft & __CHARTEXT))
89 botleft |= ACS_LLCORNER;
90 if (!(botright & __CHARTEXT))
91 botright |= ACS_LRCORNER;
92
93 #ifdef DEBUG
94 __CTRACE(__CTRACE_INPUT, "wborder: left = %c, 0x%x\n",
95 left & __CHARTEXT, left & __ATTRIBUTES);
96 __CTRACE(__CTRACE_INPUT, "wborder: right = %c, 0x%x\n",
97 right & __CHARTEXT, right & __ATTRIBUTES);
98 __CTRACE(__CTRACE_INPUT, "wborder: top = %c, 0x%x\n",
99 top & __CHARTEXT, top & __ATTRIBUTES);
100 __CTRACE(__CTRACE_INPUT, "wborder: bottom = %c, 0x%x\n",
101 bottom & __CHARTEXT, bottom & __ATTRIBUTES);
102 __CTRACE(__CTRACE_INPUT, "wborder: topleft = %c, 0x%x\n",
103 topleft & __CHARTEXT, topleft & __ATTRIBUTES);
104 __CTRACE(__CTRACE_INPUT, "wborder: topright = %c, 0x%x\n",
105 topright & __CHARTEXT, topright & __ATTRIBUTES);
106 __CTRACE(__CTRACE_INPUT, "wborder: botleft = %c, 0x%x\n",
107 botleft & __CHARTEXT, botleft & __ATTRIBUTES);
108 __CTRACE(__CTRACE_INPUT, "wborder: botright = %c, 0x%x\n",
109 botright & __CHARTEXT, botright & __ATTRIBUTES);
110 #endif
111
112 /* Merge window and background attributes */
113 left |= (left & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr;
114 left |= (left & __COLOR) ? (win->battr & ~__COLOR) : win->battr;
115 right |= (right & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr;
116 right |= (right & __COLOR) ? (win->battr & ~__COLOR) : win->battr;
117 top |= (top & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr;
118 top |= (top & __COLOR) ? (win->battr & ~__COLOR) : win->battr;
119 bottom |= (bottom & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr;
120 bottom |= (bottom & __COLOR) ? (win->battr & ~__COLOR) : win->battr;
121 topleft |= (topleft & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr;
122 topleft |= (topleft & __COLOR) ? (win->battr & ~__COLOR) : win->battr;
123 topright |= (topright & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr;
124 topright |= (topright & __COLOR) ? (win->battr & ~__COLOR) : win->battr;
125 botleft |= (botleft & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr;
126 botleft |= (botleft & __COLOR) ? (win->battr & ~__COLOR) : win->battr;
127 botright |= (botright & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr;
128 botright |= (botright & __COLOR) ? (win->battr & ~__COLOR) : win->battr;
129
130 endx = win->maxx - 1;
131 endy = win->maxy - 1;
132 fp = win->lines[0]->line;
133 lp = win->lines[endy]->line;
134
135 /* Sides */
136 for (i = 1; i < endy; i++) {
137 win->lines[i]->line[0].ch = (wchar_t) left & __CHARTEXT;
138 win->lines[i]->line[0].attr = (attr_t) left & __ATTRIBUTES;
139 win->lines[i]->line[endx].ch = (wchar_t) right & __CHARTEXT;
140 win->lines[i]->line[endx].attr = (attr_t) right & __ATTRIBUTES;
141 }
142 for (i = 1; i < endx; i++) {
143 fp[i].ch = (wchar_t) top & __CHARTEXT;
144 fp[i].attr = (attr_t) top & __ATTRIBUTES;
145 lp[i].ch = (wchar_t) bottom & __CHARTEXT;
146 lp[i].attr = (attr_t) bottom & __ATTRIBUTES;
147 }
148
149 /* Corners */
150 if (!(win->maxx == LINES && win->maxy == COLS &&
151 (win->flags & __SCROLLOK) && (win->flags & __SCROLLWIN))) {
152 fp[0].ch = (wchar_t) topleft & __CHARTEXT;
153 fp[0].attr = (attr_t) topleft & __ATTRIBUTES;
154 fp[endx].ch = (wchar_t) topright & __CHARTEXT;
155 fp[endx].attr = (attr_t) topright & __ATTRIBUTES;
156 lp[0].ch = (wchar_t) botleft & __CHARTEXT;
157 lp[0].attr = (attr_t) botleft & __ATTRIBUTES;
158 lp[endx].ch = (wchar_t) botright & __CHARTEXT;
159 lp[endx].attr = (attr_t) botright & __ATTRIBUTES;
160 }
161 __touchwin(win);
162 return (OK);
163 }
164