diff options
Diffstat (limited to 'ncurses/tty')
-rwxr-xr-x | ncurses/tty/MKexpanded.sh | 9 | ||||
-rw-r--r-- | ncurses/tty/hardscroll.c | 10 | ||||
-rw-r--r-- | ncurses/tty/hashmap.c | 64 | ||||
-rw-r--r-- | ncurses/tty/lib_mvcur.c | 98 | ||||
-rw-r--r-- | ncurses/tty/lib_tstp.c | 11 | ||||
-rw-r--r-- | ncurses/tty/lib_twait.c | 18 | ||||
-rw-r--r-- | ncurses/tty/lib_vidattr.c | 25 | ||||
-rw-r--r-- | ncurses/tty/tty_update.c | 161 |
8 files changed, 255 insertions, 141 deletions
diff --git a/ncurses/tty/MKexpanded.sh b/ncurses/tty/MKexpanded.sh index 7a5f599..65c6b93 100755 --- a/ncurses/tty/MKexpanded.sh +++ b/ncurses/tty/MKexpanded.sh @@ -1,6 +1,7 @@ #! /bin/sh ############################################################################## -# Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. # +# Copyright 2019,2020 Thomas E. Dickey # +# Copyright 1998-2015,2017 Free Software Foundation, Inc. # # # # Permission is hereby granted, free of charge, to any person obtaining a # # copy of this software and associated documentation files (the "Software"), # @@ -29,7 +30,7 @@ # # Author: Thomas E. Dickey, 1997-on # -# $Id: MKexpanded.sh,v 1.17 2010/01/23 17:57:43 tom Exp $ +# $Id: MKexpanded.sh,v 1.22 2020/02/02 23:34:34 tom Exp $ # # Script to generate 'expanded.c', a dummy source that contains functions # corresponding to complex macros used in this library. By making functions, @@ -48,7 +49,7 @@ else fi TMP=gen$$.c -trap "rm -f $TMP" 0 1 2 5 15 +trap "rm -f $TMP" EXIT INT QUIT TERM HUP cat <<EOF /* generated by MKexpanded.sh */ @@ -125,7 +126,7 @@ _nc_UpdateAttrs (CARG_CH_T c) EOF $preprocessor $TMP 2>/dev/null | \ - sed -e '1,/^IGNORE$/d' -e 's/^@/#/' -e 's/^#if_/#if /' + sed -e '1,/^IGNORE$/d' -e 's/^@/#/' -e 's/^#[ ]*if_/#if /' -e "s,$TMP,expanded.c," cat <<EOF #else /* ! NCURSES_EXPANDED */ diff --git a/ncurses/tty/hardscroll.c b/ncurses/tty/hardscroll.c index 4ec168a..abb21cf 100644 --- a/ncurses/tty/hardscroll.c +++ b/ncurses/tty/hardscroll.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2010,2012 Free Software Foundation, Inc. * + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2015,2016 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -147,7 +148,7 @@ AUTHOR #include <curses.priv.h> -MODULE_ID("$Id: hardscroll.c,v 1.51 2012/10/17 09:01:10 tom Exp $") +MODULE_ID("$Id: hardscroll.c,v 1.54 2020/02/02 23:34:34 tom Exp $") #if defined(SCROLLDEBUG) || defined(HASHDEBUG) @@ -300,11 +301,12 @@ NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_linedump) (NCURSES_SP_DCL0) /* dump the state of the real and virtual oldnum fields */ { - int n; char *buf = 0; size_t want = ((size_t) screen_lines(SP_PARM) + 1) * 4; + (void) SP_PARM; if ((buf = typeMalloc(char, want)) != 0) { + int n; *buf = '\0'; for (n = 0; n < screen_lines(SP_PARM); n++) @@ -339,7 +341,7 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) for (;;) { int n; - for (n = 0; n < screen_lines; n++) + for (n = 0; n < screen_lines(sp); n++) oldnums[n] = _NEWINDEX; /* grab the test vector */ diff --git a/ncurses/tty/hashmap.c b/ncurses/tty/hashmap.c index 9282276..9d1e482 100644 --- a/ncurses/tty/hashmap.c +++ b/ncurses/tty/hashmap.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2011,2014 Free Software Foundation, Inc. * + * Copyright 2019,2020 Thomas E. Dickey * + * Copyright 1998-2015,2016 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -73,19 +74,23 @@ AUTHOR #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: hashmap.c,v 1.64 2014/04/26 18:48:44 juergen Exp $") +MODULE_ID("$Id: hashmap.c,v 1.68 2020/02/02 23:34:34 tom Exp $") #ifdef HASHDEBUG # define _tracef printf # undef TR +# ifdef TRACE # define TR(n, a) if (_nc_tracing & (n)) { _tracef a ; putchar('\n'); } +# else +# define TR(n, a) { _tracef a ; putchar('\n'); } +# endif # undef screen_lines -# define screen_lines MAXLINES -# define TEXTWIDTH 1 +# define screen_lines(sp) MAXLINES +# define TEXTWIDTH(sp) 1 int oldnums[MAXLINES], reallines[MAXLINES]; -static NCURSES_CH_T oldtext[MAXLINES][TEXTWIDTH]; -static NCURSES_CH_T newtext[MAXLINES][TEXTWIDTH]; +static NCURSES_CH_T oldtext[MAXLINES][TEXTWIDTH(sp)]; +static NCURSES_CH_T newtext[MAXLINES][TEXTWIDTH(sp)]; # define OLDNUM(sp,n) oldnums[n] # define OLDTEXT(sp,n) oldtext[n] # define NEWTEXT(sp,m) newtext[m] @@ -115,11 +120,13 @@ static NCURSES_CH_T newtext[MAXLINES][TEXTWIDTH]; static const NCURSES_CH_T blankchar = NewChar(BLANK_TEXT); static NCURSES_INLINE unsigned long -hash(SCREEN *sp, NCURSES_CH_T * text) +hash(SCREEN *sp, NCURSES_CH_T *text) { int i; NCURSES_CH_T ch; unsigned long result = 0; + (void) sp; + for (i = TEXTWIDTH(sp); i > 0; i--) { ch = *text++; result += (result << 5) + (unsigned long) HASH_VAL(ch); @@ -129,10 +136,11 @@ hash(SCREEN *sp, NCURSES_CH_T * text) /* approximate update cost */ static int -update_cost(SCREEN *sp, NCURSES_CH_T * from, NCURSES_CH_T * to) +update_cost(SCREEN *sp, NCURSES_CH_T *from, NCURSES_CH_T *to) { int cost = 0; int i; + (void) sp; for (i = TEXTWIDTH(sp); i > 0; i--, from++, to++) if (!(CharEq(*from, *to))) @@ -142,11 +150,12 @@ update_cost(SCREEN *sp, NCURSES_CH_T * from, NCURSES_CH_T * to) } static int -update_cost_from_blank(SCREEN *sp, NCURSES_CH_T * to) +update_cost_from_blank(SCREEN *sp, NCURSES_CH_T *to) { int cost = 0; int i; NCURSES_CH_T blank = blankchar; + (void) sp; if (back_color_erase) SetPair(blank, GetPair(stdscr->_nc_bkgd)); @@ -190,9 +199,8 @@ cost_effective(SCREEN *sp, const int from, const int to, const int blank) static void grow_hunks(SCREEN *sp) { - int start, end, shift; - int back_limit, forward_limit; /* limits for cells to fill */ - int back_ref_limit, forward_ref_limit; /* limits for refrences */ + int back_limit; /* limits for cells to fill */ + int back_ref_limit; /* limit for references */ int i; int next_hunk; @@ -207,8 +215,11 @@ grow_hunks(SCREEN *sp) while (i < screen_lines(sp) && OLDNUM(sp, i) == _NEWINDEX) i++; for (; i < screen_lines(sp); i = next_hunk) { - start = i; - shift = OLDNUM(sp, i) - i; + int forward_limit; + int forward_ref_limit; + int end; + int start = i; + int shift = OLDNUM(sp, i) - i; /* get forward limit */ i = start + 1; @@ -277,7 +288,6 @@ NCURSES_SP_NAME(_nc_hash_map) (NCURSES_SP_DCL0) { HASHMAP *hsp; register int i; - int start, shift, size; if (screen_lines(SP_PARM) > lines_alloc(SP_PARM)) { if (hashtab(SP_PARM)) @@ -379,6 +389,8 @@ NCURSES_SP_NAME(_nc_hash_map) (NCURSES_SP_DCL0) * more than carry. */ for (i = 0; i < screen_lines(SP_PARM);) { + int start, shift, size; + while (i < screen_lines(SP_PARM) && OLDNUM(SP_PARM, i) == _NEWINDEX) i++; if (i >= screen_lines(SP_PARM)) @@ -486,7 +498,7 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) return EXIT_FAILURE; (void) _nc_alloc_screen(); - for (n = 0; n < screen_lines; n++) { + for (n = 0; n < screen_lines(sp); n++) { reallines[n] = n; oldnums[n] = _NEWINDEX; CharOf(oldtext[n][0]) = CharOf(newtext[n][0]) = '.'; @@ -509,7 +521,7 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) break; case 'l': /* get initial line number vector */ - for (n = 0; n < screen_lines; n++) { + for (n = 0; n < screen_lines(sp); n++) { reallines[n] = n; oldnums[n] = _NEWINDEX; } @@ -522,9 +534,9 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) break; case 'n': /* use following letters as text of new lines */ - for (n = 0; n < screen_lines; n++) + for (n = 0; n < screen_lines(sp); n++) CharOf(newtext[n][0]) = '.'; - for (n = 0; n < screen_lines; n++) + for (n = 0; n < screen_lines(sp); n++) if (line[n + 1] == '\n') break; else @@ -532,9 +544,9 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) break; case 'o': /* use following letters as text of old lines */ - for (n = 0; n < screen_lines; n++) + for (n = 0; n < screen_lines(sp); n++) CharOf(oldtext[n][0]) = '.'; - for (n = 0; n < screen_lines; n++) + for (n = 0; n < screen_lines(sp); n++) if (line[n + 1] == '\n') break; else @@ -546,12 +558,12 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) _nc_linedump(); #endif (void) fputs("Old lines: [", stdout); - for (n = 0; n < screen_lines; n++) + for (n = 0; n < screen_lines(sp); n++) putchar(CharOf(oldtext[n][0])); putchar(']'); putchar('\n'); (void) fputs("New lines: [", stdout); - for (n = 0; n < screen_lines; n++) + for (n = 0; n < screen_lines(sp); n++) putchar(CharOf(newtext[n][0])); putchar(']'); putchar('\n'); @@ -572,11 +584,7 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) break; } } -#if NO_LEAKS - _nc_free_and_exit(EXIT_SUCCESS); -#else - return EXIT_SUCCESS; -#endif + exit_curses(EXIT_SUCCESS); } #endif /* HASHDEBUG */ diff --git a/ncurses/tty/lib_mvcur.c b/ncurses/tty/lib_mvcur.c index e172736..5382b3b 100644 --- a/ncurses/tty/lib_mvcur.c +++ b/ncurses/tty/lib_mvcur.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018-2019,2020 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -159,7 +160,7 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_mvcur.c,v 1.135 2014/04/26 18:47:20 juergen Exp $") +MODULE_ID("$Id: lib_mvcur.c,v 1.151 2020/02/02 23:34:34 tom Exp $") #define WANT_CHAR(sp, y, x) NewScreen(sp)->_line[y].text[x] /* desired state */ @@ -344,7 +345,9 @@ NCURSES_SP_NAME(_nc_mvcur_init) (NCURSES_SP_DCL0) SP_PARM->_home_cost = CostOf(cursor_home, 0); SP_PARM->_ll_cost = CostOf(cursor_to_ll, 0); #if USE_HARD_TABS - if (getenv("NCURSES_NO_HARD_TABS") == 0) { + if (getenv("NCURSES_NO_HARD_TABS") == 0 + && dest_tabs_magic_smso == 0 + && HasHardTabs()) { SP_PARM->_ht_cost = CostOf(tab, 0); SP_PARM->_cbt_cost = CostOf(back_tab, 0); } else { @@ -450,8 +453,8 @@ NCURSES_SP_NAME(_nc_mvcur_init) (NCURSES_SP_DCL0) /* * A different, possibly better way to arrange this would be to set the - * SCREEN's _endwin to TRUE at window initialization time and let this be - * called by doupdate's return-from-shellout code. + * SCREEN's _endwin at window initialization time and let this be called by + * doupdate's return-from-shellout code. */ NCURSES_SP_NAME(_nc_mvcur_resume) (NCURSES_SP_ARG); } @@ -935,6 +938,7 @@ onscreen_mvcur(NCURSES_SP_DCLx #endif /* MAIN */ if (usecost != INFINITY) { + TR(TRACE_MOVE, ("mvcur tactic %d", tactic)); TPUTS_TRACE("mvcur"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx buffer, 1, myOutCh); @@ -988,14 +992,14 @@ _nc_real_mvcur(NCURSES_SP_DCLx TR(TRACE_CHARPUT, ("turning off (%#lx) %s before move", (unsigned long) AttrOf(oldattr), _traceattr(AttrOf(oldattr)))); - (void) VIDATTR(SP_PARM, A_NORMAL, 0); + VIDPUTS(SP_PARM, A_NORMAL, 0); } if (xold >= screen_columns(SP_PARM)) { - int l; if (SP_PARM->_nl) { - l = (xold + 1) / screen_columns(SP_PARM); + int l = (xold + 1) / screen_columns(SP_PARM); + yold += l; if (yold >= screen_lines(SP_PARM)) l -= (yold - screen_lines(SP_PARM) - 1); @@ -1042,7 +1046,7 @@ _nc_real_mvcur(NCURSES_SP_DCLx TR(TRACE_CHARPUT, ("turning on (%#lx) %s after move", (unsigned long) AttrOf(oldattr), _traceattr(AttrOf(oldattr)))); - (void) VIDATTR(SP_PARM, AttrOf(oldattr), GetPair(oldattr)); + VIDPUTS(SP_PARM, AttrOf(oldattr), GetPair(oldattr)); } } returnCode(code); @@ -1056,9 +1060,18 @@ NCURSES_SP_NAME(_nc_mvcur) (NCURSES_SP_DCLx int yold, int xold, int ynew, int xnew) { - return _nc_real_mvcur(NCURSES_SP_ARGx yold, xold, ynew, xnew, - NCURSES_SP_NAME(_nc_outch), - TRUE); + int rc; + rc = _nc_real_mvcur(NCURSES_SP_ARGx yold, xold, ynew, xnew, + NCURSES_SP_NAME(_nc_outch), + TRUE); + /* + * With the terminal-driver, we cannot distinguish between internal and + * external calls. Flush the output if the screen has not been + * initialized, e.g., when used from low-level terminfo programs. + */ + if ((SP_PARM != 0) && (SP_PARM->_endwin == ewInitial)) + NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); + return rc; } #if NCURSES_SP_FUNCS @@ -1077,11 +1090,16 @@ _nc_mvcur(int yold, int xold, NCURSES_EXPORT(int) TINFO_MVCUR(NCURSES_SP_DCLx int yold, int xold, int ynew, int xnew) { - return _nc_real_mvcur(NCURSES_SP_ARGx - yold, xold, - ynew, xnew, - NCURSES_SP_NAME(_nc_outch), - TRUE); + int rc; + rc = _nc_real_mvcur(NCURSES_SP_ARGx + yold, xold, + ynew, xnew, + NCURSES_SP_NAME(_nc_outch), + TRUE); + if ((SP_PARM != 0) && (SP_PARM->_endwin == ewInitial)) + NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); + NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); + return rc; } #else /* !USE_TERM_DRIVER */ @@ -1181,7 +1199,7 @@ roll(int n) int main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) { - strcpy(tname, getenv("TERM")); + _nc_STRCPY(tname, getenv("TERM"), sizeof(tname)); load_term(); _nc_setupscreen(lines, columns, stdout, FALSE, 0); baudrate(); @@ -1197,27 +1215,26 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) int fy, fx, ty, tx, n, i; char buf[BUFSIZ], capname[BUFSIZ]; - (void) fputs("> ", stdout); - (void) fgets(buf, sizeof(buf), stdin); + if (fputs("> ", stdout) == EOF) + break; + if (fgets(buf, sizeof(buf), stdin) == 0) + break; +#define PUTS(s) (void) puts(s) +#define PUTF(s,t) (void) printf(s,t) if (buf[0] == '?') { - (void) puts("? -- display this help message"); - (void) - puts("fy fx ty tx -- (4 numbers) display (fy,fx)->(ty,tx) move"); - (void) puts("s[croll] n t b m -- display scrolling sequence"); - (void) - printf("r[eload] -- reload terminal info for %s\n", - termname()); - (void) - puts("l[oad] <term> -- load terminal info for type <term>"); - (void) puts("d[elete] <cap> -- delete named capability"); - (void) puts("i[nspect] -- display terminal capabilities"); - (void) - puts("c[ost] -- dump cursor-optimization cost table"); - (void) puts("o[optimize] -- toggle movement optimization"); - (void) - puts("t[orture] <num> -- torture-test with <num> random moves"); - (void) puts("q[uit] -- quit the program"); + PUTS("? -- display this help message"); + PUTS("fy fx ty tx -- (4 numbers) display (fy,fx)->(ty,tx) move"); + PUTS("s[croll] n t b m -- display scrolling sequence"); + PUTF("r[eload] -- reload terminal info for %s\n", + termname()); + PUTS("l[oad] <term> -- load terminal info for type <term>"); + PUTS("d[elete] <cap> -- delete named capability"); + PUTS("i[nspect] -- display terminal capabilities"); + PUTS("c[ost] -- dump cursor-optimization cost table"); + PUTS("o[optimize] -- toggle movement optimization"); + PUTS("t[orture] <num> -- torture-test with <num> random moves"); + PUTS("q[uit] -- quit the program"); } else if (sscanf(buf, "%d %d %d %d", &fy, &fx, &ty, &tx) == 4) { struct timeval before, after; @@ -1245,7 +1262,7 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) before.tv_sec) * 1000000)); } else if (buf[0] == 'r') { - (void) strcpy(tname, termname()); + _nc_STRCPY(tname, termname(), sizeof(tname)); load_term(); } else if (sscanf(buf, "l %s", tname) == 1) { load_term(); @@ -1278,8 +1295,9 @@ main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) } } } else if (buf[0] == 'i') { - dump_init((char *) NULL, F_TERMINFO, S_TERMINFO, 70, 0, FALSE); - dump_entry(&cur_term->type, FALSE, TRUE, 0, 0); + dump_init(NULL, F_TERMINFO, S_TERMINFO, + FALSE, 70, 0, 0, FALSE, FALSE, 0); + dump_entry(&TerminalType(cur_term), FALSE, TRUE, 0, 0); putchar('\n'); } else if (buf[0] == 'o') { if (_nc_optimize_enable & OPTIMIZE_MVCUR) { diff --git a/ncurses/tty/lib_tstp.c b/ncurses/tty/lib_tstp.c index 8624b76..43a58e6 100644 --- a/ncurses/tty/lib_tstp.c +++ b/ncurses/tty/lib_tstp.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -42,7 +43,7 @@ #include <SigAction.h> -MODULE_ID("$Id: lib_tstp.c,v 1.48 2014/04/26 18:47:35 juergen Exp $") +MODULE_ID("$Id: lib_tstp.c,v 1.50 2020/02/02 23:34:34 tom Exp $") #if defined(SIGTSTP) && (HAVE_SIGACTION || HAVE_SIGVEC) #define USE_SIGTSTP 1 @@ -155,8 +156,10 @@ handle_SIGTSTP(int dummy GCC_UNUSED) * taken ownership of the tty and modified the settings when our * parent was stopped before us, and we would likely pick up the * settings already modified by the shell. + * + * Don't do this if we're not in curses - */ - if (sp != 0 && !sp->_endwin) /* don't do this if we're not in curses */ + if (sp != 0 && (sp->_endwin == ewRunning)) #if HAVE_TCGETPGRP if (tcgetpgrp(STDIN_FILENO) == getpgrp()) #endif @@ -273,7 +276,7 @@ handle_SIGINT(int sig) set_term(scan); NCURSES_SP_NAME(endwin) (NCURSES_SP_ARG); if (sp) - sp->_endwin = FALSE; /* in case of reuse */ + sp->_endwin = ewInitial; /* in case of reuse */ } } } diff --git a/ncurses/tty/lib_twait.c b/ncurses/tty/lib_twait.c index 59942f7..3ab168d 100644 --- a/ncurses/tty/lib_twait.c +++ b/ncurses/tty/lib_twait.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018,2020 Thomas E. Dickey * + * Copyright 1998-2015,2016 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -70,12 +71,12 @@ # include <sys/select.h> # endif #endif -#ifdef __MINGW32__ +#ifdef _WIN32 # include <sys/time.h> #endif #undef CUR -MODULE_ID("$Id: lib_twait.c,v 1.68 2014/03/08 20:32:59 tom Exp $") +MODULE_ID("$Id: lib_twait.c,v 1.74 2020/02/02 23:34:34 tom Exp $") static long _nc_gettime(TimeType * t0, int first) @@ -113,15 +114,15 @@ NCURSES_EXPORT(int) _nc_eventlist_timeout(_nc_eventlist * evl) { int event_delay = -1; - int n; if (evl != 0) { + int n; for (n = 0; n < evl->count; ++n) { _nc_event *ev = evl->events[n]; if (ev->type == _NC_EVENT_TIMEOUT_MSEC) { - event_delay = ev->data.timeout_msec; + event_delay = (int) ev->data.timeout_msec; if (event_delay < 0) event_delay = INT_MAX; /* FIXME Is this defined? */ } @@ -197,6 +198,10 @@ _nc_timed_wait(SCREEN *sp MAYBE_UNUSED, long starttime, returntime; +#ifdef NCURSES_WGETCH_EVENTS + (void) timeout_is_event; +#endif + TR(TRACE_IEVENT, ("start twait: %d milliseconds, mode: %d", milliseconds, mode)); @@ -230,7 +235,8 @@ _nc_timed_wait(SCREEN *sp MAYBE_UNUSED, #ifdef NCURSES_WGETCH_EVENTS if ((mode & TW_EVENT) && evl) { - fds = typeMalloc(struct pollfd, MIN_FDS + evl->count); + if (fds == fd_list) + fds = typeMalloc(struct pollfd, MIN_FDS + evl->count); if (fds == 0) return TW_NONE; } diff --git a/ncurses/tty/lib_vidattr.c b/ncurses/tty/lib_vidattr.c index 184d9b9..c752919 100644 --- a/ncurses/tty/lib_vidattr.c +++ b/ncurses/tty/lib_vidattr.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018-2019,2020 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -69,17 +70,24 @@ #define CUR SP_TERMTYPE #endif -MODULE_ID("$Id: lib_vidattr.c,v 1.71 2014/09/04 22:01:27 tom Exp $") +MODULE_ID("$Id: lib_vidattr.c,v 1.76 2020/02/02 23:34:34 tom Exp $") #define doPut(mode) \ TPUTS_TRACE(#mode); \ NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc) #define TurnOn(mask, mode) \ - if ((turn_on & mask) && mode) { doPut(mode); } + if ((turn_on & mask) && mode) { \ + TPUTS_TRACE(#mode); \ + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc); \ + } #define TurnOff(mask, mode) \ - if ((turn_off & mask) && mode) { doPut(mode); turn_off &= ~mask; } + if ((turn_off & mask) && mode) { \ + TPUTS_TRACE(#mode); \ + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc); \ + turn_off &= ~mask; \ + } /* if there is no current screen, assume we *can* do color */ #define SetColorsIf(why, old_attr) \ @@ -117,7 +125,7 @@ NCURSES_SP_NAME(vidputs) (NCURSES_SP_DCLx T((T_CALLED("vidputs(%p,%s)"), (void *) SP_PARM, _traceattr(newmode))); - if (!IsTermInfo(SP_PARM)) + if (!IsValidTIScreen(SP_PARM)) returnCode(ERR); /* this allows us to go on whether or not newterm() has been called */ @@ -145,7 +153,11 @@ NCURSES_SP_NAME(vidputs) (NCURSES_SP_DCLx }; unsigned n; int used = 0; +#ifdef max_attributes /* not in U/Win */ int limit = (max_attributes <= 0) ? 1 : max_attributes; +#else + int limit = 1; +#endif chtype retain = 0; /* @@ -308,7 +320,7 @@ NCURSES_SP_NAME(vidputs) (NCURSES_SP_DCLx #if USE_ITALIC TurnOn(A_ITALIC, enter_italics_mode); #endif -#if USE_WIDEC_SUPPORT +#if USE_WIDEC_SUPPORT && defined(enter_horizontal_hl_mode) TurnOn(A_HORIZONTAL, enter_horizontal_hl_mode); TurnOn(A_LEFT, enter_left_hl_mode); TurnOn(A_LOW, enter_low_hl_mode); @@ -317,7 +329,6 @@ NCURSES_SP_NAME(vidputs) (NCURSES_SP_DCLx TurnOn(A_VERTICAL, enter_vertical_hl_mode); #endif /* *INDENT-ON* */ - } if (reverse) diff --git a/ncurses/tty/tty_update.c b/ncurses/tty/tty_update.c index e66f716..8626c79 100644 --- a/ncurses/tty/tty_update.c +++ b/ncurses/tty/tty_update.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * + * Copyright 2018-2019,2020 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -43,6 +44,8 @@ * *-----------------------------------------------------------------*/ +#define NEW_PAIR_INTERNAL 1 + #include <curses.priv.h> #ifndef CUR @@ -82,7 +85,7 @@ #include <ctype.h> -MODULE_ID("$Id: tty_update.c,v 1.280 2014/08/23 19:25:18 tom Exp $") +MODULE_ID("$Id: tty_update.c,v 1.305 2020/02/02 23:34:34 tom Exp $") /* * This define controls the line-breakout optimization. Every once in a @@ -207,6 +210,10 @@ GoTo(NCURSES_SP_DCLx int const row, int const col) SP_PARM->_curscol, "GoTo2"); } +#if !NCURSES_WCWIDTH_GRAPHICS +#define is_wacs_value(ch) (_nc_wacs_width(ch) == 1 && wcwidth(ch) > 1) +#endif /* !NCURSES_WCWIDTH_GRAPHICS */ + static NCURSES_INLINE void PutAttrChar(NCURSES_SP_DCLx CARG_CH_T ch) { @@ -233,7 +240,7 @@ PutAttrChar(NCURSES_SP_DCLx CARG_CH_T ch) * Determine the number of character cells which the 'ch' value will use * on the screen. It should be at least one. */ - if ((chlen = wcwidth(CharOf(CHDEREF(ch)))) <= 0) { + if ((chlen = _nc_wacs_width(CharOf(CHDEREF(ch)))) <= 0) { static const NCURSES_CH_T blank = NewChar(BLANK_TEXT); /* @@ -268,8 +275,14 @@ PutAttrChar(NCURSES_SP_DCLx CARG_CH_T ch) if ((AttrOf(attr) & A_ALTCHARSET) && SP_PARM->_acs_map != 0 - && CharOfD(ch) < ACS_LEN) { + && ((CharOfD(ch) < ACS_LEN) +#if !NCURSES_WCWIDTH_GRAPHICS + || is_wacs_value(CharOfD(ch)) +#endif + )) { + int c8; my_ch = CHDEREF(ch); /* work around const param */ + c8 = CharOf(my_ch); #if USE_WIDEC_SUPPORT /* * This is crude & ugly, but works most of the time. It checks if the @@ -277,17 +290,39 @@ PutAttrChar(NCURSES_SP_DCLx CARG_CH_T ch) * character, and uses the wide-character mapping when we expect the * normal one to be broken (by mis-design ;-). */ - if (SP_PARM->_screen_acs_fix - && SP_PARM->_screen_acs_map[CharOf(my_ch)]) { - RemAttr(attr, A_ALTCHARSET); - my_ch = _nc_wacs[CharOf(my_ch)]; - } else if (SP_PARM->_screen_unicode - && !SP_PARM->_screen_acs_map[CharOf(my_ch)] - && _nc_wacs[CharOf(my_ch)].chars[0]) { - RemAttr(attr, A_ALTCHARSET); - my_ch = _nc_wacs[CharOf(my_ch)]; - } + if (SP_PARM->_screen_unicode + && _nc_wacs[CharOf(my_ch)].chars[0]) { + if (SP_PARM->_screen_acs_map[CharOf(my_ch)]) { + if (SP_PARM->_screen_acs_fix) { + RemAttr(attr, A_ALTCHARSET); + my_ch = _nc_wacs[CharOf(my_ch)]; + } + } else { + RemAttr(attr, A_ALTCHARSET); + my_ch = _nc_wacs[CharOf(my_ch)]; + } +#if !NCURSES_WCWIDTH_GRAPHICS + if (!(AttrOf(attr) & A_ALTCHARSET)) { + chlen = 1; + } +#endif /* !NCURSES_WCWIDTH_GRAPHICS */ + } else #endif + if (!SP_PARM->_screen_acs_map[c8]) { + /* + * If we found no mapping for a given alternate-character set item + * in the terminal description, attempt to use the ASCII fallback + * code which is populated in the _acs_map[] array. If that did + * not correspond to a line-drawing, etc., graphics character, the + * array entry would be empty. + */ + chtype temp = UChar(SP_PARM->_acs_map[c8]); + if (temp) { + RemAttr(attr, A_ALTCHARSET); + SetChar(my_ch, temp, AttrOf(attr)); + } + } + /* * If we (still) have alternate character set, it is the normal 8bit * flavor. The _screen_acs_map[] array tells if the character was @@ -307,6 +342,11 @@ PutAttrChar(NCURSES_SP_DCLx CARG_CH_T ch) } ch = CHREF(my_ch); } +#if USE_WIDEC_SUPPORT && !NCURSES_WCWIDTH_GRAPHICS + else if (chlen > 1 && is_wacs_value(CharOfD(ch))) { + chlen = 1; + } +#endif if (tilde_glitch && (CharOfD(ch) == L('~'))) { SetChar(tilde, L('`'), AttrOf(attr)); ch = CHREF(tilde); @@ -448,7 +488,7 @@ wrap_cursor(NCURSES_SP_DCL0) TR(TRACE_CHARPUT, ("turning off (%#lx) %s before wrapping", (unsigned long) AttrOf(SCREEN_ATTRS(SP_PARM)), _traceattr(AttrOf(SCREEN_ATTRS(SP_PARM))))); - (void) VIDATTR(SP_PARM, A_NORMAL, 0); + VIDPUTS(SP_PARM, A_NORMAL, 0); } } else { SP_PARM->_curscol--; @@ -493,14 +533,15 @@ can_clear_with(NCURSES_SP_DCLx ARG_CH_T ch) if (!SP_PARM->_default_color) return FALSE; - if (SP_PARM->_default_fg != C_MASK || SP_PARM->_default_bg != C_MASK) + if (!(isDefaultColor(SP_PARM->_default_fg) && + isDefaultColor(SP_PARM->_default_bg))) return FALSE; if ((pair = GetPair(CHDEREF(ch))) != 0) { NCURSES_COLOR_T fg, bg; if (NCURSES_SP_NAME(pair_content) (NCURSES_SP_ARGx (short) pair, &fg, &bg) == ERR - || (fg != C_MASK || bg != C_MASK)) { + || !(isDefaultColor(fg) && isDefaultColor(bg))) { return FALSE; } } @@ -578,7 +619,15 @@ EmitRange(NCURSES_SP_DCLx const NCURSES_CH_T * ntext, int num) } else { return 1; /* cursor stays in the middle */ } - } else if (repeat_char && runcount > SP_PARM->_rep_cost) { + } else if (repeat_char != 0 && +#if USE_WIDEC_SUPPORT + (!SP_PARM->_screen_unicode && + (CharOf(ntext0) < ((AttrOf(ntext0) & A_ALTCHARSET) + ? ACS_LEN + : 256))) && +#endif + runcount > SP_PARM->_rep_cost) { + NCURSES_CH_T temp; bool wrap_possible = (SP_PARM->_curscol + runcount >= screen_columns(SP_PARM)); int rep_count = runcount; @@ -587,11 +636,19 @@ EmitRange(NCURSES_SP_DCLx const NCURSES_CH_T * ntext, int num) rep_count--; UpdateAttrs(SP_PARM, ntext0); + temp = ntext0; + if ((AttrOf(temp) & A_ALTCHARSET) && + SP_PARM->_acs_map != 0 && + (SP_PARM->_acs_map[CharOf(temp)] & A_CHARTEXT) != 0) { + SetChar(temp, + (SP_PARM->_acs_map[CharOf(ntext0)] & A_CHARTEXT), + AttrOf(ntext0) | A_ALTCHARSET); + } NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx TPARM_2(repeat_char, - CharOf(ntext0), + CharOf(temp), rep_count), - rep_count, + 1, NCURSES_SP_NAME(_nc_outch)); SP_PARM->_curscol += rep_count; @@ -627,7 +684,6 @@ PutRange(NCURSES_SP_DCLx int row, int first, int last) { - int i, j, same; int rc; TR(TRACE_CHARPUT, ("PutRange(%p, %p, %p, %d, %d, %d)", @@ -638,6 +694,8 @@ PutRange(NCURSES_SP_DCLx if (otext != ntext && (last - first + 1) > SP_PARM->_inline_cost) { + int i, j, same; + for (j = first, same = 0; j <= last; j++) { if (!same && isWidecExt(otext[j])) continue; @@ -680,9 +738,12 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0) T((T_CALLED("_nc_tinfo:doupdate(%p)"), (void *) SP_PARM)); - if (SP_PARM == 0) - returnCode(ERR); + _nc_lock_global(update); + if (SP_PARM == 0) { + _nc_unlock_global(update); + returnCode(ERR); + } #if !USE_REENTRANT /* * It is "legal" but unlikely that an application could assign a new @@ -703,9 +764,10 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0) if (CurScreen(SP_PARM) == 0 || NewScreen(SP_PARM) == 0 - || StdScreen(SP_PARM) == 0) + || StdScreen(SP_PARM) == 0) { + _nc_unlock_global(update); returnCode(ERR); - + } #ifdef TRACE if (USE_TRACEF(TRACE_UPDATE)) { if (CurScreen(SP_PARM)->_clear) @@ -723,7 +785,8 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0) SP_PARM->_fifohold--; #if USE_SIZECHANGE - if (SP_PARM->_endwin || _nc_handle_sigwinch(SP_PARM)) { + if ((SP_PARM->_endwin == ewSuspend) + || _nc_handle_sigwinch(SP_PARM)) { /* * This is a transparent extension: XSI does not address it, * and applications need not know that ncurses can do it. @@ -736,7 +799,7 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0) } #endif - if (SP_PARM->_endwin) { + if (SP_PARM->_endwin == ewSuspend) { T(("coming back from shell mode")); NCURSES_SP_NAME(reset_prog_mode) (NCURSES_SP_ARG); @@ -745,7 +808,7 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0) NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_ARG); SP_PARM->_mouse_resume(SP_PARM); - SP_PARM->_endwin = FALSE; + SP_PARM->_endwin = ewRunning; } #if USE_TRACE_TIMES /* zero the metering machinery */ @@ -1013,6 +1076,7 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0) _nc_signal_handler(TRUE); + _nc_unlock_global(update); returnCode(OK); } @@ -1084,10 +1148,10 @@ ClrUpdate(NCURSES_SP_DCL0) static void ClrToEOL(NCURSES_SP_DCLx NCURSES_CH_T blank, int needclear) { - int j; - if (CurScreen(SP_PARM) != 0 && SP_PARM->_cursrow >= 0) { + int j; + for (j = SP_PARM->_curscol; j < screen_columns(SP_PARM); j++) { if (j >= 0) { NCURSES_CH_T *cp = @@ -1158,16 +1222,17 @@ ClrToEOS(NCURSES_SP_DCLx NCURSES_CH_T blank) static int ClrBottom(NCURSES_SP_DCLx int total) { - int row; - int col; int top = total; int last = min(screen_columns(SP_PARM), NewScreen(SP_PARM)->_maxx + 1); NCURSES_CH_T blank = NewScreen(SP_PARM)->_line[total - 1].text[last - 1]; - bool ok; if (clr_eos && can_clear_with(NCURSES_SP_ARGx CHREF(blank))) { + int row; for (row = total - 1; row >= 0; row--) { + int col; + bool ok; + for (col = 0, ok = TRUE; ok && col < last; col++) { ok = (CharEq(NewScreen(SP_PARM)->_line[row].text[col], blank)); } @@ -1258,8 +1323,8 @@ TransformLine(NCURSES_SP_DCLx int const lineno) && unColor(oldLine[n]) == unColor(newLine[n])) { if (oldPair < SP_PARM->_pair_limit && newPair < SP_PARM->_pair_limit - && (SP_PARM->_color_pairs[oldPair] == - SP_PARM->_color_pairs[newPair])) { + && (isSamePair(SP_PARM->_color_pairs[oldPair], + SP_PARM->_color_pairs[newPair]))) { SetPair(oldLine[n], GetPair(newLine[n])); } } @@ -1649,16 +1714,16 @@ InsStr(NCURSES_SP_DCLx NCURSES_CH_T * line, int count) TPUTS_TRACE("parm_ich"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx TPARM_1(parm_ich, count), - count, + 1, NCURSES_SP_NAME(_nc_outch)); - while (count) { + while (count > 0) { PutAttrChar(NCURSES_SP_ARGx CHREF(*line)); line++; count--; } } else if (enter_insert_mode && exit_insert_mode) { NCURSES_PUTP2("enter_insert_mode", enter_insert_mode); - while (count) { + while (count > 0) { PutAttrChar(NCURSES_SP_ARGx CHREF(*line)); if (insert_padding) { NCURSES_PUTP2("insert_padding", insert_padding); @@ -1668,7 +1733,7 @@ InsStr(NCURSES_SP_DCLx NCURSES_CH_T * line, int count) } NCURSES_PUTP2("exit_insert_mode", exit_insert_mode); } else { - while (count) { + while (count > 0) { NCURSES_PUTP2("insert_character", insert_character); PutAttrChar(NCURSES_SP_ARGx CHREF(*line)); if (insert_padding) { @@ -1693,8 +1758,6 @@ InsStr(NCURSES_SP_DCLx NCURSES_CH_T * line, int count) static void DelChar(NCURSES_SP_DCLx int count) { - int n; - TR(TRACE_UPDATE, ("DelChar(%p, %d) called, position = (%ld,%ld)", (void *) SP_PARM, count, (long) NewScreen(SP_PARM)->_cury, @@ -1704,9 +1767,11 @@ DelChar(NCURSES_SP_DCLx int count) TPUTS_TRACE("parm_dch"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx TPARM_1(parm_dch, count), - count, + 1, NCURSES_SP_NAME(_nc_outch)); } else { + int n; + for (n = 0; n < count; n++) { NCURSES_PUTP2("delete_character", delete_character); } @@ -2085,16 +2150,16 @@ NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_DCL0) NCURSES_SP_NAME(_nc_reset_colors) (NCURSES_SP_ARG); /* restore user-defined colors, if any */ - if (SP_PARM->_color_defs < 0) { + if (SP_PARM->_color_defs < 0 && !SP_PARM->_direct_color.value) { int n; SP_PARM->_color_defs = -(SP_PARM->_color_defs); for (n = 0; n < SP_PARM->_color_defs; ++n) { if (SP_PARM->_color_table[n].init) { - NCURSES_SP_NAME(init_color) (NCURSES_SP_ARGx - (short) n, - SP_PARM->_color_table[n].r, - SP_PARM->_color_table[n].g, - SP_PARM->_color_table[n].b); + _nc_init_color(SP_PARM, + n, + SP_PARM->_color_table[n].r, + SP_PARM->_color_table[n].g, + SP_PARM->_color_table[n].b); } } } |