aboutsummaryrefslogtreecommitdiff
path: root/contrib/ncurses/ncurses/tty
diff options
context:
space:
mode:
authorPeter Wemm <peter@FreeBSD.org>2000-01-26 16:43:25 +0000
committerPeter Wemm <peter@FreeBSD.org>2000-01-26 16:43:25 +0000
commit1759abf3ae1a38b7578df7996346544b66e508ad (patch)
tree506da7a5cf693bf8780ad013837cbd67913bedbb /contrib/ncurses/ncurses/tty
parent0e3d540892016a47f6a68ec9ba2879d35ce5f7c2 (diff)
downloadsrc-1759abf3ae1a38b7578df7996346544b66e508ad.tar.gz
src-1759abf3ae1a38b7578df7996346544b66e508ad.zip
Import ncurses-5.0-release to update the 5.0-prerelease that we had.vendor/ncurses/5.0
Notes
Notes: svn path=/vendor/ncurses/dist/; revision=56639 svn path=/vendor/ncurses/5.0/; revision=56641; tag=vendor/ncurses/5.0
Diffstat (limited to 'contrib/ncurses/ncurses/tty')
-rw-r--r--contrib/ncurses/ncurses/tty/lib_mvcur.c12
-rw-r--r--contrib/ncurses/ncurses/tty/lib_tstp.c14
-rw-r--r--contrib/ncurses/ncurses/tty/lib_twait.c81
-rw-r--r--contrib/ncurses/ncurses/tty/tty_update.c109
4 files changed, 145 insertions, 71 deletions
diff --git a/contrib/ncurses/ncurses/tty/lib_mvcur.c b/contrib/ncurses/ncurses/tty/lib_mvcur.c
index 9eca0269390e..955eb8c6cd84 100644
--- a/contrib/ncurses/ncurses/tty/lib_mvcur.c
+++ b/contrib/ncurses/ncurses/tty/lib_mvcur.c
@@ -153,7 +153,7 @@
#include <term.h>
#include <ctype.h>
-MODULE_ID("$Id: lib_mvcur.c,v 1.57 1999/06/26 22:16:04 tom Exp $")
+MODULE_ID("$Id: lib_mvcur.c,v 1.60 1999/10/03 01:08:27 Alexander.V.Lukyanov Exp $")
#define STRLEN(s) (s != 0) ? strlen(s) : 0
@@ -246,10 +246,10 @@ int _nc_msec_cost(const char *const cap, int affcnt)
{
if (isdigit(*cp))
number = number * 10 + (*cp - '0');
- else if (*cp == '.')
- number += (*++cp - 10) / 10.0;
else if (*cp == '*')
number *= affcnt;
+ else if (*cp == '.' && (*++cp != '>') && isdigit(*cp))
+ number += (*cp - '0') / 10.0;
}
cum_cost += number * 10;
@@ -734,6 +734,7 @@ onscreen_mvcur(int yold,int xold,int ynew,int xnew, bool ovw)
{
char use[OPT_SIZE], *sp;
int tactic = 0, newcost, usecost = INFINITY;
+ int t5_cr_cost;
#if defined(MAIN) || defined(NCURSES_TEST)
struct timeval before, after;
@@ -817,13 +818,14 @@ onscreen_mvcur(int yold,int xold,int ynew,int xnew, bool ovw)
* tactic #5: use left margin for wrap to right-hand side,
* unless strange wrap behavior indicated by xenl might hose us.
*/
+ t5_cr_cost = (xold>0 ? SP->_cr_cost : 0);
if (auto_left_margin && !eat_newline_glitch
&& yold > 0 && cursor_left
&& ((newcost=relative_move(NULL, yold-1, screen_columns-1, ynew, xnew, ovw)) != INFINITY)
- && SP->_cr_cost + SP->_cub1_cost + newcost + newcost < usecost)
+ && t5_cr_cost + SP->_cub1_cost + newcost < usecost)
{
tactic = 5;
- usecost = SP->_cr_cost + SP->_cub1_cost + newcost;
+ usecost = t5_cr_cost + SP->_cub1_cost + newcost;
}
/*
diff --git a/contrib/ncurses/ncurses/tty/lib_tstp.c b/contrib/ncurses/ncurses/tty/lib_tstp.c
index c241993f0312..6fb912cf5096 100644
--- a/contrib/ncurses/ncurses/tty/lib_tstp.c
+++ b/contrib/ncurses/ncurses/tty/lib_tstp.c
@@ -48,7 +48,7 @@
#define _POSIX_SOURCE
#endif
-MODULE_ID("$Id: lib_tstp.c,v 1.19 1999/07/24 22:47:20 tom Exp $")
+MODULE_ID("$Id: lib_tstp.c,v 1.20 1999/10/22 23:11:09 tom Exp $")
#if defined(SIGTSTP) && (HAVE_SIGACTION || HAVE_SIGVEC)
#define USE_SIGTSTP 1
@@ -199,13 +199,16 @@ static void tstp(int dummy GCC_UNUSED)
static void cleanup(int sig)
{
+ static int nested;
+
/*
* Actually, doing any sort of I/O from within an signal handler is
* "unsafe". But we'll _try_ to clean up the screen and terminal
* settings on the way out.
*/
- if (sig == SIGINT
- || sig == SIGQUIT) {
+ if (!nested++
+ && (sig == SIGINT
+ || sig == SIGQUIT)) {
#if HAVE_SIGACTION || HAVE_SIGVEC
sigaction_t act;
sigemptyset(&act.sa_mask);
@@ -219,6 +222,11 @@ static void cleanup(int sig)
SCREEN *scan = _nc_screen_chain;
while(scan)
{
+ if (SP != 0
+ && SP->_ofp != 0
+ && isatty(fileno(SP->_ofp))) {
+ SP->_cleanup = TRUE;
+ }
set_term(scan);
endwin();
if (SP)
diff --git a/contrib/ncurses/ncurses/tty/lib_twait.c b/contrib/ncurses/ncurses/tty/lib_twait.c
index 40bd2cd3044f..f095c9b53c0c 100644
--- a/contrib/ncurses/ncurses/tty/lib_twait.c
+++ b/contrib/ncurses/ncurses/tty/lib_twait.c
@@ -40,6 +40,10 @@
** comments, none of the original code remains - T.Dickey).
*/
+#ifdef __BEOS__
+#include <OS.h>
+#endif
+
#include <curses.priv.h>
#if USE_FUNC_POLL
@@ -57,28 +61,32 @@
# endif
#endif
-#ifdef __BEOS__
-/* BeOS select() only works on sockets. Use the tty hack instead */
-#include <socket.h>
-#define select check_select
-#endif
-
-MODULE_ID("$Id: lib_twait.c,v 1.32 1998/06/06 22:44:14 tom Exp $")
+MODULE_ID("$Id: lib_twait.c,v 1.34 1999/10/16 21:25:10 tom Exp $")
-static int _nc_gettime(void)
+static long _nc_gettime(bool first)
{
- int res;
+ long res;
#if HAVE_GETTIMEOFDAY
# define PRECISE_GETTIME 1
- struct timeval t;
- gettimeofday(&t, (struct timezone *)0);
- res = t.tv_sec*1000 + t.tv_usec/1000;
+ static struct timeval t0;
+ struct timeval t1;
+ gettimeofday(&t1, (struct timezone *)0);
+ if (first) {
+ t0 = t1;
+ }
+ res = (t1.tv_sec - t0.tv_sec) * 1000
+ + (t1.tv_usec - t0.tv_usec) / 1000;
#else
# define PRECISE_GETTIME 0
- res = time(0)*1000;
+ static time_t t0;
+ time_t t1 = time((time_t*)0);
+ if (first) {
+ t0 = t1;
+ }
+ res = (t1 - t0) * 1000;
#endif
- T(("time: %d msec", res));
+ T(("%s time: %ld msec", first ? "get" : "elapsed", res));
return res;
}
@@ -104,18 +112,19 @@ int result;
#if USE_FUNC_POLL
struct pollfd fds[2];
+#elif defined(__BEOS__)
#elif HAVE_SELECT
static fd_set set;
#endif
-int starttime, returntime;
+long starttime, returntime;
T(("start twait: %d milliseconds, mode: %d", milliseconds, mode));
#if PRECISE_GETTIME
retry:
#endif
- starttime = _nc_gettime();
+ starttime = _nc_gettime(TRUE);
count = 0;
@@ -133,6 +142,40 @@ retry:
}
result = poll(fds, count, milliseconds);
+#elif defined(__BEOS__)
+ /*
+ * BeOS's select() is declared in socket.h, so the configure script does
+ * not see it. That's just as well, since that function works only for
+ * sockets. This (using snooze and ioctl) was distilled from Be's patch
+ * for ncurses which uses a separate thread to simulate select().
+ *
+ * FIXME: the return values from the ioctl aren't very clear if we get
+ * interrupted.
+ */
+ result = 0;
+ if (mode & 1) {
+ bigtime_t d;
+ bigtime_t useconds = milliseconds * 1000;
+ int n, howmany;
+
+ if (useconds == 0) /* we're here to go _through_ the loop */
+ useconds = 1;
+
+ for (d = 0; d < useconds; d += 5000) {
+ n = 0;
+ howmany = ioctl(0, 'ichr', &n);
+ if (howmany >= 0 && n > 0) {
+ result = 1;
+ break;
+ }
+ if (useconds > 1)
+ snooze(5000);
+ milliseconds -= 5;
+ }
+ } else if (milliseconds > 0) {
+ snooze(milliseconds * 1000);
+ milliseconds = 0;
+ }
#elif HAVE_SELECT
/*
* select() modifies the fd_set arguments; do this in the
@@ -160,10 +203,10 @@ retry:
}
#endif
- returntime = _nc_gettime();
+ returntime = _nc_gettime(FALSE);
if (milliseconds >= 0)
- milliseconds -= returntime-starttime;
+ milliseconds -= (returntime - starttime);
#if PRECISE_GETTIME
/*
@@ -203,6 +246,8 @@ retry:
count++;
}
}
+#elif defined(__BEOS__)
+ result = 1; /* redundant, but simple */
#elif HAVE_SELECT
if ((mode & 2)
&& (fd = SP->_mouse_fd) >= 0
diff --git a/contrib/ncurses/ncurses/tty/tty_update.c b/contrib/ncurses/ncurses/tty/tty_update.c
index 4118d357f561..a5a640f8663c 100644
--- a/contrib/ncurses/ncurses/tty/tty_update.c
+++ b/contrib/ncurses/ncurses/tty/tty_update.c
@@ -42,6 +42,10 @@
*
*-----------------------------------------------------------------*/
+#ifdef __BEOS__
+#include <OS.h>
+#endif
+
#include <curses.priv.h>
#if defined(TRACE) && HAVE_SYS_TIMES_H && HAVE_TIMES
@@ -67,15 +71,9 @@
#endif
#endif
-#ifdef __BEOS__
-/* BeOS select() only works on sockets. Use the tty hack instead */
-#include <socket.h>
-#define select check_select
-#endif
-
#include <term.h>
-MODULE_ID("$Id: tty_update.c,v 1.111 1999/02/27 20:07:56 tom Exp $")
+MODULE_ID("$Id: tty_update.c,v 1.117 1999/10/22 23:28:46 tom Exp $")
/*
* This define controls the line-breakout optimization. Every once in a
@@ -97,10 +95,10 @@ MODULE_ID("$Id: tty_update.c,v 1.111 1999/02/27 20:07:56 tom Exp $")
static inline chtype ClrBlank ( WINDOW *win );
static int ClrBottom(int total);
-static int InsStr( chtype *line, int count );
static void ClearScreen( chtype blank );
static void ClrUpdate( void );
static void DelChar( int count );
+static void InsStr( chtype *line, int count );
static void TransformLine( int const lineno );
#ifdef POSITION_DEBUG
@@ -110,29 +108,40 @@ static void TransformLine( int const lineno );
*
****************************************************************************/
-void position_check(int expected_y, int expected_x, char *legend)
+static void position_check(int expected_y, int expected_x, char *legend)
/* check to see if the real cursor position matches the virtual */
{
- static char buf[9];
+ char buf[20];
int y, x;
- if (_nc_tracing)
+ if (!_nc_tracing || (expected_y < 0 && expected_x < 0))
return;
memset(buf, '\0', sizeof(buf));
- (void) write(1, "\033[6n", 4); /* only works on ANSI-compatibles */
- (void) read(0, (void *)buf, 8);
+ putp("\033[6n"); /* only works on ANSI-compatibles */
+ _nc_flush();
+ (void) read(0, buf, sizeof(buf)-1);
_tracef("probe returned %s", _nc_visbuf(buf));
/* try to interpret as a position report */
- if (sscanf(buf, "\033[%d;%dR", &y, &x) != 2)
+ if (sscanf(buf, "\033[%d;%dR", &y, &x) != 2) {
_tracef("position probe failed in %s", legend);
- else if (y - 1 != expected_y || x - 1 != expected_x)
- _tracef("position seen (%d, %d) doesn't match expected one (%d, %d) in %s",
- y-1, x-1, expected_y, expected_x, legend);
- else
- _tracef("position matches OK in %s", legend);
+ } else {
+ if (expected_x < 0)
+ expected_x = x - 1;
+ if (expected_y < 0)
+ expected_y = y - 1;
+ if (y - 1 != expected_y || x - 1 != expected_x) {
+ beep();
+ _tracef("position seen (%d, %d) doesn't match expected one (%d, %d) in %s",
+ y-1, x-1, expected_y, expected_x, legend);
+ } else {
+ _tracef("position matches OK in %s", legend);
+ }
+ }
}
+#else
+#define position_check(expected_y, expected_x, legend) /* nothing */
#endif /* POSITION_DEBUG */
/****************************************************************************
@@ -148,9 +157,7 @@ static inline void GoTo(int const row, int const col)
TR(TRACE_MOVE, ("GoTo(%d, %d) from (%d, %d)",
row, col, SP->_cursrow, SP->_curscol));
-#ifdef POSITION_DEBUG
position_check(SP->_cursrow, SP->_curscol, "GoTo");
-#endif /* POSITION_DEBUG */
/*
* Force restore even if msgr is on when we're in an alternate
@@ -168,6 +175,7 @@ static inline void GoTo(int const row, int const col)
mvcur(SP->_cursrow, SP->_curscol, row, col);
SP->_cursrow = row;
SP->_curscol = col;
+ position_check(SP->_cursrow, SP->_curscol, "GoTo2");
}
static inline void PutAttrChar(chtype ch)
@@ -179,10 +187,14 @@ static inline void PutAttrChar(chtype ch)
_tracechtype(ch),
SP->_cursrow, SP->_curscol));
UpdateAttrs(ch);
- putc((int)TextOf(ch), SP->_ofp);
+ if (SP->_cleanup) {
+ _nc_outch((int)TextOf(ch));
+ } else {
+ putc((int)TextOf(ch), SP->_ofp); /* macro's fastest... */
#ifdef TRACE
- _nc_outchars++;
+ _nc_outchars++;
#endif /* TRACE */
+ }
SP->_curscol++;
if (char_padding) {
TPUTS_TRACE("char_padding");
@@ -212,6 +224,21 @@ static bool check_pending(void)
{
have_pending = TRUE;
}
+#elif defined(__BEOS__)
+ /*
+ * BeOS's select() is declared in socket.h, so the configure script does
+ * not see it. That's just as well, since that function works only for
+ * sockets. This (using snooze and ioctl) was distilled from Be's patch
+ * for ncurses which uses a separate thread to simulate select().
+ *
+ * FIXME: the return values from the ioctl aren't very clear if we get
+ * interrupted.
+ */
+ int n = 0;
+ int howmany = ioctl(0, 'ichr', &n);
+ if (howmany >= 0 && n > 0) {
+ have_pending = TRUE;
+ }
#elif HAVE_SELECT
fd_set fdset;
struct timeval ktimeout;
@@ -229,7 +256,7 @@ static bool check_pending(void)
}
if (have_pending) {
SP->_fifohold = 5;
- fflush(SP->_ofp);
+ _nc_flush();
}
return FALSE;
}
@@ -261,6 +288,8 @@ static void PutCharLR(chtype const ch)
putp(exit_am_mode);
PutAttrChar(ch);
+ SP->_curscol--;
+ position_check(SP->_cursrow, SP->_curscol, "exit_am_mode");
TPUTS_TRACE("enter_am_mode");
putp(enter_am_mode);
@@ -307,6 +336,7 @@ static void wrap_cursor(void)
{
SP->_curscol--;
}
+ position_check(SP->_cursrow, SP->_curscol, "wrap_cursor");
}
static inline void PutChar(chtype const ch)
@@ -320,9 +350,7 @@ static inline void PutChar(chtype const ch)
if (SP->_curscol >= screen_columns)
wrap_cursor();
-#ifdef POSITION_DEBUG
position_check(SP->_cursrow, SP->_curscol, "PutChar");
-#endif /* POSITION_DEBUG */
}
/*
@@ -753,7 +781,7 @@ struct tms before, after;
*/
UpdateAttrs(A_NORMAL);
- fflush(SP->_ofp);
+ _nc_flush();
curscr->_attrs = newscr->_attrs;
/* curscr->_bkgd = newscr->_bkgd; */
@@ -901,13 +929,14 @@ chtype blank = newscr->_line[total-1].text[last-1]; /* lower right char */
if ((tstLine == 0) || (last > (int)lenLine)) {
tstLine = typeRealloc(chtype, last, tstLine);
+ if (tstLine != 0) {
+ lenLine = last;
+ for (col = 0; col < last; col++)
+ tstLine[col] = blank;
+ }
}
if (tstLine != 0) {
- lenLine = last;
- for (col = 0; col < last; col++)
- tstLine[col] = blank;
-
for (row = total-1; row >= 0; row--) {
if (memcmp(tstLine, newscr->_line[row].text, length))
break;
@@ -1212,9 +1241,7 @@ static void ClearScreen(chtype blank)
TPUTS_TRACE("clear_screen");
putp(clear_screen);
SP->_cursrow = SP->_curscol = 0;
-#ifdef POSITION_DEBUG
position_check(SP->_cursrow, SP->_curscol, "ClearScreen");
-#endif /* POSITION_DEBUG */
} else if (clr_eos) {
SP->_cursrow = SP->_curscol = -1;
GoTo(0,0);
@@ -1252,7 +1279,7 @@ static void ClearScreen(chtype blank)
**
*/
-static int InsStr(chtype *line, int count)
+static void InsStr(chtype *line, int count)
{
T(("InsStr(%p,%d) called", line, count));
@@ -1267,7 +1294,6 @@ static int InsStr(chtype *line, int count)
line++;
count--;
}
- return(OK);
} else if (enter_insert_mode && exit_insert_mode) {
TPUTS_TRACE("enter_insert_mode");
putp(enter_insert_mode);
@@ -1283,7 +1309,6 @@ static int InsStr(chtype *line, int count)
}
TPUTS_TRACE("exit_insert_mode");
putp(exit_insert_mode);
- return(OK);
} else {
while (count) {
TPUTS_TRACE("insert_character");
@@ -1297,8 +1322,8 @@ static int InsStr(chtype *line, int count)
line++;
count--;
}
- return(OK);
}
+ position_check(SP->_cursrow, SP->_curscol, "InsStr");
}
/*
@@ -1332,14 +1357,8 @@ static void DelChar(int count)
void _nc_outstr(const char *str)
{
- FILE *ofp = SP ? SP->_ofp : stdout;
-
- (void) fputs(str, ofp);
- (void) fflush(ofp);
-
-#ifdef TRACE
- _nc_outchars += strlen(str);
-#endif /* TRACE */
+ (void) putp(str);
+ _nc_flush();
}
/*