* 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.
This commit is contained in:
blymn 2000-04-23 14:14:49 +00:00
parent 6d972981ff
commit cf5ffc46f2
3 changed files with 109 additions and 37 deletions

View File

@ -236,6 +236,48 @@ Wipes the window clear from the current \*y to the end of the line.
Get the red, green and blue values of color
.Vn color .
.Ds
.Fn copywin "const WINDOW *src" "WINDOW *dst" "int sminrow" "int smincol" "int dminrow" "int dmincol" "int dmaxrow" "int dmaxcol" "int overlay"
.De
Copies the contents of the window
.Vn src
starting at (
.Vn sminrow ,
.Vn smincol )
to the destination window
.Vn dst
starting at (
.Vn dminrow ,
.Vn dmincol )
and ending at either the end of the source window or (
.Vn dmaxrow ,
.Vn dmaxcol )
whichever is the lesser. The parameter
.Vn overlay
determines the nature of the copy. If
.Vn overlay
is TRUE then only the non-space characters from
.Vn src
are copied to
.Vn dst .
If
.Vn overlay
is FALSE then all characters are copied from
.Vn src
to
.Vn dst.
.Ds
.Fn curs_set "int visibility"
.De
Sets the visibility of the screen cursor. The parameter
.Vn visibility
can be one of three values, 0 means make the cursor invisible, 1 means
set the cursor to normal visibility and 2 sets the cursor to high
visibility. In all cases the old mode of the cursor is returned if
the call was successful and
.b ERR
is returned if the terminal cannot support the requested visibility
mode.
.Ds
.Fn crmode "" \(dg
.De
Identical to
@ -285,6 +327,25 @@ Therefore,
subwindows should be deleted before their
outer windows are.
.Ds
.Fn derwin "WINDOW *orig" "int nlines" "int ncols" "int by" "int bx"
.De
Performs a function very similar to that of
.Fn subwin .
The difference being that with
.Fn derwin
the origin of the child window given by (
.Vn by ,
.Vn bx )
is relative to the origin of the parent window
.Vn orig
instead of being absolute screen coordinates as they are in
.Fn subwin .
.Ds
.Fn dupwin "WINDOW *win"
.De
Creates an exact copy of the window
.Vn win .
.Ds
.Fn echo "" \(dg
.De
Sets the terminal to echo characters.
@ -562,6 +623,17 @@ This flag
(initially 0)
retains its value until changed by the user.
.Ds
.Fn longname "" \(dg
.De
Returns a string containing the verbose description of the terminal.
.Ds
.Fn meta "WINDOW *win" "bool bf"
.De
Manipulates the meta mode on terminals that support this capability.
Note that
.Vn win
is always ignored.
.Ds
.Fn move "int y" "int x"
.De
Change the current \*y of the window to
@ -1038,6 +1110,18 @@ to be put in underscore mode on the terminal
This is equivalent to
.Fn attron "A_UNDERLINE" .
.Ds
.Fn ungetch "int c"
.De
Places the contents of
.Vn c
converted to a character back into the input queue. Only one
character of push back before a subsequent call to
.Fn getch
or
.Fn wgetch
is guaranteed to function correctly. The results of attempting more
than one character of push back is undefined.
.Ds
.Fn vwprintw "WINDOW *win" "const char *fmt" "va_list ap"
.De
Identical to

View File

@ -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);
}
return (OK);
}
#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)) || (overlay == FALSE)){
wmove(dstwin, y2, x);
__waddch(dstwin, sp);
}
x++;
}
}
return (OK);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: getch.c,v 1.23 2000/04/22 21:14:19 thorpej Exp $ */
/* $NetBSD: getch.c,v 1.24 2000/04/23 14:14:49 blymn Exp $ */
/*
* Copyright (c) 1981, 1993, 1994
@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)getch.c 8.2 (Berkeley) 5/4/94";
#else
__RCSID("$NetBSD: getch.c,v 1.23 2000/04/22 21:14:19 thorpej Exp $");
__RCSID("$NetBSD: getch.c,v 1.24 2000/04/23 14:14:49 blymn Exp $");
#endif
#endif /* not lint */
@ -568,6 +568,8 @@ wgetch(WINDOW *win)
&& win->curx == win->maxx - 1 && win->cury == win->maxy - 1
&& __echoit)
return (ERR);
wrefresh(win);
#ifdef DEBUG
__CTRACE("wgetch: __echoit = %d, __rawmode = %d, flags = %0.2o\n",
__echoit, __rawmode, win->flags);
@ -654,7 +656,6 @@ wgetch(WINDOW *win)
if (weset)
nocbreak();
wrefresh(win);
return ((inp < 0) || (inp == ERR) ? ERR : inp);
}