1*fc962912Sjdc /* $NetBSD: border.c,v 1.15 2013/05/05 14:23:16 jdc Exp $ */ 223464ee5Sblymn 323464ee5Sblymn /* 423464ee5Sblymn * Copyright (c) 2000 The NetBSD Foundation, Inc. 523464ee5Sblymn * All rights reserved. 623464ee5Sblymn * 723464ee5Sblymn * This code is derived from software contributed to The NetBSD Foundation 823464ee5Sblymn * by Julian Coleman. 923464ee5Sblymn * 1023464ee5Sblymn * Redistribution and use in source and binary forms, with or without 1123464ee5Sblymn * modification, are permitted provided that the following conditions 1223464ee5Sblymn * are met: 1323464ee5Sblymn * 1. Redistributions of source code must retain the above copyright 1423464ee5Sblymn * notice, this list of conditions and the following disclaimer. 1523464ee5Sblymn * 2. Redistributions in binary form must reproduce the above copyright 1623464ee5Sblymn * notice, this list of conditions and the following disclaimer in the 1723464ee5Sblymn * documentation and/or other materials provided with the distribution. 1823464ee5Sblymn * 1923464ee5Sblymn * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 2023464ee5Sblymn * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2123464ee5Sblymn * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2223464ee5Sblymn * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 2323464ee5Sblymn * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2423464ee5Sblymn * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2523464ee5Sblymn * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2623464ee5Sblymn * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2723464ee5Sblymn * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2823464ee5Sblymn * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2923464ee5Sblymn * POSSIBILITY OF SUCH DAMAGE. 3023464ee5Sblymn */ 3123464ee5Sblymn 3266cab71cSblymn #include <sys/cdefs.h> 3366cab71cSblymn #ifndef lint 34*fc962912Sjdc __RCSID("$NetBSD: border.c,v 1.15 2013/05/05 14:23:16 jdc Exp $"); 3566cab71cSblymn #endif /* not lint */ 3666cab71cSblymn 37e124de36Sblymn #include <stdlib.h> 38e124de36Sblymn #include <string.h> 39e124de36Sblymn 4023464ee5Sblymn #include "curses.h" 4123464ee5Sblymn #include "curses_private.h" 4223464ee5Sblymn 43aaf74682Sblymn #ifndef _CURSES_USE_MACROS 44aaf74682Sblymn 45aaf74682Sblymn /* 46aaf74682Sblymn * border -- 47aaf74682Sblymn * Draw a border around stdscr using the specified 48aaf74682Sblymn * delimiting characters. 49aaf74682Sblymn */ 50aaf74682Sblymn int 51aaf74682Sblymn border(chtype left, chtype right, chtype top, chtype bottom, chtype topleft, 52aaf74682Sblymn chtype topright, chtype botleft, chtype botright) 53aaf74682Sblymn { 54aaf74682Sblymn return wborder(stdscr, left, right, top, bottom, topleft, topright, 55aaf74682Sblymn botleft, botright); 56aaf74682Sblymn } 57aaf74682Sblymn 58aaf74682Sblymn #endif 59aaf74682Sblymn 6023464ee5Sblymn /* 6123464ee5Sblymn * wborder -- 6223464ee5Sblymn * Draw a border around the given window using the specified delimiting 6323464ee5Sblymn * characters. 6423464ee5Sblymn */ 6523464ee5Sblymn int 66aaf74682Sblymn wborder(WINDOW *win, chtype left, chtype right, chtype top, chtype bottom, 67aaf74682Sblymn chtype topleft, chtype topright, chtype botleft, chtype botright) 6823464ee5Sblymn { 69452834f2Sdrochner #ifndef HAVE_WCHAR 7023464ee5Sblymn int endy, endx, i; 7123464ee5Sblymn __LDATA *fp, *lp; 7223464ee5Sblymn 738ce2f7e5Sjdc if (!(left & __CHARTEXT)) 748ce2f7e5Sjdc left |= ACS_VLINE; 758ce2f7e5Sjdc if (!(right & __CHARTEXT)) 768ce2f7e5Sjdc right |= ACS_VLINE; 778ce2f7e5Sjdc if (!(top & __CHARTEXT)) 788ce2f7e5Sjdc top |= ACS_HLINE; 798ce2f7e5Sjdc if (!(bottom & __CHARTEXT)) 808ce2f7e5Sjdc bottom |= ACS_HLINE; 818ce2f7e5Sjdc if (!(topleft & __CHARTEXT)) 828ce2f7e5Sjdc topleft |= ACS_ULCORNER; 838ce2f7e5Sjdc if (!(topright & __CHARTEXT)) 848ce2f7e5Sjdc topright |= ACS_URCORNER; 858ce2f7e5Sjdc if (!(botleft & __CHARTEXT)) 868ce2f7e5Sjdc botleft |= ACS_LLCORNER; 878ce2f7e5Sjdc if (!(botright & __CHARTEXT)) 888ce2f7e5Sjdc botright |= ACS_LRCORNER; 8923464ee5Sblymn 9023464ee5Sblymn #ifdef DEBUG 911f221324Sjdc __CTRACE(__CTRACE_INPUT, "wborder: left = %c, 0x%x\n", 921f221324Sjdc left & __CHARTEXT, left & __ATTRIBUTES); 931f221324Sjdc __CTRACE(__CTRACE_INPUT, "wborder: right = %c, 0x%x\n", 941f221324Sjdc right & __CHARTEXT, right & __ATTRIBUTES); 951f221324Sjdc __CTRACE(__CTRACE_INPUT, "wborder: top = %c, 0x%x\n", 961f221324Sjdc top & __CHARTEXT, top & __ATTRIBUTES); 971f221324Sjdc __CTRACE(__CTRACE_INPUT, "wborder: bottom = %c, 0x%x\n", 981f221324Sjdc bottom & __CHARTEXT, bottom & __ATTRIBUTES); 991f221324Sjdc __CTRACE(__CTRACE_INPUT, "wborder: topleft = %c, 0x%x\n", 1001f221324Sjdc topleft & __CHARTEXT, topleft & __ATTRIBUTES); 1011f221324Sjdc __CTRACE(__CTRACE_INPUT, "wborder: topright = %c, 0x%x\n", 1021f221324Sjdc topright & __CHARTEXT, topright & __ATTRIBUTES); 1031f221324Sjdc __CTRACE(__CTRACE_INPUT, "wborder: botleft = %c, 0x%x\n", 1041f221324Sjdc botleft & __CHARTEXT, botleft & __ATTRIBUTES); 1051f221324Sjdc __CTRACE(__CTRACE_INPUT, "wborder: botright = %c, 0x%x\n", 1061f221324Sjdc botright & __CHARTEXT, botright & __ATTRIBUTES); 10723464ee5Sblymn #endif 10823464ee5Sblymn 109978ab4adSjdc /* Merge window and background attributes */ 110e3317c27Sjdc left |= (left & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr; 111978ab4adSjdc left |= (left & __COLOR) ? (win->battr & ~__COLOR) : win->battr; 112e3317c27Sjdc right |= (right & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr; 113978ab4adSjdc right |= (right & __COLOR) ? (win->battr & ~__COLOR) : win->battr; 114e3317c27Sjdc top |= (top & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr; 115978ab4adSjdc top |= (top & __COLOR) ? (win->battr & ~__COLOR) : win->battr; 116e3317c27Sjdc bottom |= (bottom & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr; 117978ab4adSjdc bottom |= (bottom & __COLOR) ? (win->battr & ~__COLOR) : win->battr; 118e3317c27Sjdc topleft |= (topleft & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr; 119978ab4adSjdc topleft |= (topleft & __COLOR) ? (win->battr & ~__COLOR) : win->battr; 120e3317c27Sjdc topright |= (topright & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr; 121978ab4adSjdc topright |= (topright & __COLOR) ? (win->battr & ~__COLOR) : win->battr; 122e3317c27Sjdc botleft |= (botleft & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr; 123978ab4adSjdc botleft |= (botleft & __COLOR) ? (win->battr & ~__COLOR) : win->battr; 124e3317c27Sjdc botright |= (botright & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr; 125978ab4adSjdc botright |= (botright & __COLOR) ? (win->battr & ~__COLOR) : win->battr; 12623464ee5Sblymn 12723464ee5Sblymn endx = win->maxx - 1; 12823464ee5Sblymn endy = win->maxy - 1; 12943d5eb45Sroy fp = win->alines[0]->line; 13043d5eb45Sroy lp = win->alines[endy]->line; 13123464ee5Sblymn 13223464ee5Sblymn /* Sides */ 13323464ee5Sblymn for (i = 1; i < endy; i++) { 13443d5eb45Sroy win->alines[i]->line[0].ch = (wchar_t) left & __CHARTEXT; 13543d5eb45Sroy win->alines[i]->line[0].attr = (attr_t) left & __ATTRIBUTES; 13643d5eb45Sroy win->alines[i]->line[endx].ch = (wchar_t) right & __CHARTEXT; 13743d5eb45Sroy win->alines[i]->line[endx].attr = (attr_t) right & __ATTRIBUTES; 13823464ee5Sblymn } 13923464ee5Sblymn for (i = 1; i < endx; i++) { 14023464ee5Sblymn fp[i].ch = (wchar_t) top & __CHARTEXT; 14123464ee5Sblymn fp[i].attr = (attr_t) top & __ATTRIBUTES; 14223464ee5Sblymn lp[i].ch = (wchar_t) bottom & __CHARTEXT; 14323464ee5Sblymn lp[i].attr = (attr_t) bottom & __ATTRIBUTES; 14423464ee5Sblymn } 14523464ee5Sblymn 14623464ee5Sblymn /* Corners */ 14723464ee5Sblymn if (!(win->maxx == LINES && win->maxy == COLS && 14823464ee5Sblymn (win->flags & __SCROLLOK) && (win->flags & __SCROLLWIN))) { 14923464ee5Sblymn fp[0].ch = (wchar_t) topleft & __CHARTEXT; 15023464ee5Sblymn fp[0].attr = (attr_t) topleft & __ATTRIBUTES; 15123464ee5Sblymn fp[endx].ch = (wchar_t) topright & __CHARTEXT; 15223464ee5Sblymn fp[endx].attr = (attr_t) topright & __ATTRIBUTES; 15323464ee5Sblymn lp[0].ch = (wchar_t) botleft & __CHARTEXT; 15423464ee5Sblymn lp[0].attr = (attr_t) botleft & __ATTRIBUTES; 15523464ee5Sblymn lp[endx].ch = (wchar_t) botright & __CHARTEXT; 15623464ee5Sblymn lp[endx].attr = (attr_t) botright & __ATTRIBUTES; 15723464ee5Sblymn } 15823464ee5Sblymn __touchwin(win); 15923464ee5Sblymn return (OK); 160452834f2Sdrochner #else /* HAVE_WCHAR */ 161452834f2Sdrochner cchar_t ls, rs, ts, bs, tl, tr, bl, br; 162452834f2Sdrochner cchar_t *lsp, *rsp, *tsp, *bsp, *tlp, *trp, *blp, *brp; 163452834f2Sdrochner 164d31f9cfcSblymn #define S(in, out, def) \ 165452834f2Sdrochner if (in & __CHARTEXT) { \ 166452834f2Sdrochner __cursesi_chtype_to_cchar(in, &out); \ 167d31f9cfcSblymn } else { \ 168d31f9cfcSblymn memcpy(&out, def, sizeof(cchar_t)); \ 169d31f9cfcSblymn out.attributes |= in & __ATTRIBUTES; \ 170d31f9cfcSblymn } \ 171d31f9cfcSblymn out##p = &out; 172d31f9cfcSblymn 173d31f9cfcSblymn S(left, ls, WACS_VLINE); 174d31f9cfcSblymn S(right, rs, WACS_VLINE); 175d31f9cfcSblymn S(top, ts, WACS_HLINE); 176d31f9cfcSblymn S(bottom, bs, WACS_HLINE); 177d31f9cfcSblymn S(topleft, tl, WACS_ULCORNER); 178d31f9cfcSblymn S(topright, tr, WACS_URCORNER); 179d31f9cfcSblymn S(botleft, bl, WACS_LLCORNER); 180d31f9cfcSblymn S(botright, br, WACS_LRCORNER); 181452834f2Sdrochner #undef S 182452834f2Sdrochner return wborder_set(win, lsp, rsp, tsp, bsp, tlp, trp, blp, brp); 183452834f2Sdrochner #endif /* HAVE_WCHAR */ 18423464ee5Sblymn } 185e124de36Sblymn 186e124de36Sblymn int border_set(const cchar_t *ls, const cchar_t *rs, const cchar_t *ts, 187e124de36Sblymn const cchar_t *bs, const cchar_t *tl, const cchar_t *tr, 188e124de36Sblymn const cchar_t *bl, const cchar_t *br) 189e124de36Sblymn { 190e124de36Sblymn #ifndef HAVE_WCHAR 191e124de36Sblymn return ERR; 192e124de36Sblymn #else 193e124de36Sblymn return wborder_set(stdscr, ls, rs, ts, bs, tl, tr, bl, br); 194e124de36Sblymn #endif /* HAVE_WCHAR */ 195e124de36Sblymn } 196e124de36Sblymn 197e124de36Sblymn int wborder_set(WINDOW *win, const cchar_t *ls, const cchar_t *rs, 198e124de36Sblymn const cchar_t *ts, const cchar_t *bs, 199e124de36Sblymn const cchar_t *tl, const cchar_t *tr, 200e124de36Sblymn const cchar_t *bl, const cchar_t *br) 201e124de36Sblymn { 202e124de36Sblymn #ifndef HAVE_WCHAR 203e124de36Sblymn return ERR; 204e124de36Sblymn #else 205e124de36Sblymn int endy, endx, i, j, k, cw, pcw, tlcw, blcw, trcw, brcw; 206e124de36Sblymn cchar_t left, right, bottom, top, topleft, topright, botleft, botright; 207e124de36Sblymn nschar_t *np, *tnp; 208e124de36Sblymn 209e124de36Sblymn if ( ls && wcwidth( ls->vals[ 0 ])) 210e124de36Sblymn memcpy( &left, ls, sizeof( cchar_t )); 211e124de36Sblymn else 212452834f2Sdrochner memcpy( &left, WACS_VLINE, sizeof( cchar_t )); 213e124de36Sblymn if ( rs && wcwidth( rs->vals[ 0 ])) 214e124de36Sblymn memcpy( &right, rs, sizeof( cchar_t )); 215e124de36Sblymn else 216452834f2Sdrochner memcpy( &right, WACS_VLINE, sizeof( cchar_t )); 217e124de36Sblymn if ( ts && wcwidth( ts->vals[ 0 ])) 218e124de36Sblymn memcpy( &top, ts, sizeof( cchar_t )); 219e124de36Sblymn else 220452834f2Sdrochner memcpy( &top, WACS_HLINE, sizeof( cchar_t )); 221e124de36Sblymn if ( bs && wcwidth( bs->vals[ 0 ])) 222e124de36Sblymn memcpy( &bottom, bs, sizeof( cchar_t )); 223e124de36Sblymn else 224452834f2Sdrochner memcpy( &bottom, WACS_HLINE, sizeof( cchar_t )); 225e124de36Sblymn if ( tl && wcwidth( tl->vals[ 0 ])) 226e124de36Sblymn memcpy( &topleft, tl, sizeof( cchar_t )); 227e124de36Sblymn else 228452834f2Sdrochner memcpy( &topleft, WACS_ULCORNER, sizeof( cchar_t )); 229e124de36Sblymn if ( tr && wcwidth( tr->vals[ 0 ])) 230e124de36Sblymn memcpy( &topright, tr, sizeof( cchar_t )); 231e124de36Sblymn else 232452834f2Sdrochner memcpy( &topright, WACS_URCORNER, sizeof( cchar_t )); 233e124de36Sblymn if ( bl && wcwidth( bl->vals[ 0 ])) 234e124de36Sblymn memcpy( &botleft, bl, sizeof( cchar_t )); 235e124de36Sblymn else 236452834f2Sdrochner memcpy( &botleft, WACS_LLCORNER, sizeof( cchar_t )); 237e124de36Sblymn if ( br && wcwidth( br->vals[ 0 ])) 238e124de36Sblymn memcpy( &botright, br, sizeof( cchar_t )); 239e124de36Sblymn else 240452834f2Sdrochner memcpy( &botright, WACS_LRCORNER, sizeof( cchar_t )); 241e124de36Sblymn 242e124de36Sblymn #ifdef DEBUG 243e124de36Sblymn __CTRACE(__CTRACE_INPUT, "wborder_set: left = %c, 0x%x\n", 244e124de36Sblymn left.vals[0], left.attributes ); 245e124de36Sblymn __CTRACE(__CTRACE_INPUT, "wborder_set: right = %c, 0x%x\n", 246e124de36Sblymn right.vals[0], right.attributes ); 247e124de36Sblymn __CTRACE(__CTRACE_INPUT, "wborder_set: top = %c, 0x%x\n", 248e124de36Sblymn top.vals[0], top.attributes ); 249e124de36Sblymn __CTRACE(__CTRACE_INPUT, "wborder_set: bottom = %c, 0x%x\n", 250e124de36Sblymn bottom.vals[0], bottom.attributes ); 251e124de36Sblymn __CTRACE(__CTRACE_INPUT, "wborder_set: topleft = %c, 0x%x\n", 252e124de36Sblymn topleft.vals[0], topleft.attributes ); 253e124de36Sblymn __CTRACE(__CTRACE_INPUT, "wborder_set: topright = %c, 0x%x\n", 254e124de36Sblymn topright.vals[0], topright.attributes ); 255e124de36Sblymn __CTRACE(__CTRACE_INPUT, "wborder_set: botleft = %c, 0x%x\n", 256e124de36Sblymn botleft.vals[0], botleft.attributes ); 257e124de36Sblymn __CTRACE(__CTRACE_INPUT, "wborder_set: botright = %c, 0x%x\n", 258e124de36Sblymn botright.vals[0], botright.attributes ); 259e124de36Sblymn #endif 260e124de36Sblymn 261e124de36Sblymn /* Merge window attributes */ 262e124de36Sblymn left.attributes |= (left.attributes & __COLOR) ? 263e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 264*fc962912Sjdc left.attributes |= (left.attributes & __COLOR) ? 265*fc962912Sjdc (win->battr & ~__COLOR) : win->battr; 266e124de36Sblymn right.attributes |= (right.attributes & __COLOR) ? 267e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 268*fc962912Sjdc right.attributes |= (right.attributes & __COLOR) ? 269*fc962912Sjdc (win->battr & ~__COLOR) : win->battr; 270e124de36Sblymn top.attributes |= (top.attributes & __COLOR) ? 271e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 272*fc962912Sjdc top.attributes |= (top.attributes & __COLOR) ? 273*fc962912Sjdc (win->battr & ~__COLOR) : win->battr; 274e124de36Sblymn bottom.attributes |= (bottom.attributes & __COLOR) ? 275e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 276*fc962912Sjdc bottom.attributes |= (bottom.attributes & __COLOR) ? 277*fc962912Sjdc (win->battr & ~__COLOR) : win->battr; 278e124de36Sblymn topleft.attributes |= (topleft.attributes & __COLOR) ? 279e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 280*fc962912Sjdc topleft.attributes |= (topleft.attributes & __COLOR) ? 281*fc962912Sjdc (win->battr & ~__COLOR) : win->battr; 282e124de36Sblymn topright.attributes |= (topright.attributes & __COLOR) ? 283e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 284*fc962912Sjdc topright.attributes |= (topright.attributes & __COLOR) ? 285*fc962912Sjdc (win->battr & ~__COLOR) : win->battr; 286e124de36Sblymn botleft.attributes |= (botleft.attributes & __COLOR) ? 287e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 288*fc962912Sjdc botleft.attributes |= (botleft.attributes & __COLOR) ? 289*fc962912Sjdc (win->battr & ~__COLOR) : win->battr; 290e124de36Sblymn botright.attributes |= (botright.attributes & __COLOR) ? 291e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 292*fc962912Sjdc botright.attributes |= (botright.attributes & __COLOR) ? 293*fc962912Sjdc (win->battr & ~__COLOR) : win->battr; 294e124de36Sblymn 295e124de36Sblymn endx = win->maxx - 1; 296e124de36Sblymn endy = win->maxy - 1; 297e124de36Sblymn 298e124de36Sblymn /* Sides */ 299e124de36Sblymn for (i = 1; i < endy; i++) { 300e124de36Sblymn /* left border */ 301e124de36Sblymn cw = wcwidth( left.vals[ 0 ]); 302452834f2Sdrochner if (cw < 0) 303452834f2Sdrochner cw = 1; 304e124de36Sblymn for ( j = 0; j < cw; j++ ) { 30543d5eb45Sroy win->alines[i]->line[j].ch = left.vals[ 0 ]; 30643d5eb45Sroy win->alines[i]->line[j].attr = left.attributes; 30743d5eb45Sroy np = win->alines[i]->line[j].nsp; 308e124de36Sblymn if (np) { 309e124de36Sblymn while ( np ) { 310e124de36Sblymn tnp = np->next; 311e124de36Sblymn free( np ); 312e124de36Sblymn np = tnp; 313e124de36Sblymn } 31443d5eb45Sroy win->alines[i]->line[j].nsp = NULL; 315e124de36Sblymn } 316e124de36Sblymn if ( j ) 31743d5eb45Sroy SET_WCOL( win->alines[i]->line[j], -j ); 318e124de36Sblymn else { 31943d5eb45Sroy SET_WCOL( win->alines[i]->line[j], cw ); 320e124de36Sblymn if ( left.elements > 1 ) { 321e124de36Sblymn for (k = 1; k < left.elements; k++) { 322e124de36Sblymn np = (nschar_t *)malloc(sizeof(nschar_t)); 323e124de36Sblymn if (!np) 324e124de36Sblymn return ERR; 325e124de36Sblymn np->ch = left.vals[ k ]; 32643d5eb45Sroy np->next = win->alines[i]->line[j].nsp; 32743d5eb45Sroy win->alines[i]->line[j].nsp 328e124de36Sblymn = np; 329e124de36Sblymn } 330e124de36Sblymn } 331e124de36Sblymn } 332e124de36Sblymn } 33343d5eb45Sroy for ( j = cw; WCOL( win->alines[i]->line[j]) < 0; j++ ) { 334e124de36Sblymn #ifdef DEBUG 335e124de36Sblymn __CTRACE(__CTRACE_INPUT, 336e124de36Sblymn "wborder_set: clean out partial char[%d]", j); 337e124de36Sblymn #endif /* DEBUG */ 33843d5eb45Sroy win->alines[i]->line[j].ch = ( wchar_t )btowc(win->bch); 339e124de36Sblymn if (_cursesi_copy_nsp(win->bnsp, 34043d5eb45Sroy &win->alines[i]->line[j]) == ERR) 341e124de36Sblymn return ERR; 34243d5eb45Sroy SET_WCOL( win->alines[i]->line[j], 1 ); 343e124de36Sblymn } 344e124de36Sblymn /* right border */ 345e124de36Sblymn cw = wcwidth( right.vals[ 0 ]); 346452834f2Sdrochner if (cw < 0) 347452834f2Sdrochner cw = 1; 34843d5eb45Sroy pcw = WCOL( win->alines[i]->line[endx - cw]); 349e124de36Sblymn for ( j = endx - cw + 1; j <= endx; j++ ) { 35043d5eb45Sroy win->alines[i]->line[j].ch = right.vals[ 0 ]; 35143d5eb45Sroy win->alines[i]->line[j].attr = right.attributes; 35243d5eb45Sroy np = win->alines[i]->line[j].nsp; 353e124de36Sblymn if (np) { 354e124de36Sblymn while ( np ) { 355e124de36Sblymn tnp = np->next; 356e124de36Sblymn free( np ); 357e124de36Sblymn np = tnp; 358e124de36Sblymn } 35943d5eb45Sroy win->alines[i]->line[j].nsp = NULL; 360e124de36Sblymn } 361e124de36Sblymn if ( j == endx - cw + 1 ) { 36243d5eb45Sroy SET_WCOL( win->alines[i]->line[j], cw ); 363e124de36Sblymn if ( right.elements > 1 ) { 364e124de36Sblymn for (k = 1; k < right.elements; k++) { 365e124de36Sblymn np = (nschar_t *)malloc(sizeof(nschar_t)); 366e124de36Sblymn if (!np) 367e124de36Sblymn return ERR; 368e124de36Sblymn np->ch = right.vals[ k ]; 36943d5eb45Sroy np->next = win->alines[i]->line[j].nsp; 37043d5eb45Sroy win->alines[i]->line[j].nsp 371e124de36Sblymn = np; 372e124de36Sblymn } 373e124de36Sblymn } 374e124de36Sblymn } else 37543d5eb45Sroy SET_WCOL( win->alines[i]->line[j], 376e124de36Sblymn endx - cw + 1 - j ); 377e124de36Sblymn } 378e124de36Sblymn if ( pcw != 1 ) { 379e124de36Sblymn #ifdef DEBUG 380e124de36Sblymn __CTRACE(__CTRACE_INPUT, 381e124de36Sblymn "wborder_set: clean out partial chars[%d:%d]", 382e124de36Sblymn endx - cw + pcw, endx - cw ); 383e124de36Sblymn #endif /* DEBUG */ 384e124de36Sblymn k = pcw < 0 ? endx -cw + pcw : endx - cw; 385e124de36Sblymn for ( j = endx - cw; j >= k; j-- ) { 38643d5eb45Sroy win->alines[i]->line[j].ch 387e124de36Sblymn = (wchar_t)btowc(win->bch); 388e124de36Sblymn if (_cursesi_copy_nsp(win->bnsp, 38943d5eb45Sroy &win->alines[i]->line[j]) == ERR) 390e124de36Sblymn return ERR; 39143d5eb45Sroy win->alines[i]->line[j].attr = win->battr; 39243d5eb45Sroy SET_WCOL( win->alines[i]->line[j], 1 ); 393e124de36Sblymn } 394e124de36Sblymn } 395e124de36Sblymn } 396e124de36Sblymn tlcw = wcwidth( topleft.vals[ 0 ]); 397452834f2Sdrochner if (tlcw < 0) 398452834f2Sdrochner tlcw = 1; 399e124de36Sblymn blcw = wcwidth( botleft.vals[ 0 ]); 400452834f2Sdrochner if (blcw < 0) 401452834f2Sdrochner blcw = 1; 402e124de36Sblymn trcw = wcwidth( topright.vals[ 0 ]); 403452834f2Sdrochner if (trcw < 0) 404452834f2Sdrochner trcw = 1; 405e124de36Sblymn brcw = wcwidth( botright.vals[ 0 ]); 406452834f2Sdrochner if (brcw < 0) 407452834f2Sdrochner brcw = 1; 408e124de36Sblymn /* upper border */ 409e124de36Sblymn cw = wcwidth( top.vals[ 0 ]); 410452834f2Sdrochner if (cw < 0) 411452834f2Sdrochner cw = 1; 412e124de36Sblymn for (i = tlcw; i <= min( endx - cw, endx - trcw ); i += cw ) { 413e124de36Sblymn for ( j = 0; j < cw; j++ ) { 41443d5eb45Sroy win->alines[ 0 ]->line[i + j].ch = top.vals[ 0 ]; 41543d5eb45Sroy win->alines[ 0 ]->line[i + j].attr = top.attributes; 41643d5eb45Sroy np = win->alines[ 0 ]->line[i + j].nsp; 417e124de36Sblymn if (np) { 418e124de36Sblymn while ( np ) { 419e124de36Sblymn tnp = np->next; 420e124de36Sblymn free( np ); 421e124de36Sblymn np = tnp; 422e124de36Sblymn } 42343d5eb45Sroy win->alines[ 0 ]->line[i + j].nsp = NULL; 424e124de36Sblymn } 425e124de36Sblymn if ( j ) 42643d5eb45Sroy SET_WCOL( win->alines[ 0 ]->line[ i + j ], -j ); 427e124de36Sblymn else { 42843d5eb45Sroy SET_WCOL( win->alines[ 0 ]->line[ i + j ], cw ); 429e124de36Sblymn if ( top.elements > 1 ) { 430e124de36Sblymn for ( k = 1; k < top.elements; k++ ) { 431e124de36Sblymn np = (nschar_t *)malloc(sizeof(nschar_t)); 432e124de36Sblymn if (!np) 433e124de36Sblymn return ERR; 434e124de36Sblymn np->ch = top.vals[ k ]; 43543d5eb45Sroy np->next = win->alines[0]->line[i + j].nsp; 43643d5eb45Sroy win->alines[0]->line[i + j].nsp 437e124de36Sblymn = np; 438e124de36Sblymn } 439e124de36Sblymn } 440e124de36Sblymn } 441e124de36Sblymn } 442e124de36Sblymn } 443e124de36Sblymn while ( i <= endx - trcw ) { 44443d5eb45Sroy win->alines[0]->line[i].ch = 445e124de36Sblymn ( wchar_t )btowc(( int ) win->bch ); 446e124de36Sblymn if (_cursesi_copy_nsp(win->bnsp, 44743d5eb45Sroy &win->alines[0]->line[i]) == ERR) 448e124de36Sblymn return ERR; 44943d5eb45Sroy win->alines[ 0 ]->line[ i ].attr = win->battr; 45043d5eb45Sroy SET_WCOL( win->alines[ 0 ]->line[ i ], 1 ); 451e124de36Sblymn i++; 452e124de36Sblymn } 453e124de36Sblymn /* lower border */ 454e124de36Sblymn for (i = blcw; i <= min( endx - cw, endx - brcw ); i += cw ) { 455e124de36Sblymn for ( j = 0; j < cw; j++ ) { 45643d5eb45Sroy win->alines[ endy ]->line[i + j].ch = bottom.vals[ 0 ]; 45743d5eb45Sroy win->alines[endy]->line[i + j].attr = bottom.attributes; 45843d5eb45Sroy np = win->alines[ endy ]->line[i + j].nsp; 459e124de36Sblymn if (np) { 460e124de36Sblymn while ( np ) { 461e124de36Sblymn tnp = np->next; 462e124de36Sblymn free( np ); 463e124de36Sblymn np = tnp; 464e124de36Sblymn } 46543d5eb45Sroy win->alines[ endy ]->line[i + j].nsp = NULL; 466e124de36Sblymn } 467e124de36Sblymn if ( j ) 46843d5eb45Sroy SET_WCOL( win->alines[endy]->line[i + j], -j); 469e124de36Sblymn else { 47043d5eb45Sroy SET_WCOL( win->alines[endy]->line[i + j], cw ); 471e124de36Sblymn if ( bottom.elements > 1 ) { 472e124de36Sblymn for ( k = 1; k < bottom.elements; 473e124de36Sblymn k++ ) { 474e124de36Sblymn if ( !( np = ( nschar_t *)malloc( sizeof( nschar_t )))) 475e124de36Sblymn return ERR; 476e124de36Sblymn np->ch = bottom.vals[ k ]; 47743d5eb45Sroy np->next = win->alines[endy]->line[i + j].nsp; 47843d5eb45Sroy win->alines[endy]->line[i + j].nsp = np; 479e124de36Sblymn } 480e124de36Sblymn } 481e124de36Sblymn } 482e124de36Sblymn } 483e124de36Sblymn } 484e124de36Sblymn while ( i <= endx - brcw ) { 48543d5eb45Sroy win->alines[endy]->line[i].ch = 486e124de36Sblymn (wchar_t)btowc((int) win->bch ); 487e124de36Sblymn if (_cursesi_copy_nsp(win->bnsp, 48843d5eb45Sroy &win->alines[endy]->line[i]) == ERR) 489e124de36Sblymn return ERR; 49043d5eb45Sroy win->alines[ endy ]->line[ i ].attr = win->battr; 49143d5eb45Sroy SET_WCOL( win->alines[ endy ]->line[ i ], 1 ); 492e124de36Sblymn i++; 493e124de36Sblymn } 494e124de36Sblymn 495e124de36Sblymn /* Corners */ 496e124de36Sblymn if (!(win->maxx == LINES && win->maxy == COLS && 497e124de36Sblymn (win->flags & __SCROLLOK) && (win->flags & __SCROLLWIN))) { 498e124de36Sblymn for ( i = 0; i < tlcw; i++ ) { 49943d5eb45Sroy win->alines[ 0 ]->line[i].ch = topleft.vals[ 0 ]; 50043d5eb45Sroy win->alines[ 0 ]->line[i].attr = topleft.attributes; 50143d5eb45Sroy np = win->alines[ 0 ]->line[i].nsp; 502e124de36Sblymn if (np) { 503e124de36Sblymn while ( np ) { 504e124de36Sblymn tnp = np->next; 505e124de36Sblymn free( np ); 506e124de36Sblymn np = tnp; 507e124de36Sblymn } 50843d5eb45Sroy win->alines[ 0 ]->line[i].nsp = NULL; 509e124de36Sblymn } 510e124de36Sblymn if ( i ) 51143d5eb45Sroy SET_WCOL( win->alines[ 0 ]->line[ i ], -i ); 512e124de36Sblymn else { 51343d5eb45Sroy SET_WCOL( win->alines[ 0 ]->line[ i ], tlcw ); 514e124de36Sblymn if ( topleft.elements > 1 ) { 515e124de36Sblymn for ( k = 1; k < topleft.elements; 516e124de36Sblymn k++ ) { 517e124de36Sblymn np = (nschar_t *)malloc(sizeof(nschar_t)); 518e124de36Sblymn if (!np) 519e124de36Sblymn return ERR; 520e124de36Sblymn np->ch = topleft.vals[ k ]; 52143d5eb45Sroy np->next = win->alines[ 0 ]->line[i].nsp; 52243d5eb45Sroy win->alines[ 0 ]->line[i].nsp 523e124de36Sblymn = np; 524e124de36Sblymn } 525e124de36Sblymn } 526e124de36Sblymn } 527e124de36Sblymn } 528e124de36Sblymn for ( i = endx - trcw + 1; i <= endx; i++ ) { 52943d5eb45Sroy win->alines[ 0 ]->line[i].ch = topright.vals[ 0 ]; 53043d5eb45Sroy win->alines[ 0 ]->line[i].attr = topright.attributes; 53143d5eb45Sroy np = win->alines[ 0 ]->line[i].nsp; 532e124de36Sblymn if (np) { 533e124de36Sblymn while ( np ) { 534e124de36Sblymn tnp = np->next; 535e124de36Sblymn free( np ); 536e124de36Sblymn np = tnp; 537e124de36Sblymn } 53843d5eb45Sroy win->alines[ 0 ]->line[i].nsp = NULL; 539e124de36Sblymn } 540e124de36Sblymn if ( i == endx - trcw + 1 ) { 54143d5eb45Sroy SET_WCOL( win->alines[ 0 ]->line[ i ], trcw ); 542e124de36Sblymn if ( topright.elements > 1 ) { 543e124de36Sblymn for ( k = 1; k < topright.elements; 544e124de36Sblymn k++ ) { 545e124de36Sblymn np = (nschar_t *)malloc(sizeof(nschar_t)); 546e124de36Sblymn if (!np) 547e124de36Sblymn return ERR; 548e124de36Sblymn np->ch = topright.vals[ k ]; 54943d5eb45Sroy np->next = win->alines[0]->line[i].nsp; 55043d5eb45Sroy win->alines[ 0 ]->line[i].nsp 551e124de36Sblymn = np; 552e124de36Sblymn } 553e124de36Sblymn } 554e124de36Sblymn } else 55543d5eb45Sroy SET_WCOL( win->alines[ 0 ]->line[ i ], 556e124de36Sblymn endx - trcw + 1 - i ); 557e124de36Sblymn } 558e124de36Sblymn for ( i = 0; i < blcw; i++ ) { 55943d5eb45Sroy win->alines[ endy ]->line[i].ch = botleft.vals[ 0 ]; 56043d5eb45Sroy win->alines[ endy ]->line[i].attr = botleft.attributes; 56143d5eb45Sroy np = win->alines[ endy ]->line[i].nsp; 562e124de36Sblymn if (np) { 563e124de36Sblymn while ( np ) { 564e124de36Sblymn tnp = np->next; 565e124de36Sblymn free( np ); 566e124de36Sblymn np = tnp; 567e124de36Sblymn } 56843d5eb45Sroy win->alines[ endy ]->line[i].nsp = NULL; 569e124de36Sblymn } 570e124de36Sblymn if ( i ) 57143d5eb45Sroy SET_WCOL( win->alines[endy]->line[i], -i ); 572e124de36Sblymn else { 57343d5eb45Sroy SET_WCOL( win->alines[endy]->line[i], blcw ); 574e124de36Sblymn if ( botleft.elements > 1 ) { 575e124de36Sblymn for ( k = 1; k < botleft.elements; 576e124de36Sblymn k++ ) { 577e124de36Sblymn np = (nschar_t *)malloc(sizeof(nschar_t)); 578e124de36Sblymn if (!np) 579e124de36Sblymn return ERR; 580e124de36Sblymn np->ch = botleft.vals[ k ]; 58143d5eb45Sroy np->next = win->alines[endy]->line[i].nsp; 58243d5eb45Sroy win->alines[endy]->line[i].nsp 583e124de36Sblymn = np; 584e124de36Sblymn } 585e124de36Sblymn } 586e124de36Sblymn } 587e124de36Sblymn } 588e124de36Sblymn for ( i = endx - brcw + 1; i <= endx; i++ ) { 58943d5eb45Sroy win->alines[ endy ]->line[i].ch = botright.vals[ 0 ]; 59043d5eb45Sroy win->alines[ endy ]->line[i].attr = botright.attributes; 59143d5eb45Sroy np = win->alines[ endy ]->line[i].nsp; 592e124de36Sblymn if (np) { 593e124de36Sblymn while ( np ) { 594e124de36Sblymn tnp = np->next; 595e124de36Sblymn free( np ); 596e124de36Sblymn np = tnp; 597e124de36Sblymn } 59843d5eb45Sroy win->alines[ endy ]->line[i].nsp = NULL; 599e124de36Sblymn } 600e124de36Sblymn if ( i == endx - brcw + 1 ) { 60143d5eb45Sroy SET_WCOL( win->alines[ endy ]->line[ i ], 602e124de36Sblymn brcw ); 603e124de36Sblymn if ( botright.elements > 1 ) { 604e124de36Sblymn for ( k = 1; k < botright.elements; k++ ) { 605e124de36Sblymn np = (nschar_t *)malloc(sizeof(nschar_t)); 606e124de36Sblymn if (!np) 607e124de36Sblymn return ERR; 608e124de36Sblymn np->ch = botright.vals[ k ]; 60943d5eb45Sroy np->next = win->alines[endy]->line[i].nsp; 61043d5eb45Sroy win->alines[endy]->line[i].nsp 611e124de36Sblymn = np; 612e124de36Sblymn } 613e124de36Sblymn } 614e124de36Sblymn } else 61543d5eb45Sroy SET_WCOL( win->alines[ endy ]->line[ i ], 616e124de36Sblymn endx - brcw + 1 - i ); 617e124de36Sblymn } 618e124de36Sblymn } 619e124de36Sblymn __touchwin(win); 620e124de36Sblymn return (OK); 621e124de36Sblymn #endif /* HAVE_WCHAR */ 622e124de36Sblymn } 623