Module Name: src
Committed By: roy
Date: Tue Jan 10 10:13:24 UTC 2017
Modified Files:
src/distrib/sets/lists/comp: mi
src/lib/libcurses: Makefile curses.h curses_private.h curses_screen.3
initscr.c resize.c screen.c setterm.c
Log Message:
Implement POSIX curses function ripoffline(3).
To generate a diff of this commit:
cvs rdiff -u -r1.2100 -r1.2101 src/distrib/sets/lists/comp/mi
cvs rdiff -u -r1.81 -r1.82 src/lib/libcurses/Makefile
cvs rdiff -u -r1.119 -r1.120 src/lib/libcurses/curses.h
cvs rdiff -u -r1.57 -r1.58 src/lib/libcurses/curses_private.h
cvs rdiff -u -r1.21 -r1.22 src/lib/libcurses/curses_screen.3
cvs rdiff -u -r1.30 -r1.31 src/lib/libcurses/initscr.c
cvs rdiff -u -r1.22 -r1.23 src/lib/libcurses/resize.c
cvs rdiff -u -r1.27 -r1.28 src/lib/libcurses/screen.c
cvs rdiff -u -r1.59 -r1.60 src/lib/libcurses/setterm.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/distrib/sets/lists/comp/mi
diff -u src/distrib/sets/lists/comp/mi:1.2100 src/distrib/sets/lists/comp/mi:1.2101
--- src/distrib/sets/lists/comp/mi:1.2100 Sat Jan 7 04:44:12 2017
+++ src/distrib/sets/lists/comp/mi Tue Jan 10 10:13:24 2017
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.2100 2017/01/07 04:44:12 ozaki-r Exp $
+# $NetBSD: mi,v 1.2101 2017/01/10 10:13:24 roy Exp $
#
# Note: don't delete entries from here - mark them as "obsolete" instead.
./etc/mtree/set.comp comp-sys-root
@@ -8689,6 +8689,7 @@
./usr/share/man/cat3/rintf.0 comp-c-catman .cat
./usr/share/man/cat3/rintl.0 comp-c-catman .cat
./usr/share/man/cat3/ripemd.0 comp-obsolete obsolete
+./usr/share/man/cat3/ripoffline.0 comp-c-catman .cat
./usr/share/man/cat3/rmd160.0 comp-c-catman .cat
./usr/share/man/cat3/rmtops.0 comp-c-catman .cat
./usr/share/man/cat3/round.0 comp-c-catman .cat
@@ -16037,6 +16038,7 @@
./usr/share/man/html3/rint.html comp-c-htmlman html
./usr/share/man/html3/rintf.html comp-c-htmlman html
./usr/share/man/html3/rintl.html comp-c-htmlman html
+./usr/share/man/html3/ripoffline.html comp-c-htmlman html
./usr/share/man/html3/rmd160.html comp-c-htmlman html
./usr/share/man/html3/rmtops.html comp-c-htmlman html
./usr/share/man/html3/round.html comp-c-htmlman html
@@ -23384,6 +23386,7 @@
./usr/share/man/man3/rintf.3 comp-c-man .man
./usr/share/man/man3/rintl.3 comp-c-man .man
./usr/share/man/man3/ripemd.3 comp-obsolete obsolete
+./usr/share/man/man3/ripoffline.3 comp-c-man .man
./usr/share/man/man3/rmd160.3 comp-c-man .man
./usr/share/man/man3/rmtops.3 comp-c-man .man
./usr/share/man/man3/round.3 comp-c-man .man
Index: src/lib/libcurses/Makefile
diff -u src/lib/libcurses/Makefile:1.81 src/lib/libcurses/Makefile:1.82
--- src/lib/libcurses/Makefile:1.81 Thu Jan 5 23:15:43 2017
+++ src/lib/libcurses/Makefile Tue Jan 10 10:13:24 2017
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.81 2017/01/05 23:15:43 roy Exp $
+# $NetBSD: Makefile,v 1.82 2017/01/10 10:13:24 roy Exp $
# @(#)Makefile 8.2 (Berkeley) 1/2/94
.include <bsd.own.mk>
@@ -143,6 +143,7 @@ MLINKS+= curses_addch.3 addch.3 curses_a
curses_tty.3 reset_prog_mode.3 curses_tty.3 reset_shell_mode.3 \
curses_tty.3 resetty.3 \
curses_screen.3 resizeterm.3 curses_screen.3 resize_term.3 \
+ curses_screen.3 ripoffline.3 \
curses_tty.3 savetty.3 curses_scanw.3 scanw.3 \
curses_scroll.3 scrl.3 curses_scroll.3 scroll.3 \
curses_scroll.3 scrollok.3 curses_scroll.3 setscrreg.3 \
Index: src/lib/libcurses/curses.h
diff -u src/lib/libcurses/curses.h:1.119 src/lib/libcurses/curses.h:1.120
--- src/lib/libcurses/curses.h:1.119 Fri Jan 6 09:14:07 2017
+++ src/lib/libcurses/curses.h Tue Jan 10 10:13:24 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: curses.h,v 1.119 2017/01/06 09:14:07 roy Exp $ */
+/* $NetBSD: curses.h,v 1.120 2017/01/10 10:13:24 roy Exp $ */
/*
* Copyright (c) 1981, 1993, 1994
@@ -746,6 +746,7 @@ int reset_shell_mode(void);
int resetty(void);
int resizeterm(int, int);
int resize_term(int, int);
+int ripoffline(int, int (*)(WINDOW *, int));
int savetty(void);
int scanw(const char *, ...) __scanflike(1, 2);
int scroll(WINDOW *);
Index: src/lib/libcurses/curses_private.h
diff -u src/lib/libcurses/curses_private.h:1.57 src/lib/libcurses/curses_private.h:1.58
--- src/lib/libcurses/curses_private.h:1.57 Fri Jan 6 09:14:07 2017
+++ src/lib/libcurses/curses_private.h Tue Jan 10 10:13:24 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: curses_private.h,v 1.57 2017/01/06 09:14:07 roy Exp $ */
+/* $NetBSD: curses_private.h,v 1.58 2017/01/10 10:13:24 roy Exp $ */
/*-
* Copyright (c) 1998-2000 Brett Lymn
@@ -201,6 +201,8 @@ struct __screen {
int lx, ly; /* loop parameters for refresh */
int COLS; /* Columns on the screen. */
int LINES; /* Lines on the screen. */
+ int ripped_top; /* Lines ripped from the top of the screen. */
+ int ripped_bottom; /* Lines ripped from the bottom. */
int ESCDELAY; /* Delay between keys in esc seq's. */
#define ESCDELAY_DEFAULT 300 /* milliseconds. */
int TABSIZE; /* Size of a tab. */
Index: src/lib/libcurses/curses_screen.3
diff -u src/lib/libcurses/curses_screen.3:1.21 src/lib/libcurses/curses_screen.3:1.22
--- src/lib/libcurses/curses_screen.3:1.21 Thu Jan 5 21:25:18 2017
+++ src/lib/libcurses/curses_screen.3 Tue Jan 10 10:13:24 2017
@@ -1,4 +1,4 @@
-.\" $NetBSD: curses_screen.3,v 1.21 2017/01/05 21:25:18 roy Exp $
+.\" $NetBSD: curses_screen.3,v 1.22 2017/01/10 10:13:24 roy Exp $
.\"
.\" Copyright (c) 2002
.\" Brett Lymn ([email protected], [email protected])
@@ -30,12 +30,13 @@
.\" SUCH DAMAGE.
.\"
.\"
-.Dd January 5, 2017
+.Dd January 9, 2017
.Dt CURSES_SCREEN 3
.Os
.Sh NAME
.Nm curses_screen ,
.Nm filter ,
+.Nm ripoffline ,
.Nm use_env ,
.Nm newterm ,
.Nm set_term ,
@@ -55,6 +56,8 @@
.In curses.h
.Ft void
.Fn filter "void"
+.Ft int
+.Fn ripoffline "int line" "int (*init)(WINDOW *win, int cols)"
.Ft void
.Fn use_env "bool value"
.Ft SCREEN *
@@ -212,6 +215,36 @@ Set lines equal to 1.
.El
.Pp
The
+.Fn ripoffline
+funcion will rip a line from
+.Dv stdscr
+at the top if
+.Fa line
+is positive, or at the bottom if negative.
+When
+.Fn initscr
+or
+.Fn newterm
+is called, a window will be created for each line ripped and passed
+to the
+.Fa init
+function pointer alongwith the number of columns in the window.
+This init function cannot use the
+.Dv LINES
+or
+.Dv COLS
+variables and cannot call
+.Xr wrefresh 3
+or
+.Xr doupdate 3 ,
+but may call
+.Xr wnoutrefresh 3 .
+.Dv LINES
+will be reduced by the total number of lines ripped off.
+.Fn ripoffline
+can be called up to five times.
+.Pp
+The
.Fn use_env
function determines whether the environment variables
.Ev LINES
Index: src/lib/libcurses/initscr.c
diff -u src/lib/libcurses/initscr.c:1.30 src/lib/libcurses/initscr.c:1.31
--- src/lib/libcurses/initscr.c:1.30 Fri Jan 6 13:53:18 2017
+++ src/lib/libcurses/initscr.c Tue Jan 10 10:13:24 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: initscr.c,v 1.30 2017/01/06 13:53:18 roy Exp $ */
+/* $NetBSD: initscr.c,v 1.31 2017/01/10 10:13:24 roy Exp $ */
/*
* Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
#if 0
static char sccsid[] = "@(#)initscr.c 8.2 (Berkeley) 5/4/94";
#else
-__RCSID("$NetBSD: initscr.c,v 1.30 2017/01/06 13:53:18 roy Exp $");
+__RCSID("$NetBSD: initscr.c,v 1.31 2017/01/10 10:13:24 roy Exp $");
#endif
#endif /* not lint */
@@ -73,7 +73,8 @@ initscr(void)
__rawmode = _cursesi_screen->rawmode;
__noqch = _cursesi_screen->noqch;
COLS = _cursesi_screen->COLS;
- LINES = _cursesi_screen->LINES;
+ LINES = _cursesi_screen->LINES
+ - _cursesi_screen->ripped_top - _cursesi_screen->ripped_bottom;
COLORS = _cursesi_screen->COLORS;
COLOR_PAIRS = _cursesi_screen->COLOR_PAIRS;
__GT = _cursesi_screen->GT;
Index: src/lib/libcurses/resize.c
diff -u src/lib/libcurses/resize.c:1.22 src/lib/libcurses/resize.c:1.23
--- src/lib/libcurses/resize.c:1.22 Fri Jan 6 13:53:18 2017
+++ src/lib/libcurses/resize.c Tue Jan 10 10:13:24 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: resize.c,v 1.22 2017/01/06 13:53:18 roy Exp $ */
+/* $NetBSD: resize.c,v 1.23 2017/01/10 10:13:24 roy Exp $ */
/*
* Copyright (c) 2001
@@ -40,7 +40,7 @@
#if 0
static char sccsid[] = "@(#)resize.c blymn 2001/08/26";
#else
-__RCSID("$NetBSD: resize.c,v 1.22 2017/01/06 13:53:18 roy Exp $");
+__RCSID("$NetBSD: resize.c,v 1.23 2017/01/10 10:13:24 roy Exp $");
#endif
#endif /* not lint */
@@ -144,7 +144,10 @@ bool
is_term_resized(int nlines, int ncols)
{
- return (nlines > 0 && ncols > 0 && (nlines != LINES || ncols != COLS));
+ return (nlines > 0 && ncols > 0 &&
+ (nlines != _cursesi_screen->LINES
+ + _cursesi_screen->ripped_top + _cursesi_screen->ripped_bottom ||
+ ncols != _cursesi_screen->COLS));
}
/*
@@ -190,6 +193,7 @@ resize_term(int nlines, int ncols)
return ERR;
if (__resizeterm(__virtscr, nlines, ncols) == ERR)
return ERR;
+ nlines -= _cursesi_screen->ripped_top - _cursesi_screen->ripped_bottom;
if (__resizeterm(stdscr, nlines, ncols) == ERR)
return ERR;
Index: src/lib/libcurses/screen.c
diff -u src/lib/libcurses/screen.c:1.27 src/lib/libcurses/screen.c:1.28
--- src/lib/libcurses/screen.c:1.27 Fri Jan 6 13:53:18 2017
+++ src/lib/libcurses/screen.c Tue Jan 10 10:13:24 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: screen.c,v 1.27 2017/01/06 13:53:18 roy Exp $ */
+/* $NetBSD: screen.c,v 1.28 2017/01/10 10:13:24 roy Exp $ */
/*
* Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
#if 0
static char sccsid[] = "@(#)screen.c 8.2 (blymn) 11/27/2001";
#else
-__RCSID("$NetBSD: screen.c,v 1.27 2017/01/06 13:53:18 roy Exp $");
+__RCSID("$NetBSD: screen.c,v 1.28 2017/01/10 10:13:24 roy Exp $");
#endif
#endif /* not lint */
@@ -45,6 +45,14 @@ __RCSID("$NetBSD: screen.c,v 1.27 2017/0
static int filtered;
+/* List of ripoffline calls */
+#define NRIPS 5
+static struct ripoff {
+ int nlines;
+ int (*init)(WINDOW *, int);
+} ripoffs[NRIPS];
+static int nrips;
+
/*
* filter has to be called before either initscr or newterm.
*/
@@ -56,6 +64,24 @@ filter(void)
}
/*
+ *ripoffline --
+ * Ripoff a line from the top of bottom of stdscr.
+ * Must be called before initscr or newterm.
+ */
+int
+ripoffline(int line, int (*init)(WINDOW *, int))
+{
+
+ if (nrips >= NRIPS || init == NULL)
+ return ERR; /* This makes sense, but not standards compliant. */
+ if (line == 0)
+ return OK;
+ ripoffs[nrips].nlines = line < 0 ? -1 : 1;
+ ripoffs[nrips++].init = init;
+ return OK;
+}
+
+/*
* set_term --
* Change the term to the given screen.
*
@@ -72,7 +98,8 @@ set_term(SCREEN *new)
old_screen->rawmode = __rawmode;
old_screen->noqch = __noqch;
old_screen->COLS = COLS;
- old_screen->LINES = LINES;
+ old_screen->LINES = LINES
+ + old_screen->ripped_top + old_screen->ripped_bottom;
old_screen->COLORS = COLORS;
old_screen->COLOR_PAIRS = COLOR_PAIRS;
old_screen->GT = __GT;
@@ -87,7 +114,7 @@ set_term(SCREEN *new)
__rawmode = new->rawmode;
__noqch = new->noqch;
COLS = new->COLS;
- LINES = new->LINES;
+ LINES = new->LINES - new->ripped_top - new->ripped_bottom;
COLORS = new->COLORS;
COLOR_PAIRS = new->COLOR_PAIRS;
__GT = new->GT;
@@ -124,6 +151,7 @@ newterm(char *type, FILE *outfd, FILE *i
{
SCREEN *new_screen;
char *sp;
+ int i;
sp = type;
if (type == NULL && (sp = getenv("TERM")) == NULL)
@@ -158,7 +186,8 @@ newterm(char *type, FILE *outfd, FILE *i
new_screen->unget_len = 32;
if ((new_screen->unget_list =
- malloc(sizeof(wchar_t) * new_screen->unget_len)) == NULL) {
+ malloc(sizeof(wchar_t) * new_screen->unget_len)) == NULL)
+ {
goto error_exit;
}
new_screen->unget_pos = 0;
@@ -180,21 +209,48 @@ newterm(char *type, FILE *outfd, FILE *i
0, 0, 0, FALSE)) == NULL)
goto error_exit;
- if ((new_screen->stdscr = __newwin(new_screen, 0,
- 0, 0, 0, FALSE)) == NULL) {
+ if ((new_screen->__virtscr = __newwin(new_screen, 0,
+ 0, 0, 0, FALSE)) == NULL)
+ {
delwin(new_screen->curscr);
goto error_exit;
}
- clearok(new_screen->stdscr, 1);
+ for (i = 0; i < nrips; i++) {
+ const struct ripoff *r = &ripoffs[i];
+ int nlines = r->nlines < 0 ? -r->nlines : r->nlines;
+ WINDOW *w;
+
+ w = __newwin(new_screen, nlines, 0,
+ r->nlines < 0 ? LINES + r->nlines : new_screen->ripped_top,
+ 0, FALSE);
+ if (w != NULL) {
+ if (r->nlines < 0)
+ new_screen->ripped_bottom += nlines;
+ else
+ new_screen->ripped_top += nlines;
+ LINES -= nlines;
+ }
+ r->init(w, COLS);
+#ifdef DEBUG
+ if (w != NULL)
+ __CTRACE(__CTRACE_SCREEN,
+ "newterm: ripped %d lines from the %s\n",
+ nlines, r->nlines < 0 ? "bottom" : "top");
+#endif
+ }
+ nrips = 0; /* Reset the stack. */
- if ((new_screen->__virtscr = __newwin(new_screen, 0,
- 0, 0, 0, FALSE)) == NULL) {
+ new_screen->stdscr = __newwin(new_screen, LINES, 0,
+ new_screen->ripped_top, 0, FALSE);
+ if (new_screen->stdscr == NULL) {
delwin(new_screen->curscr);
- delwin(new_screen->stdscr);
+ delwin(new_screen->__virtscr);
goto error_exit;
}
+ clearok(new_screen->stdscr, 1);
+
__init_getch(new_screen);
__init_acs(new_screen);
#ifdef HAVE_WCHAR
Index: src/lib/libcurses/setterm.c
diff -u src/lib/libcurses/setterm.c:1.59 src/lib/libcurses/setterm.c:1.60
--- src/lib/libcurses/setterm.c:1.59 Fri Jan 6 13:53:18 2017
+++ src/lib/libcurses/setterm.c Tue Jan 10 10:13:24 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: setterm.c,v 1.59 2017/01/06 13:53:18 roy Exp $ */
+/* $NetBSD: setterm.c,v 1.60 2017/01/10 10:13:24 roy Exp $ */
/*
* Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
#if 0
static char sccsid[] = "@(#)setterm.c 8.8 (Berkeley) 10/25/94";
#else
-__RCSID("$NetBSD: setterm.c,v 1.59 2017/01/06 13:53:18 roy Exp $");
+__RCSID("$NetBSD: setterm.c,v 1.60 2017/01/10 10:13:24 roy Exp $");
#endif
#endif /* not lint */
@@ -150,7 +150,7 @@ _cursesi_setterm(char *type, SCREEN *scr
if (screen->COLS <= 4)
return ERR;
- LINES = screen->LINES;
+ LINES = screen->LINES - screen->ripped_top - screen->ripped_bottom;
COLS = screen->COLS;
ESCDELAY = screen->ESCDELAY;
TABSIZE = screen->TABSIZE;
@@ -282,7 +282,7 @@ void
_cursesi_resetterm(SCREEN *screen)
{
- LINES = screen->LINES;
+ LINES = screen->LINES - screen->ripped_top - screen->ripped_bottom;
COLS = screen->COLS;
ESCDELAY = screen->ESCDELAY;
TABSIZE = screen->TABSIZE;