1*80b412b0Sroy /* $NetBSD: border.c,v 1.17 2017/01/06 13:53:18 roy 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*80b412b0Sroy __RCSID("$NetBSD: border.c,v 1.17 2017/01/06 13:53:18 roy 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); 159*80b412b0Sroy 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; 264fc962912Sjdc left.attributes |= (left.attributes & __COLOR) ? 265fc962912Sjdc (win->battr & ~__COLOR) : win->battr; 266e124de36Sblymn right.attributes |= (right.attributes & __COLOR) ? 267e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 268fc962912Sjdc right.attributes |= (right.attributes & __COLOR) ? 269fc962912Sjdc (win->battr & ~__COLOR) : win->battr; 270e124de36Sblymn top.attributes |= (top.attributes & __COLOR) ? 271e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 272fc962912Sjdc top.attributes |= (top.attributes & __COLOR) ? 273fc962912Sjdc (win->battr & ~__COLOR) : win->battr; 274e124de36Sblymn bottom.attributes |= (bottom.attributes & __COLOR) ? 275e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 276fc962912Sjdc bottom.attributes |= (bottom.attributes & __COLOR) ? 277fc962912Sjdc (win->battr & ~__COLOR) : win->battr; 278e124de36Sblymn topleft.attributes |= (topleft.attributes & __COLOR) ? 279e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 280fc962912Sjdc topleft.attributes |= (topleft.attributes & __COLOR) ? 281fc962912Sjdc (win->battr & ~__COLOR) : win->battr; 282e124de36Sblymn topright.attributes |= (topright.attributes & __COLOR) ? 283e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 284fc962912Sjdc topright.attributes |= (topright.attributes & __COLOR) ? 285fc962912Sjdc (win->battr & ~__COLOR) : win->battr; 286e124de36Sblymn botleft.attributes |= (botleft.attributes & __COLOR) ? 287e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 288fc962912Sjdc botleft.attributes |= (botleft.attributes & __COLOR) ? 289fc962912Sjdc (win->battr & ~__COLOR) : win->battr; 290e124de36Sblymn botright.attributes |= (botright.attributes & __COLOR) ? 291e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 292fc962912Sjdc botright.attributes |= (botright.attributes & __COLOR) ? 293fc962912Sjdc (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++) { 3227e6be028Schristos np = 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++) { 3657e6be028Schristos np = 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++) { 4317e6be028Schristos np = 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) { 472*80b412b0Sroy for (k = 1; k < bottom.elements; k++) { 4737e6be028Schristos np = malloc(sizeof(nschar_t)); 4747e6be028Schristos if (!np) 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) { 485*80b412b0Sroy win->alines[endy]->line[i].ch = (wchar_t)btowc((int) win->bch ); 486e124de36Sblymn if (_cursesi_copy_nsp(win->bnsp, 48743d5eb45Sroy &win->alines[endy]->line[i]) == ERR) 488e124de36Sblymn return ERR; 48943d5eb45Sroy win->alines[endy]->line[i].attr = win->battr; 49043d5eb45Sroy SET_WCOL(win->alines[endy]->line[ i ], 1); 491e124de36Sblymn i++; 492e124de36Sblymn } 493e124de36Sblymn 494e124de36Sblymn /* Corners */ 495e124de36Sblymn if (!(win->maxx == LINES && win->maxy == COLS && 496e124de36Sblymn (win->flags & __SCROLLOK) && (win->flags & __SCROLLWIN))) { 497e124de36Sblymn for (i = 0; i < tlcw; i++) { 49843d5eb45Sroy win->alines[0]->line[i].ch = topleft.vals[0]; 49943d5eb45Sroy win->alines[0]->line[i].attr = topleft.attributes; 50043d5eb45Sroy np = win->alines[0]->line[i].nsp; 501e124de36Sblymn if (np) { 502e124de36Sblymn while (np) { 503e124de36Sblymn tnp = np->next; 504e124de36Sblymn free(np); 505e124de36Sblymn np = tnp; 506e124de36Sblymn } 50743d5eb45Sroy win->alines[0]->line[i].nsp = NULL; 508e124de36Sblymn } 509e124de36Sblymn if (i) 51043d5eb45Sroy SET_WCOL(win->alines[0]->line[i], -i); 511e124de36Sblymn else { 51243d5eb45Sroy SET_WCOL(win->alines[0]->line[i], tlcw); 513e124de36Sblymn if (topleft.elements > 1) { 514*80b412b0Sroy for (k = 1; k < topleft.elements; k++) 515*80b412b0Sroy { 5167e6be028Schristos np = malloc(sizeof(nschar_t)); 517e124de36Sblymn if (!np) 518e124de36Sblymn return ERR; 519e124de36Sblymn np->ch = topleft.vals[k]; 52043d5eb45Sroy np->next = win->alines[0]->line[i].nsp; 521*80b412b0Sroy win->alines[0]->line[i].nsp = np; 522e124de36Sblymn } 523e124de36Sblymn } 524e124de36Sblymn } 525e124de36Sblymn } 526e124de36Sblymn for (i = endx - trcw + 1; i <= endx; i++) { 52743d5eb45Sroy win->alines[0]->line[i].ch = topright.vals[0]; 52843d5eb45Sroy win->alines[0]->line[i].attr = topright.attributes; 52943d5eb45Sroy np = win->alines[0]->line[i].nsp; 530e124de36Sblymn if (np) { 531e124de36Sblymn while (np) { 532e124de36Sblymn tnp = np->next; 533e124de36Sblymn free(np); 534e124de36Sblymn np = tnp; 535e124de36Sblymn } 53643d5eb45Sroy win->alines[0]->line[i].nsp = NULL; 537e124de36Sblymn } 538e124de36Sblymn if (i == endx - trcw + 1) { 53943d5eb45Sroy SET_WCOL(win->alines[0]->line[i], trcw); 540e124de36Sblymn if (topright.elements > 1) { 541*80b412b0Sroy for (k = 1; k < topright.elements;k ++) 542*80b412b0Sroy { 5437e6be028Schristos np = malloc(sizeof(nschar_t)); 544e124de36Sblymn if (!np) 545e124de36Sblymn return ERR; 546e124de36Sblymn np->ch = topright.vals[k]; 54743d5eb45Sroy np->next = win->alines[0]->line[i].nsp; 548*80b412b0Sroy win->alines[ 0 ]->line[i].nsp = np; 549e124de36Sblymn } 550e124de36Sblymn } 551e124de36Sblymn } else 55243d5eb45Sroy SET_WCOL(win->alines[0]->line[i], 553e124de36Sblymn endx - trcw + 1 - i); 554e124de36Sblymn } 555e124de36Sblymn for (i = 0; i < blcw; i++) { 55643d5eb45Sroy win->alines[endy]->line[i].ch = botleft.vals[0]; 55743d5eb45Sroy win->alines[endy]->line[i].attr = botleft.attributes; 55843d5eb45Sroy np = win->alines[ endy ]->line[i].nsp; 559e124de36Sblymn if (np) { 560e124de36Sblymn while (np) { 561e124de36Sblymn tnp = np->next; 562e124de36Sblymn free(np); 563e124de36Sblymn np = tnp; 564e124de36Sblymn } 56543d5eb45Sroy win->alines[endy]->line[i].nsp = NULL; 566e124de36Sblymn } 567e124de36Sblymn if (i) 56843d5eb45Sroy SET_WCOL(win->alines[endy]->line[i], -i); 569e124de36Sblymn else { 57043d5eb45Sroy SET_WCOL(win->alines[endy]->line[i], blcw); 571e124de36Sblymn if (botleft.elements > 1) { 572*80b412b0Sroy for (k = 1; k < botleft.elements; k++) { 5737e6be028Schristos np = malloc(sizeof(nschar_t)); 574e124de36Sblymn if (!np) 575e124de36Sblymn return ERR; 576e124de36Sblymn np->ch = botleft.vals[ k ]; 57743d5eb45Sroy np->next = win->alines[endy]->line[i].nsp; 578*80b412b0Sroy win->alines[endy]->line[i].nsp = np; 579e124de36Sblymn } 580e124de36Sblymn } 581e124de36Sblymn } 582e124de36Sblymn } 583e124de36Sblymn for (i = endx - brcw + 1; i <= endx; i++) { 58443d5eb45Sroy win->alines[endy]->line[i].ch = botright.vals[0]; 58543d5eb45Sroy win->alines[endy]->line[i].attr = botright.attributes; 58643d5eb45Sroy np = win->alines[endy]->line[i].nsp; 587e124de36Sblymn if (np) { 588e124de36Sblymn while (np) { 589e124de36Sblymn tnp = np->next; 590e124de36Sblymn free(np); 591e124de36Sblymn np = tnp; 592e124de36Sblymn } 59343d5eb45Sroy win->alines[endy]->line[i].nsp = NULL; 594e124de36Sblymn } 595e124de36Sblymn if (i == endx - brcw + 1) { 596*80b412b0Sroy SET_WCOL(win->alines[endy]->line[i], brcw); 597e124de36Sblymn if (botright.elements > 1) { 598e124de36Sblymn for (k = 1; k < botright.elements; k++){ 5997e6be028Schristos np = malloc(sizeof(nschar_t)); 600e124de36Sblymn if (!np) 601e124de36Sblymn return ERR; 602e124de36Sblymn np->ch = botright.vals[k]; 60343d5eb45Sroy np->next = win->alines[endy]->line[i].nsp; 604*80b412b0Sroy win->alines[endy]->line[i].nsp = np; 605e124de36Sblymn } 606e124de36Sblymn } 607e124de36Sblymn } else 60843d5eb45Sroy SET_WCOL(win->alines[endy]->line[i], 609e124de36Sblymn endx - brcw + 1 - i); 610e124de36Sblymn } 611e124de36Sblymn } 612e124de36Sblymn __touchwin(win); 613*80b412b0Sroy return OK; 614e124de36Sblymn #endif /* HAVE_WCHAR */ 615e124de36Sblymn } 616