diff options
author | Peter Wemm <peter@FreeBSD.org> | 2000-01-26 16:43:25 +0000 |
---|---|---|
committer | Peter Wemm <peter@FreeBSD.org> | 2000-01-26 16:43:25 +0000 |
commit | 1759abf3ae1a38b7578df7996346544b66e508ad (patch) | |
tree | 506da7a5cf693bf8780ad013837cbd67913bedbb /contrib/ncurses/ncurses/tty | |
parent | 0e3d540892016a47f6a68ec9ba2879d35ce5f7c2 (diff) | |
download | src-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.c | 12 | ||||
-rw-r--r-- | contrib/ncurses/ncurses/tty/lib_tstp.c | 14 | ||||
-rw-r--r-- | contrib/ncurses/ncurses/tty/lib_twait.c | 81 | ||||
-rw-r--r-- | contrib/ncurses/ncurses/tty/tty_update.c | 109 |
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(); } /* |