summaryrefslogtreecommitdiffstats
path: root/lib/libcurses/lib_scroll.c
diff options
context:
space:
mode:
authortholo <tholo@openbsd.org>1996-06-02 06:04:50 +0000
committertholo <tholo@openbsd.org>1996-06-02 06:04:50 +0000
commitca751a4c440c24b9feedffffe0dd93cc1e00ab0c (patch)
tree3ce3bce27611f188dc5c8a99bd9a2e9f5addfcc7 /lib/libcurses/lib_scroll.c
parentAdd LIBOLDCURSES (diff)
downloadwireguard-openbsd-ca751a4c440c24b9feedffffe0dd93cc1e00ab0c.tar.xz
wireguard-openbsd-ca751a4c440c24b9feedffffe0dd93cc1e00ab0c.zip
Install ncurses as -lcurses and <curses.h>
Install BSD curses library as -locurses and <ocurses.h>
Diffstat (limited to 'lib/libcurses/lib_scroll.c')
-rw-r--r--lib/libcurses/lib_scroll.c110
1 files changed, 110 insertions, 0 deletions
diff --git a/lib/libcurses/lib_scroll.c b/lib/libcurses/lib_scroll.c
new file mode 100644
index 00000000000..d8350a38344
--- /dev/null
+++ b/lib/libcurses/lib_scroll.c
@@ -0,0 +1,110 @@
+
+/***************************************************************************
+* COPYRIGHT NOTICE *
+****************************************************************************
+* ncurses is copyright (C) 1992-1995 *
+* Zeyd M. Ben-Halim *
+* zmbenhal@netcom.com *
+* Eric S. Raymond *
+* esr@snark.thyrsus.com *
+* *
+* Permission is hereby granted to reproduce and distribute ncurses *
+* by any means and for any fee, whether alone or as part of a *
+* larger distribution, in source or in binary form, PROVIDED *
+* this notice is included with any such distribution, and is not *
+* removed from any of its header files. Mention of ncurses in any *
+* applications linked with it is highly appreciated. *
+* *
+* ncurses comes AS IS with no warranty, implied or expressed. *
+* *
+***************************************************************************/
+
+
+
+/*
+** lib_scroll.c
+**
+** The routine wscrl(win, n).
+** positive n scroll the window up (ie. move lines down)
+** negative n scroll the window down (ie. move lines up)
+**
+*/
+
+#include "curses.priv.h"
+#include <stdlib.h>
+#include <string.h>
+
+void _nc_scroll_window(WINDOW *win, int const n, short const top, short const bottom)
+{
+int line, j;
+chtype blank = _nc_render(win, ' ', BLANK);
+
+ TR(TRACE_MOVE, ("_nc_scroll_window(%p, %d, %d, %d)", win, n, top,bottom));
+
+ /*
+ * This used to do a line-text pointer-shuffle instead of text copies.
+ * That (a) doesn't work when the window is derived and doesn't have
+ * its own storage, (b) doesn't save you a lot on modern machines
+ * anyway. Your typical memcpy implementations are coded in
+ * assembler using a tight BLT loop; for the size of copies we're
+ * talking here, the total execution time is dominated by the one-time
+ * setup cost. So there is no point in trying to be excessively
+ * clever -- esr.
+ */
+
+ /* shift n lines downwards */
+ if (n < 0) {
+ for (line = bottom; line >= top-n; line--) {
+ memcpy(win->_line[line].text,
+ win->_line[line+n].text,
+ (size_t)(sizeof(chtype) * (win->_maxx+1)));
+ win->_line[line].oldindex = win->_line[line+n].oldindex;
+ }
+ for (line = top; line < top-n; line++) {
+ for (j = 0; j <= win->_maxx; j ++)
+ win->_line[line].text[j] = blank;
+ win->_line[line].oldindex = _NEWINDEX;
+ win->_line[line].firstchar = 0;
+ win->_line[line].lastchar = win->_maxx;
+ }
+ }
+
+ /* shift n lines upwards */
+ if (n > 0) {
+ for (line = top; line <= bottom-n; line++) {
+ memcpy(win->_line[line].text,
+ win->_line[line+n].text,
+ (size_t)(sizeof(chtype) * (win->_maxx+1)));
+ win->_line[line].oldindex = win->_line[line+n].oldindex;
+ }
+ for (line = bottom; line > bottom-n; line--) {
+ for (j = 0; j <= win->_maxx; j ++)
+ win->_line[line].text[j] = blank;
+ win->_line[line].oldindex = _NEWINDEX;
+ win->_line[line].firstchar = 0;
+ win->_line[line].lastchar = win->_maxx;
+ }
+ }
+}
+
+int
+wscrl(WINDOW *win, int n)
+{
+ T(("wscrl(%p,%d) called", win, n));
+
+ if (! win->_scroll)
+ return ERR;
+
+ if (n == 0)
+ return OK;
+
+ if ((n > (win->_regbottom - win->_regtop)) ||
+ (-n > (win->_regbottom - win->_regtop)))
+ return ERR;
+
+ _nc_scroll_window(win, n, win->_regtop, win->_regbottom);
+ touchline(win, win->_regtop, (int)(win->_regbottom - win->_regtop + 1));
+
+ _nc_synchook(win);
+ return OK;
+}