Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
PATCH: scrolling
- X-seq: zsh-workers 24018
- From: Peter Stephenson <p.w.stephenson@xxxxxxxxxxxx>
- To: zsh-workers@xxxxxxxxxx (Zsh hackers list)
- Subject: PATCH: scrolling
- Date: Wed, 24 Oct 2007 23:19:31 +0100
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
This adds scrolling of windows to zcurses.
However, I wouldn't like anybody think I'm a complete geek who spends
all his time fiddling with software.
Index: Doc/Zsh/mod_curses.yo
===================================================================
RCS file: /cvsroot/zsh/zsh/Doc/Zsh/mod_curses.yo,v
retrieving revision 1.9
diff -u -r1.9 mod_curses.yo
--- Doc/Zsh/mod_curses.yo 24 Oct 2007 21:53:48 -0000 1.9
+++ Doc/Zsh/mod_curses.yo 24 Oct 2007 22:19:29 -0000
@@ -18,7 +18,8 @@
xitem(tt(zcurses) tt(char) var(targetwin) var(character) )
xitem(tt(zcurses) tt(string) var(targetwin) var(string) )
xitem(tt(zcurses) tt(border) var(targetwin) var(border) )(
-item(tt(zcurses) tt(attr) var(targetwin) [ var({+/-}attribute) | var(fg_col)tt(/)var(bg_col) ] [...])(
+xitem(tt(zcurses) tt(attr) var(targetwin) [ var({+/-}attribute) | var(fg_col)tt(/)var(bg_col) ] [...])
+item(tt(zcurses) tt(scroll) [ tt(on) | tt(off) | {+/-}var(lines) ])(
Manipulate curses windows. All uses of this command should be
bracketed by `tt(zcurses init)' to initialise use of curses, and
`tt(zcurses end)' to end it; omitting `tt(zcurses end)' can cause
@@ -53,6 +54,15 @@
and tt(underline). Each var(fg_col)tt(/)var(bg_col) (to be read as
`var(fg_col) on var(bg_col)') sets the foreground and background color
for character output.
+
+tt(scroll) can be used with tt(on) or tt(off) to enabled or disable
+scrolling of a window when the cursor would otherwise move below the
+window due to typing or output. It can also be used with a positive
+or negative integer to scroll the window up or down the given number
+of lines without changing the current cursor position (which therefore
+appears to move in the opposite direction relative to the window).
+In the second case, if scrolling is tt(off) it is temporarily turned tt(on)
+to allow the window to be scrolled,
)
enditem()
Index: Src/Modules/curses.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Modules/curses.c,v
retrieving revision 1.21
diff -u -r1.21 curses.c
--- Src/Modules/curses.c 24 Oct 2007 21:53:49 -0000 1.21
+++ Src/Modules/curses.c 24 Oct 2007 22:19:29 -0000
@@ -51,9 +51,15 @@
#include <stdio.h>
+enum zc_win_flags {
+ /* Scrolling enabled */
+ ZCWF_SCROLL = 0x0001
+};
+
typedef struct zc_win {
WINDOW *win;
char *name;
+ int flags;
} *ZCWin;
struct zcurses_namenumberpair {
@@ -620,6 +626,49 @@
}
+static int
+zccmd_scroll(const char *nam, char **args)
+{
+ LinkNode node;
+ ZCWin w;
+ int ret = 0;
+
+ node = zcurses_validate_window(args[0], ZCURSES_USED);
+ if (node == NULL) {
+ zwarnnam(nam, "%s: %s", zcurses_strerror(zc_errno), args[0]);
+ return 1;
+ }
+
+ w = (ZCWin)getdata(node);
+
+ if (!strcmp(args[1], "on")) {
+ if (scrollok(w->win, TRUE) == ERR)
+ return 1;
+ w->flags |= ZCWF_SCROLL;
+ } else if (!strcmp(args[1], "off")) {
+ if (scrollok(w->win, FALSE) == ERR)
+ return 1;
+ w->flags &= ~ZCWF_SCROLL;
+ } else {
+ char *endptr;
+ zlong sl = zstrtol(args[1], &endptr, 10);
+ if (*endptr) {
+ zwarnnam(nam, "scroll requires `on', `off' or integer: %s",
+ args[1]);
+ return 1;
+ }
+ if (!(w->flags & ZCWF_SCROLL))
+ scrollok(w->win, TRUE);
+ if (wscrl(w->win, (int)sl) == ERR)
+ ret = 1;
+ if (!(w->flags & ZCWF_SCROLL))
+ scrollok(w->win, FALSE);
+ }
+
+ return ret;
+}
+
+
/*********************
Main builtin handler
*********************/
@@ -643,6 +692,7 @@
{"border", zccmd_border, 1, 1},
{"end", zccmd_endwin, 0, 0},
{"attr", zccmd_attr, 2, -1},
+ {"scroll", zccmd_scroll, 2, 2},
{NULL, (zccmd_t)0, 0, 0}
};
--
Peter Stephenson <p.w.stephenson@xxxxxxxxxxxx>
Web page now at http://homepage.ntlworld.com/p.w.stephenson/
Messages sorted by:
Reverse Date,
Date,
Thread,
Author