aboutsummaryrefslogtreecommitdiff
path: root/ncurses/tty
diff options
context:
space:
mode:
Diffstat (limited to 'ncurses/tty')
-rwxr-xr-xncurses/tty/MKexpanded.sh8
-rw-r--r--ncurses/tty/hardscroll.c9
-rw-r--r--ncurses/tty/hashmap.c65
-rw-r--r--ncurses/tty/lib_mvcur.c100
-rw-r--r--ncurses/tty/lib_tstp.c12
-rw-r--r--ncurses/tty/lib_twait.c19
-rw-r--r--ncurses/tty/lib_vidattr.c23
-rw-r--r--ncurses/tty/tty_update.c210
8 files changed, 284 insertions, 162 deletions
diff --git a/ncurses/tty/MKexpanded.sh b/ncurses/tty/MKexpanded.sh
index 7a5f5993c487..89e747416d01 100755
--- a/ncurses/tty/MKexpanded.sh
+++ b/ncurses/tty/MKexpanded.sh
@@ -1,6 +1,6 @@
#! /bin/sh
##############################################################################
-# Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. #
+# Copyright (c) 1998-2017,2019 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 +29,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.21 2019/03/02 22:47:55 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 +48,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 +125,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 4ec168a0028e..f7c9e0d46f52 100644
--- a/ncurses/tty/hardscroll.c
+++ b/ncurses/tty/hardscroll.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2010,2012 Free Software Foundation, Inc. *
+ * Copyright (c) 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 +147,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.53 2016/05/28 23:32:40 tom Exp $")
#if defined(SCROLLDEBUG) || defined(HASHDEBUG)
@@ -300,11 +300,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 +340,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 4a723865a4fd..75f6004d4510 100644
--- a/ncurses/tty/hashmap.c
+++ b/ncurses/tty/hashmap.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2016,2019 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 +73,23 @@ AUTHOR
#define CUR SP_TERMTYPE
#endif
-MODULE_ID("$Id: hashmap.c,v 1.63 2011/10/22 16:34:50 tom Exp $")
+MODULE_ID("$Id: hashmap.c,v 1.67 2019/12/15 00:57:15 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 +119,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 +135,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 +149,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 +198,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 +214,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 +287,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 +388,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,13 +497,13 @@ 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]) = '.';
}
- if (isatty(fileno(stdin)))
+ if (NC_ISATTY(fileno(stdin)))
usage();
#ifdef TRACE
@@ -509,7 +520,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 +533,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 +543,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 +557,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 +583,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 2ea04c58a8f2..c4847c720589 100644
--- a/ncurses/tty/lib_mvcur.c
+++ b/ncurses/tty/lib_mvcur.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2018,2019 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 +159,7 @@
#define CUR SP_TERMTYPE
#endif
-MODULE_ID("$Id: lib_mvcur.c,v 1.133 2013/05/25 23:59:41 tom Exp $")
+MODULE_ID("$Id: lib_mvcur.c,v 1.150 2019/06/01 23:42:09 tom Exp $")
#define WANT_CHAR(sp, y, x) NewScreen(sp)->_line[y].text[x] /* desired state */
@@ -327,7 +327,7 @@ NCURSES_EXPORT(void)
NCURSES_SP_NAME(_nc_mvcur_init) (NCURSES_SP_DCL0)
/* initialize the cost structure */
{
- if (SP_PARM->_ofp && isatty(fileno(SP_PARM->_ofp))) {
+ if (SP_PARM->_ofp && NC_ISATTY(fileno(SP_PARM->_ofp))) {
SP_PARM->_char_padding = ((BAUDBYTE * 1000 * 10)
/ (BAUDRATE(SP_PARM) > 0
? BAUDRATE(SP_PARM)
@@ -344,7 +344,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 +452,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 +937,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 +991,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 +1045,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 +1059,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 +1089,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,13 +1198,12 @@ 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();
_nc_mvcur_init();
- NC_BUFFERED(FALSE);
(void) puts("The mvcur tester. Type ? for help");
@@ -1198,27 +1214,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;
@@ -1246,7 +1261,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();
@@ -1279,8 +1294,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 b6955c456248..42d5ccb41522 100644
--- a/ncurses/tty/lib_tstp.c
+++ b/ncurses/tty/lib_tstp.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. *
+ * Copyright (c) 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 +42,7 @@
#include <SigAction.h>
-MODULE_ID("$Id: lib_tstp.c,v 1.47 2013/04/27 19:50:17 tom Exp $")
+MODULE_ID("$Id: lib_tstp.c,v 1.49 2017/07/22 23:29:58 tom Exp $")
#if defined(SIGTSTP) && (HAVE_SIGACTION || HAVE_SIGVEC)
#define USE_SIGTSTP 1
@@ -155,8 +155,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
@@ -267,13 +269,13 @@ handle_SIGINT(int sig)
SCREEN *scan;
for (each_screen(scan)) {
if (scan->_ofp != 0
- && isatty(fileno(scan->_ofp))) {
+ && NC_ISATTY(fileno(scan->_ofp))) {
scan->_outch = NCURSES_SP_NAME(_nc_outch);
}
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 2f70550fb578..ffdd4932183e 100644
--- a/ncurses/tty/lib_twait.c
+++ b/ncurses/tty/lib_twait.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2016,2018 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 +70,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.67 2013/02/18 09:22:27 tom Exp $")
+MODULE_ID("$Id: lib_twait.c,v 1.73 2018/06/23 21:35:06 tom Exp $")
static long
_nc_gettime(TimeType * t0, int first)
@@ -102,7 +102,7 @@ _nc_gettime(TimeType * t0, int first)
if (first) {
*t0 = t1;
}
- res = (t1 - *t0) * 1000;
+ res = (long) ((t1 - *t0) * 1000);
#endif
TR(TRACE_IEVENT, ("%s time: %ld msec", first ? "get" : "elapsed", res));
return res;
@@ -113,15 +113,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 +197,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 +234,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 0846d8485f42..49e754782597 100644
--- a/ncurses/tty/lib_vidattr.c
+++ b/ncurses/tty/lib_vidattr.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2011,2013 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2018,2019 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 +69,24 @@
#define CUR SP_TERMTYPE
#endif
-MODULE_ID("$Id: lib_vidattr.c,v 1.67 2013/08/31 20:08:59 tom Exp $")
+MODULE_ID("$Id: lib_vidattr.c,v 1.74 2019/04/13 22:40:54 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 +124,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 */
@@ -213,7 +220,7 @@ NCURSES_SP_NAME(vidputs) (NCURSES_SP_DCLx
}
turn_off = (~newmode & PreviousAttr) & ALL_BUT_COLOR;
- turn_on = (newmode & ~PreviousAttr) & ALL_BUT_COLOR;
+ turn_on = (newmode & ~(PreviousAttr & TPARM_ATTR)) & ALL_BUT_COLOR;
SetColorsIf(((pair == 0) && !fix_pair0), PreviousAttr);
@@ -308,7 +315,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);
@@ -368,7 +375,7 @@ NCURSES_SP_NAME(termattrs) (NCURSES_SP_DCL0)
if (HasTerminal(SP_PARM)) {
#ifdef USE_TERM_DRIVER
- attrs = CallDriver(SP_PARM, conattr);
+ attrs = CallDriver(SP_PARM, td_conattr);
#else /* ! USE_TERM_DRIVER */
if (enter_alt_charset_mode)
diff --git a/ncurses/tty/tty_update.c b/ncurses/tty/tty_update.c
index 8a110ee92125..162303433c30 100644
--- a/ncurses/tty/tty_update.c
+++ b/ncurses/tty/tty_update.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2018,2019 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 +43,8 @@
*
*-----------------------------------------------------------------*/
+#define NEW_PAIR_INTERNAL 1
+
#include <curses.priv.h>
#ifndef CUR
@@ -82,7 +84,7 @@
#include <ctype.h>
-MODULE_ID("$Id: tty_update.c,v 1.277 2014/02/01 22:09:27 tom Exp $")
+MODULE_ID("$Id: tty_update.c,v 1.304 2019/06/23 16:22:17 tom Exp $")
/*
* This define controls the line-breakout optimization. Every once in a
@@ -179,7 +181,7 @@ position_check(NCURSES_SP_DCLx int expected_y, int expected_x, char *legend)
}
}
#else
-#define position_check(sp, expected_y, expected_x, legend) /* nothing */
+#define position_check(expected_y, expected_x, legend) /* nothing */
#endif /* POSITION_DEBUG */
/****************************************************************************
@@ -194,15 +196,23 @@ GoTo(NCURSES_SP_DCLx int const row, int const col)
TR(TRACE_MOVE, ("GoTo(%p, %d, %d) from (%d, %d)",
(void *) SP_PARM, row, col, SP_PARM->_cursrow, SP_PARM->_curscol));
- position_check(SP_PARM, SP_PARM->_cursrow, SP_PARM->_curscol, "GoTo");
+ position_check(NCURSES_SP_ARGx
+ SP_PARM->_cursrow,
+ SP_PARM->_curscol, "GoTo");
TINFO_MVCUR(NCURSES_SP_ARGx
SP_PARM->_cursrow,
SP_PARM->_curscol,
row, col);
- position_check(SP_PARM, SP_PARM->_cursrow, SP_PARM->_curscol, "GoTo2");
+ position_check(NCURSES_SP_ARGx
+ SP_PARM->_cursrow,
+ 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)
{
@@ -229,7 +239,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);
/*
@@ -264,8 +274,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
@@ -273,17 +289,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
@@ -303,6 +341,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);
@@ -390,7 +433,7 @@ PutCharLR(NCURSES_SP_DCLx const ARG_CH_T ch)
PutAttrChar(NCURSES_SP_ARGx ch);
SP_PARM->_curscol--;
- position_check(SP_PARM,
+ position_check(NCURSES_SP_ARGx
SP_PARM->_cursrow,
SP_PARM->_curscol,
"exit_am_mode");
@@ -444,12 +487,12 @@ 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--;
}
- position_check(SP_PARM,
+ position_check(NCURSES_SP_ARGx
SP_PARM->_cursrow,
SP_PARM->_curscol,
"wrap_cursor");
@@ -469,7 +512,9 @@ PutChar(NCURSES_SP_DCLx const ARG_CH_T ch)
if (SP_PARM->_curscol >= screen_columns(SP_PARM))
wrap_cursor(NCURSES_SP_ARG);
- position_check(SP_PARM, SP_PARM->_cursrow, SP_PARM->_curscol, "PutChar");
+ position_check(NCURSES_SP_ARGx
+ SP_PARM->_cursrow,
+ SP_PARM->_curscol, "PutChar");
}
/*
@@ -487,14 +532,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;
}
}
@@ -572,7 +618,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;
@@ -581,11 +635,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;
@@ -621,7 +683,7 @@ 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)",
(void *) SP_PARM,
@@ -631,6 +693,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;
@@ -649,9 +713,11 @@ PutRange(NCURSES_SP_DCLx
* Always return 1 for the next GoTo() after a PutRange() if we found
* identical characters at end of interval
*/
- return (same == 0 ? i : 1);
+ rc = (same == 0 ? i : 1);
+ } else {
+ rc = EmitRange(NCURSES_SP_ARGx ntext + first, last - first + 1);
}
- return EmitRange(NCURSES_SP_ARGx ntext + first, last - first + 1);
+ return rc;
}
/* leave unbracketed here so 'indent' works */
@@ -671,9 +737,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
@@ -694,9 +763,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)
@@ -714,7 +784,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.
@@ -727,7 +798,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);
@@ -736,7 +807,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 */
@@ -1004,6 +1075,7 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0)
_nc_signal_handler(TRUE);
+ _nc_unlock_global(update);
returnCode(OK);
}
@@ -1075,10 +1147,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 =
@@ -1149,16 +1221,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));
}
@@ -1249,8 +1322,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]));
}
}
@@ -1486,9 +1559,17 @@ TransformLine(NCURSES_SP_DCLx int const lineno)
if (oLastChar < nLastChar) {
int m = max(nLastNonblank, oLastNonblank);
#if USE_WIDEC_SUPPORT
- while (isWidecExt(newLine[n + 1]) && n) {
- --n;
- --oLastChar;
+ if (n) {
+ while (isWidecExt(newLine[n + 1]) && n) {
+ --n;
+ --oLastChar; /* increase cost */
+ }
+ } else if (n >= firstChar &&
+ isWidecBase(newLine[n])) {
+ while (isWidecExt(newLine[n + 1])) {
+ ++n;
+ ++oLastChar; /* decrease cost */
+ }
}
#endif
GoTo(NCURSES_SP_ARGx lineno, n + 1);
@@ -1508,8 +1589,9 @@ TransformLine(NCURSES_SP_DCLx int const lineno)
if (DelCharCost(SP_PARM, oLastChar - nLastChar)
> SP_PARM->_el_cost + nLastNonblank - (n + 1)) {
if (PutRange(NCURSES_SP_ARGx oldLine, newLine, lineno,
- n + 1, nLastNonblank))
- GoTo(NCURSES_SP_ARGx lineno, nLastNonblank + 1);
+ n + 1, nLastNonblank)) {
+ GoTo(NCURSES_SP_ARGx lineno, nLastNonblank + 1);
+ }
ClrToEOL(NCURSES_SP_ARGx blank, FALSE);
} else {
/*
@@ -1570,7 +1652,7 @@ ClearScreen(NCURSES_SP_DCLx NCURSES_CH_T blank)
UpdateAttrs(SP_PARM, blank);
NCURSES_PUTP2("clear_screen", clear_screen);
SP_PARM->_cursrow = SP_PARM->_curscol = 0;
- position_check(SP_PARM,
+ position_check(NCURSES_SP_ARGx
SP_PARM->_cursrow,
SP_PARM->_curscol,
"ClearScreen");
@@ -1631,16 +1713,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);
@@ -1650,7 +1732,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) {
@@ -1660,7 +1742,9 @@ InsStr(NCURSES_SP_DCLx NCURSES_CH_T * line, int count)
count--;
}
}
- position_check(SP_PARM, SP_PARM->_cursrow, SP_PARM->_curscol, "InsStr");
+ position_check(NCURSES_SP_ARGx
+ SP_PARM->_cursrow,
+ SP_PARM->_curscol, "InsStr");
}
/*
@@ -1673,8 +1757,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,
@@ -1684,9 +1766,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);
}
@@ -2065,16 +2149,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);
}
}
}