summaryrefslogtreecommitdiff
path: root/lib/libcurses/copywin.c
diff options
context:
space:
mode:
authorblymn <blymn@NetBSD.org>2000-04-23 14:14:49 +0000
committerblymn <blymn@NetBSD.org>2000-04-23 14:14:49 +0000
commitcf5ffc46f20063c856be2e2ec2f8db705ed61d5c (patch)
tree62f406041bcaf6186e0bfcf7d2fe2f63fe443522 /lib/libcurses/copywin.c
parent6d972981ff23aff640534634bef56abc91d1a6c6 (diff)
* Fixed bug in copywin which was copying more than it should.
* Changed call to wrefresh in wgetch to be before input read. * Changed default old cursor mode to be high vis in curs_set * Added documentation for various new functions to fns.doc.
Diffstat (limited to 'lib/libcurses/copywin.c')
-rw-r--r--lib/libcurses/copywin.c51
1 files changed, 19 insertions, 32 deletions
diff --git a/lib/libcurses/copywin.c b/lib/libcurses/copywin.c
index bf497c5f144..48318e0fa31 100644
--- a/lib/libcurses/copywin.c
+++ b/lib/libcurses/copywin.c
@@ -1,4 +1,4 @@
-/* $NetBSD: copywin.c,v 1.3 2000/04/20 13:12:14 blymn Exp $ */
+/* $NetBSD: copywin.c,v 1.4 2000/04/23 14:14:49 blymn Exp $ */
/*-
* Copyright (c) 1998-1999 Brett Lymn
@@ -49,8 +49,8 @@ int copywin(const WINDOW *srcwin, WINDOW *dstwin, int sminrow,
int starty, startx, endy, endx, x, y, y1, y2, smaxrow, smaxcol;
__LDATA *sp, *end;
- smaxrow = sminrow + dmaxrow - dminrow;
- smaxcol = smincol + dmaxcol - dmincol;
+ smaxrow = min(sminrow + dmaxrow - dminrow, srcwin->maxy - sminrow);
+ smaxcol = min(smincol + dmaxcol - dmincol, srcwin->maxx - smincol);
starty = max(sminrow, dminrow);
startx = max(smincol, dmincol);
endy = min(sminrow + smaxrow, dminrow + dmaxrow);
@@ -58,43 +58,30 @@ int copywin(const WINDOW *srcwin, WINDOW *dstwin, int sminrow,
if (starty >= endy || startx >= endx)
return (OK);
- if (overlay == TRUE) {
- /* non destructive copy */
#ifdef DEBUG
+ if (overlay == TRUE) {
__CTRACE("copywin overlay mode: from (%d,%d) to (%d,%d)\n",
starty, startx, endy, endx);
-#endif
- y1 = starty - sminrow;
- y2 = starty - dminrow;
- for (y = starty; y < endy; y++, y1++, y2++) {
- end = &srcwin->lines[y1]->line[endx - srcwin->begx];
- x = startx - dstwin->begx;
- for (sp = &srcwin->lines[y1]->line[startx - srcwin->begx];
- sp < end; sp++) {
- if (!isspace(sp->ch)) {
- wmove(dstwin, y2, x);
- __waddch(dstwin, sp);
- }
- x++;
- }
- }
- return (OK);
} else {
- /* destructive copy */
-#ifdef DEBUG
__CTRACE("copywin overwrite mode: from (%d,%d) to (%d,%d)\n",
starty, startx, endy, endx);
+ }
+
#endif
- x = endx - startx;
- for (y = starty; y < endy; y++) {
- (void) memcpy(
- &dstwin->lines[y - dstwin->begy]->line[startx - dstwin->begx],
- &srcwin->lines[y - srcwin->begy]->line[startx - srcwin->begx],
- (size_t) x * __LDATASIZE);
- __touchline(dstwin, y - dstwin->begy, (int) (startx - dstwin->begx),
- (int) (endx - dstwin->begx), 0);
+ y1 = starty - sminrow;
+ y2 = starty - dminrow;
+ for (y = starty; y < endy; y++, y1++, y2++) {
+ end = &srcwin->lines[y1]->line[endx - srcwin->begx];
+ x = startx - dstwin->begx;
+ for (sp = &srcwin->lines[y1]->line[startx - srcwin->begx];
+ sp < end; sp++) {
+ if ((!isspace(sp->ch)) || (overlay == FALSE)){
+ wmove(dstwin, y2, x);
+ __waddch(dstwin, sp);
+ }
+ x++;
}
- return (OK);
}
+ return (OK);
}