1*0a70793fSchristos /* $NetBSD: border.c,v 1.26 2024/12/25 15:35:29 christos 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*0a70793fSchristos __RCSID("$NetBSD: border.c,v 1.26 2024/12/25 15:35:29 christos 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 736348e3f3Sblymn if (__predict_false(win == NULL)) 74*0a70793fSchristos return ERR; 756348e3f3Sblymn 768ce2f7e5Sjdc if (!(left & __CHARTEXT)) 778ce2f7e5Sjdc left |= ACS_VLINE; 788ce2f7e5Sjdc if (!(right & __CHARTEXT)) 798ce2f7e5Sjdc right |= ACS_VLINE; 808ce2f7e5Sjdc if (!(top & __CHARTEXT)) 818ce2f7e5Sjdc top |= ACS_HLINE; 828ce2f7e5Sjdc if (!(bottom & __CHARTEXT)) 838ce2f7e5Sjdc bottom |= ACS_HLINE; 848ce2f7e5Sjdc if (!(topleft & __CHARTEXT)) 858ce2f7e5Sjdc topleft |= ACS_ULCORNER; 868ce2f7e5Sjdc if (!(topright & __CHARTEXT)) 878ce2f7e5Sjdc topright |= ACS_URCORNER; 888ce2f7e5Sjdc if (!(botleft & __CHARTEXT)) 898ce2f7e5Sjdc botleft |= ACS_LLCORNER; 908ce2f7e5Sjdc if (!(botright & __CHARTEXT)) 918ce2f7e5Sjdc botright |= ACS_LRCORNER; 9223464ee5Sblymn 9363621d5aSblymn __CTRACE(__CTRACE_INPUT, "wborder: window 0x%p\n", win); 941f221324Sjdc __CTRACE(__CTRACE_INPUT, "wborder: left = %c, 0x%x\n", 951f221324Sjdc left & __CHARTEXT, left & __ATTRIBUTES); 961f221324Sjdc __CTRACE(__CTRACE_INPUT, "wborder: right = %c, 0x%x\n", 971f221324Sjdc right & __CHARTEXT, right & __ATTRIBUTES); 981f221324Sjdc __CTRACE(__CTRACE_INPUT, "wborder: top = %c, 0x%x\n", 991f221324Sjdc top & __CHARTEXT, top & __ATTRIBUTES); 1001f221324Sjdc __CTRACE(__CTRACE_INPUT, "wborder: bottom = %c, 0x%x\n", 1011f221324Sjdc bottom & __CHARTEXT, bottom & __ATTRIBUTES); 1021f221324Sjdc __CTRACE(__CTRACE_INPUT, "wborder: topleft = %c, 0x%x\n", 1031f221324Sjdc topleft & __CHARTEXT, topleft & __ATTRIBUTES); 1041f221324Sjdc __CTRACE(__CTRACE_INPUT, "wborder: topright = %c, 0x%x\n", 1051f221324Sjdc topright & __CHARTEXT, topright & __ATTRIBUTES); 1061f221324Sjdc __CTRACE(__CTRACE_INPUT, "wborder: botleft = %c, 0x%x\n", 1071f221324Sjdc botleft & __CHARTEXT, botleft & __ATTRIBUTES); 1081f221324Sjdc __CTRACE(__CTRACE_INPUT, "wborder: botright = %c, 0x%x\n", 1091f221324Sjdc botright & __CHARTEXT, botright & __ATTRIBUTES); 11023464ee5Sblymn 111978ab4adSjdc /* Merge window and background attributes */ 112e3317c27Sjdc left |= (left & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr; 113978ab4adSjdc left |= (left & __COLOR) ? (win->battr & ~__COLOR) : win->battr; 114e3317c27Sjdc right |= (right & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr; 115978ab4adSjdc right |= (right & __COLOR) ? (win->battr & ~__COLOR) : win->battr; 116e3317c27Sjdc top |= (top & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr; 117978ab4adSjdc top |= (top & __COLOR) ? (win->battr & ~__COLOR) : win->battr; 118e3317c27Sjdc bottom |= (bottom & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr; 119978ab4adSjdc bottom |= (bottom & __COLOR) ? (win->battr & ~__COLOR) : win->battr; 120e3317c27Sjdc topleft |= (topleft & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr; 121978ab4adSjdc topleft |= (topleft & __COLOR) ? (win->battr & ~__COLOR) : win->battr; 122e3317c27Sjdc topright |= (topright & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr; 123978ab4adSjdc topright |= (topright & __COLOR) ? (win->battr & ~__COLOR) : win->battr; 124e3317c27Sjdc botleft |= (botleft & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr; 125978ab4adSjdc botleft |= (botleft & __COLOR) ? (win->battr & ~__COLOR) : win->battr; 126e3317c27Sjdc botright |= (botright & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr; 127978ab4adSjdc botright |= (botright & __COLOR) ? (win->battr & ~__COLOR) : win->battr; 12823464ee5Sblymn 12923464ee5Sblymn endx = win->maxx - 1; 13023464ee5Sblymn endy = win->maxy - 1; 13143d5eb45Sroy fp = win->alines[0]->line; 13243d5eb45Sroy lp = win->alines[endy]->line; 13323464ee5Sblymn 13423464ee5Sblymn /* Sides */ 13523464ee5Sblymn for (i = 1; i < endy; i++) { 13643d5eb45Sroy win->alines[i]->line[0].ch = (wchar_t) left & __CHARTEXT; 13743d5eb45Sroy win->alines[i]->line[0].attr = (attr_t) left & __ATTRIBUTES; 13843d5eb45Sroy win->alines[i]->line[endx].ch = (wchar_t) right & __CHARTEXT; 13943d5eb45Sroy win->alines[i]->line[endx].attr = (attr_t) right & __ATTRIBUTES; 14023464ee5Sblymn } 14123464ee5Sblymn for (i = 1; i < endx; i++) { 14223464ee5Sblymn fp[i].ch = (wchar_t) top & __CHARTEXT; 14323464ee5Sblymn fp[i].attr = (attr_t) top & __ATTRIBUTES; 14423464ee5Sblymn lp[i].ch = (wchar_t) bottom & __CHARTEXT; 14523464ee5Sblymn lp[i].attr = (attr_t) bottom & __ATTRIBUTES; 14623464ee5Sblymn } 14723464ee5Sblymn 14823464ee5Sblymn /* Corners */ 149b3963fa6Sblymn if (!(win->maxy == LINES && win->maxx == COLS && 15023464ee5Sblymn (win->flags & __SCROLLOK) && (win->flags & __SCROLLWIN))) { 15123464ee5Sblymn fp[0].ch = (wchar_t) topleft & __CHARTEXT; 15223464ee5Sblymn fp[0].attr = (attr_t) topleft & __ATTRIBUTES; 15323464ee5Sblymn fp[endx].ch = (wchar_t) topright & __CHARTEXT; 15423464ee5Sblymn fp[endx].attr = (attr_t) topright & __ATTRIBUTES; 15523464ee5Sblymn lp[0].ch = (wchar_t) botleft & __CHARTEXT; 15623464ee5Sblymn lp[0].attr = (attr_t) botleft & __ATTRIBUTES; 15723464ee5Sblymn lp[endx].ch = (wchar_t) botright & __CHARTEXT; 15823464ee5Sblymn lp[endx].attr = (attr_t) botright & __ATTRIBUTES; 15923464ee5Sblymn } 160301bf8ccSblymn __touchwin(win, 0); 16150a63ac8Sroy return OK; 162452834f2Sdrochner #else /* HAVE_WCHAR */ 163452834f2Sdrochner cchar_t ls, rs, ts, bs, tl, tr, bl, br; 164452834f2Sdrochner cchar_t *lsp, *rsp, *tsp, *bsp, *tlp, *trp, *blp, *brp; 165452834f2Sdrochner 1660ddf8189Sblymn #define S(in, out, def) \ 167452834f2Sdrochner if (in & __CHARTEXT) { \ 168452834f2Sdrochner __cursesi_chtype_to_cchar(in, &out); \ 1690ddf8189Sblymn } else { \ 1700ddf8189Sblymn memcpy(&out, def, sizeof(cchar_t)); \ 1710ddf8189Sblymn out.attributes |= in & __ATTRIBUTES; \ 1720ddf8189Sblymn } \ 1730ddf8189Sblymn out##p = &out; 1740ddf8189Sblymn 1750ddf8189Sblymn S(left, ls, WACS_VLINE); 1760ddf8189Sblymn S(right, rs, WACS_VLINE); 1770ddf8189Sblymn S(top, ts, WACS_HLINE); 1780ddf8189Sblymn S(bottom, bs, WACS_HLINE); 1790ddf8189Sblymn S(topleft, tl, WACS_ULCORNER); 1800ddf8189Sblymn S(topright, tr, WACS_URCORNER); 1810ddf8189Sblymn S(botleft, bl, WACS_LLCORNER); 1820ddf8189Sblymn S(botright, br, WACS_LRCORNER); 183452834f2Sdrochner #undef S 184452834f2Sdrochner return wborder_set(win, lsp, rsp, tsp, bsp, tlp, trp, blp, brp); 185452834f2Sdrochner #endif /* HAVE_WCHAR */ 18623464ee5Sblymn } 187e124de36Sblymn 188e124de36Sblymn int border_set(const cchar_t *ls, const cchar_t *rs, const cchar_t *ts, 189e124de36Sblymn const cchar_t *bs, const cchar_t *tl, const cchar_t *tr, 190e124de36Sblymn const cchar_t *bl, const cchar_t *br) 191e124de36Sblymn { 192e124de36Sblymn #ifndef HAVE_WCHAR 193e124de36Sblymn return ERR; 194e124de36Sblymn #else 195e124de36Sblymn return wborder_set(stdscr, ls, rs, ts, bs, tl, tr, bl, br); 196e124de36Sblymn #endif /* HAVE_WCHAR */ 197e124de36Sblymn } 198e124de36Sblymn 199e124de36Sblymn int wborder_set(WINDOW *win, const cchar_t *ls, const cchar_t *rs, 200e124de36Sblymn const cchar_t *ts, const cchar_t *bs, 201e124de36Sblymn const cchar_t *tl, const cchar_t *tr, 202e124de36Sblymn const cchar_t *bl, const cchar_t *br) 203e124de36Sblymn { 204e124de36Sblymn #ifndef HAVE_WCHAR 205e124de36Sblymn return ERR; 206e124de36Sblymn #else 207e124de36Sblymn int endy, endx, i, j, k, cw, pcw, tlcw, blcw, trcw, brcw; 208e124de36Sblymn cchar_t left, right, bottom, top, topleft, topright, botleft, botright; 209e124de36Sblymn nschar_t *np, *tnp; 210e124de36Sblymn 2116348e3f3Sblymn if (__predict_false(win == NULL)) 2126348e3f3Sblymn return ERR; 2136348e3f3Sblymn 214e124de36Sblymn if (ls && wcwidth(ls->vals[0])) 215e124de36Sblymn memcpy(&left, ls, sizeof(cchar_t)); 216e124de36Sblymn else 217452834f2Sdrochner memcpy(&left, WACS_VLINE, sizeof(cchar_t)); 218e124de36Sblymn if (rs && wcwidth( rs->vals[0])) 219e124de36Sblymn memcpy(&right, rs, sizeof(cchar_t)); 220e124de36Sblymn else 221452834f2Sdrochner memcpy(&right, WACS_VLINE, sizeof(cchar_t)); 222e124de36Sblymn if (ts && wcwidth( ts->vals[0])) 223e124de36Sblymn memcpy(&top, ts, sizeof(cchar_t)); 224e124de36Sblymn else 225452834f2Sdrochner memcpy( &top, WACS_HLINE, sizeof(cchar_t)); 226e124de36Sblymn if (bs && wcwidth( bs->vals[0])) 227e124de36Sblymn memcpy(&bottom, bs, sizeof(cchar_t)); 228e124de36Sblymn else 229452834f2Sdrochner memcpy(&bottom, WACS_HLINE, sizeof(cchar_t)); 230e124de36Sblymn if (tl && wcwidth(tl->vals[0])) 231e124de36Sblymn memcpy( &topleft, tl, sizeof(cchar_t)); 232e124de36Sblymn else 233452834f2Sdrochner memcpy(&topleft, WACS_ULCORNER, sizeof(cchar_t)); 234e124de36Sblymn if (tr && wcwidth( tr->vals[0])) 235e124de36Sblymn memcpy(&topright, tr, sizeof(cchar_t)); 236e124de36Sblymn else 237452834f2Sdrochner memcpy(&topright, WACS_URCORNER, sizeof( cchar_t )); 238e124de36Sblymn if (bl && wcwidth( bl->vals[0])) 239e124de36Sblymn memcpy(&botleft, bl, sizeof(cchar_t)); 240e124de36Sblymn else 241452834f2Sdrochner memcpy(&botleft, WACS_LLCORNER, sizeof(cchar_t)); 242e124de36Sblymn if (br && wcwidth( br->vals[0])) 243e124de36Sblymn memcpy(&botright, br, sizeof(cchar_t)); 244e124de36Sblymn else 245452834f2Sdrochner memcpy(&botright, WACS_LRCORNER, sizeof(cchar_t)); 246e124de36Sblymn 24763621d5aSblymn __CTRACE(__CTRACE_INPUT, "wborder_set: window 0x%p\n", win); 248e124de36Sblymn __CTRACE(__CTRACE_INPUT, "wborder_set: left = %c, 0x%x\n", 249e124de36Sblymn left.vals[0], left.attributes ); 250e124de36Sblymn __CTRACE(__CTRACE_INPUT, "wborder_set: right = %c, 0x%x\n", 251e124de36Sblymn right.vals[0], right.attributes ); 252e124de36Sblymn __CTRACE(__CTRACE_INPUT, "wborder_set: top = %c, 0x%x\n", 253e124de36Sblymn top.vals[0], top.attributes ); 254e124de36Sblymn __CTRACE(__CTRACE_INPUT, "wborder_set: bottom = %c, 0x%x\n", 255e124de36Sblymn bottom.vals[0], bottom.attributes ); 256e124de36Sblymn __CTRACE(__CTRACE_INPUT, "wborder_set: topleft = %c, 0x%x\n", 257e124de36Sblymn topleft.vals[0], topleft.attributes ); 258e124de36Sblymn __CTRACE(__CTRACE_INPUT, "wborder_set: topright = %c, 0x%x\n", 259e124de36Sblymn topright.vals[0], topright.attributes ); 260e124de36Sblymn __CTRACE(__CTRACE_INPUT, "wborder_set: botleft = %c, 0x%x\n", 261e124de36Sblymn botleft.vals[0], botleft.attributes ); 262e124de36Sblymn __CTRACE(__CTRACE_INPUT, "wborder_set: botright = %c, 0x%x\n", 263e124de36Sblymn botright.vals[0], botright.attributes ); 264e124de36Sblymn 265e124de36Sblymn /* Merge window attributes */ 266e124de36Sblymn left.attributes |= (left.attributes & __COLOR) ? 267e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 268cab30aacSjdc left.attributes |= (left.attributes & __COLOR) ? 269cab30aacSjdc (win->battr & ~__COLOR) : win->battr; 270e124de36Sblymn right.attributes |= (right.attributes & __COLOR) ? 271e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 272cab30aacSjdc right.attributes |= (right.attributes & __COLOR) ? 273cab30aacSjdc (win->battr & ~__COLOR) : win->battr; 274e124de36Sblymn top.attributes |= (top.attributes & __COLOR) ? 275e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 276cab30aacSjdc top.attributes |= (top.attributes & __COLOR) ? 277cab30aacSjdc (win->battr & ~__COLOR) : win->battr; 278e124de36Sblymn bottom.attributes |= (bottom.attributes & __COLOR) ? 279e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 280cab30aacSjdc bottom.attributes |= (bottom.attributes & __COLOR) ? 281cab30aacSjdc (win->battr & ~__COLOR) : win->battr; 282e124de36Sblymn topleft.attributes |= (topleft.attributes & __COLOR) ? 283e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 284cab30aacSjdc topleft.attributes |= (topleft.attributes & __COLOR) ? 285cab30aacSjdc (win->battr & ~__COLOR) : win->battr; 286e124de36Sblymn topright.attributes |= (topright.attributes & __COLOR) ? 287e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 288cab30aacSjdc topright.attributes |= (topright.attributes & __COLOR) ? 289cab30aacSjdc (win->battr & ~__COLOR) : win->battr; 290e124de36Sblymn botleft.attributes |= (botleft.attributes & __COLOR) ? 291e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 292cab30aacSjdc botleft.attributes |= (botleft.attributes & __COLOR) ? 293cab30aacSjdc (win->battr & ~__COLOR) : win->battr; 294e124de36Sblymn botright.attributes |= (botright.attributes & __COLOR) ? 295e124de36Sblymn (win->wattr & ~__COLOR) : win->wattr; 296cab30aacSjdc botright.attributes |= (botright.attributes & __COLOR) ? 297cab30aacSjdc (win->battr & ~__COLOR) : win->battr; 298e124de36Sblymn 299e124de36Sblymn endx = win->maxx - 1; 300e124de36Sblymn endy = win->maxy - 1; 301e124de36Sblymn 302e124de36Sblymn /* Sides */ 303e124de36Sblymn for (i = 1; i < endy; i++) { 304e124de36Sblymn /* left border */ 305e124de36Sblymn cw = wcwidth(left.vals[0]); 306452834f2Sdrochner if (cw < 0) 307452834f2Sdrochner cw = 1; 308e124de36Sblymn for ( j = 0; j < cw; j++ ) { 30943d5eb45Sroy win->alines[i]->line[j].ch = left.vals[0]; 310a7d2c216Sblymn win->alines[i]->line[j].cflags &= ~CA_BACKGROUND; 31143d5eb45Sroy win->alines[i]->line[j].attr = left.attributes; 31243d5eb45Sroy np = win->alines[i]->line[j].nsp; 313e124de36Sblymn if (np) { 314e124de36Sblymn while (np) { 315e124de36Sblymn tnp = np->next; 316e124de36Sblymn free(np); 317e124de36Sblymn np = tnp; 318e124de36Sblymn } 31943d5eb45Sroy win->alines[i]->line[j].nsp = NULL; 320e124de36Sblymn } 321e124de36Sblymn if (j) 322f1942931Sblymn win->alines[i]->line[j].wcols = -j; 323e124de36Sblymn else { 324f1942931Sblymn win->alines[i]->line[j].wcols = cw; 325e124de36Sblymn if (left.elements > 1) { 326e124de36Sblymn for (k = 1; k < left.elements; k++) { 3278a48cf66Schristos np = malloc(sizeof(nschar_t)); 328e124de36Sblymn if (!np) 329e124de36Sblymn return ERR; 330e124de36Sblymn np->ch = left.vals[ k ]; 33143d5eb45Sroy np->next = win->alines[i]->line[j].nsp; 33243d5eb45Sroy win->alines[i]->line[j].nsp 333e124de36Sblymn = np; 334e124de36Sblymn } 335e124de36Sblymn } 336e124de36Sblymn } 337e124de36Sblymn } 338f1942931Sblymn for (j = cw; win->alines[i]->line[j].wcols < 0; j++) { 339e124de36Sblymn __CTRACE(__CTRACE_INPUT, 340e124de36Sblymn "wborder_set: clean out partial char[%d]", j); 341301bf8ccSblymn win->alines[i]->line[j].ch = win->bch; 342a7d2c216Sblymn win->alines[i]->line[j].cflags |= CA_BACKGROUND; 343e124de36Sblymn if (_cursesi_copy_nsp(win->bnsp, 34443d5eb45Sroy &win->alines[i]->line[j]) == ERR) 345e124de36Sblymn return ERR; 346f1942931Sblymn win->alines[i]->line[j].wcols = 1; 347e124de36Sblymn } 348e124de36Sblymn /* right border */ 349e124de36Sblymn cw = wcwidth(right.vals[0]); 350452834f2Sdrochner if (cw < 0) 351452834f2Sdrochner cw = 1; 352f1942931Sblymn pcw = win->alines[i]->line[endx - cw].wcols; 353e124de36Sblymn for ( j = endx - cw + 1; j <= endx; j++ ) { 35443d5eb45Sroy win->alines[i]->line[j].ch = right.vals[0]; 355a7d2c216Sblymn win->alines[i]->line[j].cflags &= ~CA_BACKGROUND; 35643d5eb45Sroy win->alines[i]->line[j].attr = right.attributes; 35743d5eb45Sroy np = win->alines[i]->line[j].nsp; 358e124de36Sblymn if (np) { 359e124de36Sblymn while (np) { 360e124de36Sblymn tnp = np->next; 361e124de36Sblymn free(np); 362e124de36Sblymn np = tnp; 363e124de36Sblymn } 36443d5eb45Sroy win->alines[i]->line[j].nsp = NULL; 365e124de36Sblymn } 366e124de36Sblymn if (j == endx - cw + 1) { 367f1942931Sblymn win->alines[i]->line[j].wcols = cw; 368e124de36Sblymn if (right.elements > 1) { 369e124de36Sblymn for (k = 1; k < right.elements; k++) { 3708a48cf66Schristos np = malloc(sizeof(nschar_t)); 371e124de36Sblymn if (!np) 372e124de36Sblymn return ERR; 373e124de36Sblymn np->ch = right.vals[ k ]; 37443d5eb45Sroy np->next = win->alines[i]->line[j].nsp; 37543d5eb45Sroy win->alines[i]->line[j].nsp 376e124de36Sblymn = np; 377e124de36Sblymn } 378e124de36Sblymn } 379e124de36Sblymn } else 380f1942931Sblymn win->alines[i]->line[j].wcols = 381f1942931Sblymn endx - cw + 1 - j; 382e124de36Sblymn } 383e124de36Sblymn if (pcw != 1) { 384e124de36Sblymn __CTRACE(__CTRACE_INPUT, 385e124de36Sblymn "wborder_set: clean out partial chars[%d:%d]", 386e124de36Sblymn endx - cw + pcw, endx - cw); 387e124de36Sblymn k = pcw < 0 ? endx -cw + pcw : endx - cw; 388e124de36Sblymn for (j = endx - cw; j >= k; j--) { 389301bf8ccSblymn win->alines[i]->line[j].ch = win->bch; 390a7d2c216Sblymn win->alines[i]->line[j].cflags |= CA_BACKGROUND; 391e124de36Sblymn if (_cursesi_copy_nsp(win->bnsp, 39243d5eb45Sroy &win->alines[i]->line[j]) == ERR) 393e124de36Sblymn return ERR; 39443d5eb45Sroy win->alines[i]->line[j].attr = win->battr; 395f1942931Sblymn win->alines[i]->line[j].wcols = 1; 396e124de36Sblymn } 397e124de36Sblymn } 398e124de36Sblymn } 399e124de36Sblymn tlcw = wcwidth(topleft.vals[0]); 400452834f2Sdrochner if (tlcw < 0) 401452834f2Sdrochner tlcw = 1; 402e124de36Sblymn blcw = wcwidth(botleft.vals[0]); 403452834f2Sdrochner if (blcw < 0) 404452834f2Sdrochner blcw = 1; 405e124de36Sblymn trcw = wcwidth(topright.vals[0]); 406452834f2Sdrochner if (trcw < 0) 407452834f2Sdrochner trcw = 1; 408e124de36Sblymn brcw = wcwidth(botright.vals[0]); 409452834f2Sdrochner if (brcw < 0) 410452834f2Sdrochner brcw = 1; 411e124de36Sblymn /* upper border */ 412e124de36Sblymn cw = wcwidth(top.vals[0]); 413452834f2Sdrochner if (cw < 0) 414452834f2Sdrochner cw = 1; 415e124de36Sblymn for (i = tlcw; i <= min( endx - cw, endx - trcw); i += cw) { 416e124de36Sblymn for (j = 0; j < cw; j++) { 41743d5eb45Sroy win->alines[0]->line[i + j].ch = top.vals[0]; 418a7d2c216Sblymn win->alines[0]->line[i + j].cflags &= ~CA_BACKGROUND; 41943d5eb45Sroy win->alines[0]->line[i + j].attr = top.attributes; 42043d5eb45Sroy np = win->alines[0]->line[i + j].nsp; 421e124de36Sblymn if (np) { 422e124de36Sblymn while (np) { 423e124de36Sblymn tnp = np->next; 424e124de36Sblymn free(np); 425e124de36Sblymn np = tnp; 426e124de36Sblymn } 42743d5eb45Sroy win->alines[0]->line[i + j].nsp = NULL; 428e124de36Sblymn } 429e124de36Sblymn if (j) 430f1942931Sblymn win->alines[ 0 ]->line[ i + j ].wcols = -j; 431e124de36Sblymn else { 432f1942931Sblymn win->alines[ 0 ]->line[ i + j ].wcols = cw; 433e124de36Sblymn if ( top.elements > 1 ) { 434e124de36Sblymn for (k = 1; k < top.elements; k++) { 4358a48cf66Schristos np = malloc(sizeof(nschar_t)); 436e124de36Sblymn if (!np) 437e124de36Sblymn return ERR; 438e124de36Sblymn np->ch = top.vals[k]; 43943d5eb45Sroy np->next = win->alines[0]->line[i + j].nsp; 44043d5eb45Sroy win->alines[0]->line[i + j].nsp 441e124de36Sblymn = np; 442e124de36Sblymn } 443e124de36Sblymn } 444e124de36Sblymn } 445e124de36Sblymn } 446e124de36Sblymn } 447e124de36Sblymn while (i <= endx - trcw) { 448301bf8ccSblymn win->alines[0]->line[i].ch = win->bch; 449a7d2c216Sblymn win->alines[0]->line[i].cflags |= CA_BACKGROUND; 450e124de36Sblymn if (_cursesi_copy_nsp(win->bnsp, 45143d5eb45Sroy &win->alines[0]->line[i]) == ERR) 452e124de36Sblymn return ERR; 45343d5eb45Sroy win->alines[0]->line[i].attr = win->battr; 454f1942931Sblymn win->alines[0]->line[i].wcols = 1; 455e124de36Sblymn i++; 456e124de36Sblymn } 457e124de36Sblymn /* lower border */ 458e124de36Sblymn for (i = blcw; i <= min( endx - cw, endx - brcw); i += cw) { 459e124de36Sblymn for (j = 0; j < cw; j++) { 46043d5eb45Sroy win->alines[endy]->line[i + j].ch = bottom.vals[0]; 461a7d2c216Sblymn win->alines[endy]->line[i + j].cflags &= ~CA_BACKGROUND; 46243d5eb45Sroy win->alines[endy]->line[i + j].attr = bottom.attributes; 46343d5eb45Sroy np = win->alines[endy]->line[i + j].nsp; 464e124de36Sblymn if (np) { 465e124de36Sblymn while (np) { 466e124de36Sblymn tnp = np->next; 467e124de36Sblymn free(np); 468e124de36Sblymn np = tnp; 469e124de36Sblymn } 47043d5eb45Sroy win->alines[endy]->line[i + j].nsp = NULL; 471e124de36Sblymn } 472e124de36Sblymn if (j) 473f1942931Sblymn win->alines[endy]->line[i + j].wcols = -j; 474e124de36Sblymn else { 475f1942931Sblymn win->alines[endy]->line[i + j].wcols = cw; 476e124de36Sblymn if (bottom.elements > 1) { 47750a63ac8Sroy for (k = 1; k < bottom.elements; k++) { 4788a48cf66Schristos np = malloc(sizeof(nschar_t)); 4798a48cf66Schristos if (!np) 480e124de36Sblymn return ERR; 481e124de36Sblymn np->ch = bottom.vals[ k ]; 48243d5eb45Sroy np->next = win->alines[endy]->line[i + j].nsp; 48343d5eb45Sroy win->alines[endy]->line[i + j].nsp = np; 484e124de36Sblymn } 485e124de36Sblymn } 486e124de36Sblymn } 487e124de36Sblymn } 488e124de36Sblymn } 489e124de36Sblymn while (i <= endx - brcw) { 490301bf8ccSblymn win->alines[endy]->line[i].ch = win->bch; 491a7d2c216Sblymn win->alines[endy]->line[i].cflags |= CA_BACKGROUND; 492e124de36Sblymn if (_cursesi_copy_nsp(win->bnsp, 49343d5eb45Sroy &win->alines[endy]->line[i]) == ERR) 494e124de36Sblymn return ERR; 49543d5eb45Sroy win->alines[endy]->line[i].attr = win->battr; 496f1942931Sblymn win->alines[endy]->line[i].wcols = 1; 497e124de36Sblymn i++; 498e124de36Sblymn } 499e124de36Sblymn 500e124de36Sblymn /* Corners */ 501b3963fa6Sblymn if (!(win->maxy == LINES && win->maxx == COLS && 502e124de36Sblymn (win->flags & __SCROLLOK) && (win->flags & __SCROLLWIN))) { 503e124de36Sblymn for (i = 0; i < tlcw; i++) { 50443d5eb45Sroy win->alines[0]->line[i].ch = topleft.vals[0]; 505a7d2c216Sblymn win->alines[0]->line[i].cflags &= ~CA_BACKGROUND; 50643d5eb45Sroy win->alines[0]->line[i].attr = topleft.attributes; 50743d5eb45Sroy np = win->alines[0]->line[i].nsp; 508e124de36Sblymn if (np) { 509e124de36Sblymn while (np) { 510e124de36Sblymn tnp = np->next; 511e124de36Sblymn free(np); 512e124de36Sblymn np = tnp; 513e124de36Sblymn } 51443d5eb45Sroy win->alines[0]->line[i].nsp = NULL; 515e124de36Sblymn } 516e124de36Sblymn if (i) 517f1942931Sblymn win->alines[0]->line[i].wcols = -i; 518e124de36Sblymn else { 519f1942931Sblymn win->alines[0]->line[i].wcols = tlcw; 520e124de36Sblymn if (topleft.elements > 1) { 52150a63ac8Sroy for (k = 1; k < topleft.elements; k++) 52250a63ac8Sroy { 5238a48cf66Schristos np = malloc(sizeof(nschar_t)); 524e124de36Sblymn if (!np) 525e124de36Sblymn return ERR; 526e124de36Sblymn np->ch = topleft.vals[k]; 52743d5eb45Sroy np->next = win->alines[0]->line[i].nsp; 52850a63ac8Sroy win->alines[0]->line[i].nsp = np; 529e124de36Sblymn } 530e124de36Sblymn } 531e124de36Sblymn } 532e124de36Sblymn } 533e124de36Sblymn for (i = endx - trcw + 1; i <= endx; i++) { 53443d5eb45Sroy win->alines[0]->line[i].ch = topright.vals[0]; 535a7d2c216Sblymn win->alines[0]->line[i].cflags &= ~CA_BACKGROUND; 53643d5eb45Sroy win->alines[0]->line[i].attr = topright.attributes; 53743d5eb45Sroy np = win->alines[0]->line[i].nsp; 538e124de36Sblymn if (np) { 539e124de36Sblymn while (np) { 540e124de36Sblymn tnp = np->next; 541e124de36Sblymn free(np); 542e124de36Sblymn np = tnp; 543e124de36Sblymn } 54443d5eb45Sroy win->alines[0]->line[i].nsp = NULL; 545e124de36Sblymn } 546e124de36Sblymn if (i == endx - trcw + 1) { 547f1942931Sblymn win->alines[0]->line[i].wcols = trcw; 548e124de36Sblymn if (topright.elements > 1) { 54950a63ac8Sroy for (k = 1; k < topright.elements;k ++) 55050a63ac8Sroy { 5518a48cf66Schristos np = malloc(sizeof(nschar_t)); 552e124de36Sblymn if (!np) 553e124de36Sblymn return ERR; 554e124de36Sblymn np->ch = topright.vals[k]; 55543d5eb45Sroy np->next = win->alines[0]->line[i].nsp; 55650a63ac8Sroy win->alines[ 0 ]->line[i].nsp = np; 557e124de36Sblymn } 558e124de36Sblymn } 559e124de36Sblymn } else 560f1942931Sblymn win->alines[0]->line[i].wcols = 561f1942931Sblymn endx - trcw + 1 - i; 562e124de36Sblymn } 563e124de36Sblymn for (i = 0; i < blcw; i++) { 56443d5eb45Sroy win->alines[endy]->line[i].ch = botleft.vals[0]; 565a7d2c216Sblymn win->alines[endy]->line[i].cflags &= ~CA_BACKGROUND; 56643d5eb45Sroy win->alines[endy]->line[i].attr = botleft.attributes; 56743d5eb45Sroy np = win->alines[ endy ]->line[i].nsp; 568e124de36Sblymn if (np) { 569e124de36Sblymn while (np) { 570e124de36Sblymn tnp = np->next; 571e124de36Sblymn free(np); 572e124de36Sblymn np = tnp; 573e124de36Sblymn } 57443d5eb45Sroy win->alines[endy]->line[i].nsp = NULL; 575e124de36Sblymn } 576e124de36Sblymn if (i) 577f1942931Sblymn win->alines[endy]->line[i].wcols = -i; 578e124de36Sblymn else { 579f1942931Sblymn win->alines[endy]->line[i].wcols = blcw; 580e124de36Sblymn if (botleft.elements > 1) { 58150a63ac8Sroy for (k = 1; k < botleft.elements; k++) { 5828a48cf66Schristos np = malloc(sizeof(nschar_t)); 583e124de36Sblymn if (!np) 584e124de36Sblymn return ERR; 585e124de36Sblymn np->ch = botleft.vals[ k ]; 58643d5eb45Sroy np->next = win->alines[endy]->line[i].nsp; 58750a63ac8Sroy win->alines[endy]->line[i].nsp = np; 588e124de36Sblymn } 589e124de36Sblymn } 590e124de36Sblymn } 591e124de36Sblymn } 592e124de36Sblymn for (i = endx - brcw + 1; i <= endx; i++) { 59343d5eb45Sroy win->alines[endy]->line[i].ch = botright.vals[0]; 594a7d2c216Sblymn win->alines[endy]->line[i].cflags &= ~CA_BACKGROUND; 59543d5eb45Sroy win->alines[endy]->line[i].attr = botright.attributes; 59643d5eb45Sroy np = win->alines[endy]->line[i].nsp; 597e124de36Sblymn if (np) { 598e124de36Sblymn while (np) { 599e124de36Sblymn tnp = np->next; 600e124de36Sblymn free(np); 601e124de36Sblymn np = tnp; 602e124de36Sblymn } 60343d5eb45Sroy win->alines[endy]->line[i].nsp = NULL; 604e124de36Sblymn } 605e124de36Sblymn if (i == endx - brcw + 1) { 606f1942931Sblymn win->alines[endy]->line[i].wcols = brcw; 607e124de36Sblymn if (botright.elements > 1) { 608e124de36Sblymn for (k = 1; k < botright.elements; k++){ 6098a48cf66Schristos np = malloc(sizeof(nschar_t)); 610e124de36Sblymn if (!np) 611e124de36Sblymn return ERR; 612e124de36Sblymn np->ch = botright.vals[k]; 61343d5eb45Sroy np->next = win->alines[endy]->line[i].nsp; 61450a63ac8Sroy win->alines[endy]->line[i].nsp = np; 615e124de36Sblymn } 616e124de36Sblymn } 617e124de36Sblymn } else 618f1942931Sblymn win->alines[endy]->line[i].wcols = 619f1942931Sblymn endx - brcw + 1 - i; 620e124de36Sblymn } 621e124de36Sblymn } 622301bf8ccSblymn __touchwin(win, 0); 62350a63ac8Sroy return OK; 624e124de36Sblymn #endif /* HAVE_WCHAR */ 625e124de36Sblymn } 626