about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--Doc/Zsh/mod_curses.yo11
-rw-r--r--Src/Modules/curses.c30
3 files changed, 42 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index fb09814a3..c221337a6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2007-10-28  Peter Stephenson  <p.w.stephenson@ntlworld.com>
 
+	* 24028: Doc/Zsh/mod_curses.yo, Src/Modules/curses.c:
+	add "zcurses timeout".
+
 	* 24027: Doc/Zsh/mod_curses.yo, Src/Modules/curses.c:
 	add "touch", subwindows, optimized "refresh".
 
diff --git a/Doc/Zsh/mod_curses.yo b/Doc/Zsh/mod_curses.yo
index b53238288..b88c7979b 100644
--- a/Doc/Zsh/mod_curses.yo
+++ b/Doc/Zsh/mod_curses.yo
@@ -23,7 +23,8 @@ xitem(tt(zcurses) tt(string) var(targetwin) var(string) )
 xitem(tt(zcurses) tt(border) var(targetwin) var(border) )(
 xitem(tt(zcurses) tt(attr) var(targetwin) [ var({+/-}attribute) | var(fg_col)tt(/)var(bg_col) ] [...])
 xitem(tt(zcurses) tt(scroll) [ tt(on) | tt(off) | {+/-}var(lines) ])
-item(tt(input) var(targetwin) [ var(param) [ var(kpparm) ] ])(
+xitem(tt(zcurses) tt(input) var(targetwin) [ var(param) [ var(kpparm) ] ])
+item(tt(zcurses) tt(timeout) var(targetwin) var(intval))(
 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
@@ -125,6 +126,14 @@ with the prefix `tt(KEY_)' removed.  Other keys cause a value to be set in
 var(param) as before.  On a succesful return only one of var(param) or
 var(kpparm) contains a non-empty string; the other is set to an empty
 string.
+
+tt(timeout) specifies a timeout value for input from var(targetwin).
+If var(intval) is negative, `tt(zcurses input)' waits indefinitely for
+a character to be typed; this is the default.  If var(intval) is zero,
+`tt(zcurses input)' returns immediately; if there is typeahead it is
+returned, else no input is done and status 1 is returned.  If var(intval)
+is positive, `tt(zcurses input)' waits var(intval) milliseconds for
+input and if there is none at the end of that period returns status 1.
 )
 enditem()
 
diff --git a/Src/Modules/curses.c b/Src/Modules/curses.c
index 0f9647fb9..063ac9014 100644
--- a/Src/Modules/curses.c
+++ b/Src/Modules/curses.c
@@ -562,7 +562,7 @@ zccmd_refresh(const char *nam, char **args)
 
 
 static int
-zccmd_move(const char *nam, char **args)
+zccmd_move(const char *nam,  char **args)
 {
     int y, x;
     LinkNode node;
@@ -936,6 +936,33 @@ zccmd_input(const char *nam, char **args)
 
 
 static int
+zccmd_timeout(const char *nam, char **args)
+{
+    LinkNode node;
+    ZCWin w;
+    int to;
+    char *eptr;
+
+    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);
+
+    to = (int)zstrtol(args[1], &eptr, 10);
+    if (*eptr) {
+	zwarnnam(nam, "timeout requires an integer: %s", args[1]);
+	return 1;
+    }
+
+    wtimeout(w->win, to);
+    return 0;
+}
+
+
+static int
 zccmd_position(const char *nam, char **args)
 {
     LinkNode node;
@@ -1019,6 +1046,7 @@ bin_zcurses(char *nam, char **args, Options ops, UNUSED(int func))
 	{"attr", zccmd_attr, 2, -1},
 	{"scroll", zccmd_scroll, 2, 2},
 	{"input", zccmd_input, 1, 3},
+	{"timeout", zccmd_timeout, 2, 2},
 	{"touch", zccmd_touch, 1, -1},
 	{NULL, (zccmd_t)0, 0, 0}
     };