1 1.22 blymn /* $NetBSD: copywin.c,v 1.22 2024/12/23 02:58:03 blymn Exp $ */ 2 1.1 blymn 3 1.1 blymn /*- 4 1.1 blymn * Copyright (c) 1998-1999 Brett Lymn 5 1.1 blymn * (blymn (at) baea.com.au, brett_lymn (at) yahoo.com.au) 6 1.1 blymn * All rights reserved. 7 1.1 blymn * 8 1.1 blymn * This code has been donated to The NetBSD Foundation by the Author. 9 1.1 blymn * 10 1.1 blymn * Redistribution and use in source and binary forms, with or without 11 1.1 blymn * modification, are permitted provided that the following conditions 12 1.1 blymn * are met: 13 1.1 blymn * 1. Redistributions of source code must retain the above copyright 14 1.1 blymn * notice, this list of conditions and the following disclaimer. 15 1.1 blymn * 2. The name of the author may not be used to endorse or promote products 16 1.7 wiz * derived from this software without specific prior written permission 17 1.1 blymn * 18 1.1 blymn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19 1.1 blymn * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 1.1 blymn * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21 1.1 blymn * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22 1.1 blymn * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23 1.1 blymn * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 1.1 blymn * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 1.1 blymn * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 1.1 blymn * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 1.1 blymn * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 1.1 blymn * 29 1.1 blymn * 30 1.1 blymn */ 31 1.5 blymn 32 1.5 blymn #include <sys/cdefs.h> 33 1.5 blymn #ifndef lint 34 1.22 blymn __RCSID("$NetBSD: copywin.c,v 1.22 2024/12/23 02:58:03 blymn Exp $"); 35 1.5 blymn #endif /* not lint */ 36 1.1 blymn 37 1.1 blymn #include <ctype.h> 38 1.2 jdc #include <string.h> 39 1.1 blymn #include "curses.h" 40 1.1 blymn #include "curses_private.h" 41 1.1 blymn 42 1.1 blymn /* 43 1.1 blymn * copywin -- 44 1.1 blymn * Copy the box starting at (sminrow, smincol) with a size that 45 1.1 blymn * matches the destination box (dminrow, dmincol) by (dmaxrow, dmaxcol) 46 1.1 blymn * from the source window srcwin to the destination window dstwin. 47 1.10 dsl * All these coordindinates are relative to the relevant window. 48 1.8 lukem * If dooverlay is true then the copy is nondestructive otherwise the 49 1.1 blymn * copy is destructive. 50 1.1 blymn */ 51 1.10 dsl int copywin(const WINDOW *srcwin, WINDOW *dstwin, 52 1.10 dsl int sminrow, int smincol, 53 1.10 dsl int dminrow, int dmincol, int dmaxrow, int dmaxcol, int dooverlay) 54 1.1 blymn { 55 1.10 dsl int dcol; 56 1.1 blymn __LDATA *sp, *end; 57 1.13 blymn #ifdef HAVE_WCHAR 58 1.13 blymn cchar_t cc; 59 1.13 blymn nschar_t *np; 60 1.13 blymn #endif /* HAVE_WCHAR */ 61 1.9 blymn 62 1.16 blymn __CTRACE(__CTRACE_WINDOW, 63 1.16 blymn "copywin %s mode: from (%d,%d) to (%d,%d-%d,%d)\n", 64 1.16 blymn dooverlay ? "overlay" : "overwrite", 65 1.16 blymn sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol); 66 1.16 blymn 67 1.22 blymn if ((srcwin == NULL) || (dstwin == NULL)) 68 1.22 blymn return ERR; 69 1.22 blymn 70 1.10 dsl /* overwrite() and overlay() can come here with -ve srcwin coords */ 71 1.10 dsl if (sminrow < 0) { 72 1.10 dsl dminrow -= sminrow; 73 1.10 dsl sminrow = 0; 74 1.10 dsl } 75 1.10 dsl if (smincol < 0) { 76 1.10 dsl dmincol -= smincol; 77 1.10 dsl smincol = 0; 78 1.10 dsl } 79 1.9 blymn 80 1.10 dsl /* for symmetry allow dstwin coords to be -ve as well */ 81 1.10 dsl if (dminrow < 0) { 82 1.10 dsl sminrow -= dminrow; 83 1.10 dsl dminrow = 0; 84 1.10 dsl } 85 1.10 dsl if (dmincol < 0) { 86 1.10 dsl smincol -= dmincol; 87 1.10 dsl dmincol = 0; 88 1.4 blymn } 89 1.9 blymn 90 1.10 dsl /* Bound dmaxcol for both windows (should be ok for dstwin) */ 91 1.10 dsl if (dmaxcol >= dstwin->maxx) 92 1.10 dsl dmaxcol = dstwin->maxx - 1; 93 1.10 dsl if (smincol + (dmaxcol - dmincol) >= srcwin->maxx) 94 1.11 dsl dmaxcol = srcwin->maxx + dmincol - smincol - 1; 95 1.10 dsl if (dmaxcol < dmincol) 96 1.10 dsl /* nothing in the intersection */ 97 1.10 dsl return OK; 98 1.10 dsl 99 1.10 dsl /* Bound dmaxrow for both windows (should be ok for dstwin) */ 100 1.11 dsl if (dmaxrow >= dstwin->maxy) 101 1.10 dsl dmaxrow = dstwin->maxy - 1; 102 1.10 dsl if (sminrow + (dmaxrow - dminrow) >= srcwin->maxy) 103 1.11 dsl dmaxrow = srcwin->maxy + dminrow - sminrow - 1; 104 1.10 dsl 105 1.12 jdc __CTRACE(__CTRACE_WINDOW, 106 1.12 jdc "copywin %s mode: from (%d,%d) to (%d,%d-%d,%d)\n", 107 1.12 jdc dooverlay ? "overlay" : "overwrite", 108 1.12 jdc sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol); 109 1.10 dsl 110 1.10 dsl for (; dminrow <= dmaxrow; sminrow++, dminrow++) { 111 1.15 roy sp = &srcwin->alines[sminrow]->line[smincol]; 112 1.10 dsl end = sp + dmaxcol - dmincol; 113 1.16 blymn __CTRACE(__CTRACE_WINDOW, "copywin: row %d\n", sminrow); 114 1.14 jdc for (dcol = dmincol; sp <= end; dcol++, sp++) { 115 1.14 jdc /* XXX: Perhaps this should check for the 116 1.14 jdc * background character 117 1.14 jdc */ 118 1.14 jdc if ((dooverlay && !isspace(sp->ch)) || !dooverlay) { 119 1.19 blymn wmove(dstwin, dminrow, dcol); 120 1.16 blymn __CTRACE(__CTRACE_WINDOW, "copywin: dcol = %d\n", dcol); 121 1.13 blymn #ifndef HAVE_WCHAR 122 1.14 jdc __waddch(dstwin, sp); 123 1.13 blymn #else 124 1.14 jdc cc.vals[0] = sp->ch; 125 1.14 jdc cc.attributes = sp->attr; 126 1.14 jdc cc.elements = 1; 127 1.14 jdc np = sp->nsp; 128 1.14 jdc if (np) { 129 1.14 jdc while (np && cc.elements <= 130 1.14 jdc CURSES_CCHAR_MAX) { 131 1.14 jdc cc.vals[cc.elements++] = np->ch; 132 1.14 jdc np = np->next; 133 1.14 jdc } 134 1.10 dsl } 135 1.14 jdc wadd_wch(dstwin, &cc); 136 1.13 blymn #endif /* HAVE_WCHAR */ 137 1.4 blymn } 138 1.1 blymn } 139 1.1 blymn } 140 1.21 blymn __touchwin(dstwin, 0); 141 1.10 dsl return OK; 142 1.1 blymn } 143