| From 135d37072755704b8d018e5de74e62ff3f28c930 Mon Sep 17 00:00:00 2001 |
| From: Thomas E. Dickey <dickey@invisible-island.net> |
| Date: Sun, 5 Nov 2023 05:54:54 +0530 |
| Subject: [PATCH] Updating reset code - ncurses 6.4 - patch 20231104 |
| |
| + modify reset command to avoid altering clocal if the terminal uses a |
| modem (prompted by discussion with Werner Fink, Michal Suchanek, |
| OpenSUSE #1201384, Debian #60377). |
| + build-fixes for --with-caps variations. |
| + correct a couple of section-references in INSTALL. |
| |
| Signed-off-by: Thomas E. Dickey <dickey@invisible-island.net> |
| |
| Upstream-Status: Backport [https://ncurses.scripts.mit.edu/?p=ncurses.git;a=commitdiff;h=135d37072755704b8d018e5de74e62ff3f28c930] |
| |
| Signed-off-by: Soumya Sambu <soumya.sambu@windriver.com> |
| --- |
| INSTALL | 8 +- |
| include/curses.events | 2 +- |
| ncurses/tinfo/lib_tparm.c | 2 + |
| progs/reset_cmd.c | 281 +++++++++++++++++++++----------------- |
| progs/tabs.c | 10 +- |
| progs/tic.c | 4 + |
| 6 files changed, 176 insertions(+), 131 deletions(-) |
| |
| diff --git a/INSTALL b/INSTALL |
| index d9c1dd12..d0a39af0 100644 |
| --- a/INSTALL |
| +++ b/INSTALL |
| @@ -47,7 +47,7 @@ If you are converting from BSD curses and do not have root access, be sure |
| to read the BSD CONVERSION NOTES section below. |
| |
| If you are trying to build applications using gpm with ncurses, |
| -read the USING NCURSES WITH GPM section below. |
| +read the USING GPM section below. |
| |
| If you are cross-compiling, see the note below on BUILDING WITH A CROSS-COMPILER. |
| |
| @@ -79,7 +79,7 @@ INSTALLATION PROCEDURE: |
| The --prefix option to configure changes the root directory for installing |
| ncurses. The default is normally in subdirectories of /usr/local, except |
| for systems where ncurses is normally installed as a system library (see |
| - "IF YOU ARE A SYSTEM INTEGRATOR"). Use --prefix=/usr to replace your |
| + "FOR SYSTEM INTEGRATORS"). Use --prefix=/usr to replace your |
| default curses distribution. |
| |
| The package gets installed beneath the --prefix directory as follows: |
| @@ -176,7 +176,7 @@ INSTALLATION PROCEDURE: |
| You can make curses and terminfo fall back to an existing file of termcap |
| definitions by configuring with --enable-termcap. If you do this, the |
| library will search /etc/termcap before the terminfo database, and will |
| - also interpret the contents of the TERM environment variable. See the |
| + also interpret the contents of the $TERM environment variable. See the |
| section BSD CONVERSION NOTES below. |
| |
| 3. Type `make'. Ignore any warnings, no error messages should be produced. |
| @@ -1231,7 +1231,7 @@ CONFIGURE OPTIONS: |
| Specify a search-list of terminfo directories which will be compiled |
| into the ncurses library (default: DATADIR/terminfo) |
| |
| - This is a colon-separated list, like the TERMINFO_DIRS environment |
| + This is a colon-separated list, like the $TERMINFO_DIRS environment |
| variable. |
| |
| --with-termlib[=XXX] |
| diff --git a/include/curses.events b/include/curses.events |
| index 25a2583f..468bde18 100644 |
| --- a/include/curses.events |
| +++ b/include/curses.events |
| @@ -50,6 +50,6 @@ typedef struct |
| extern NCURSES_EXPORT(int) wgetch_events (WINDOW *, _nc_eventlist *) GCC_DEPRECATED(experimental option); /* experimental */ |
| extern NCURSES_EXPORT(int) wgetnstr_events (WINDOW *,char *,int,_nc_eventlist *) GCC_DEPRECATED(experimental option); /* experimental */ |
| |
| -#define KEY_EVENT 0633 /* We were interrupted by an event */ |
| +#define KEY_EVENT 0634 /* We were interrupted by an event */ |
| |
| #endif /* NCURSES_WGETCH_EVENTS */ |
| diff --git a/ncurses/tinfo/lib_tparm.c b/ncurses/tinfo/lib_tparm.c |
| index a10a3877..cd972c0f 100644 |
| --- a/ncurses/tinfo/lib_tparm.c |
| +++ b/ncurses/tinfo/lib_tparm.c |
| @@ -1113,8 +1113,10 @@ check_string_caps(TPARM_DATA *data, const char *string) |
| want_type = 2; /* function key #1, transmit string #2 */ |
| else if (CHECK_CAP(plab_norm)) |
| want_type = 2; /* label #1, show string #2 */ |
| +#ifdef pkey_plab |
| else if (CHECK_CAP(pkey_plab)) |
| want_type = 6; /* function key #1, type string #2, show string #3 */ |
| +#endif |
| #if NCURSES_XNAMES |
| else { |
| char *check; |
| diff --git a/progs/reset_cmd.c b/progs/reset_cmd.c |
| index eff3af72..aec4b077 100644 |
| --- a/progs/reset_cmd.c |
| +++ b/progs/reset_cmd.c |
| @@ -75,6 +75,9 @@ MODULE_ID("$Id: reset_cmd.c,v 1.28 2021/10/02 18:08:44 tom Exp $") |
| # endif |
| #endif |
| |
| +#define set_flags(target, mask) target |= mask |
| +#define clear_flags(target, mask) target &= ~((unsigned)(mask)) |
| + |
| static FILE *my_file; |
| |
| static bool use_reset = FALSE; /* invoked as reset */ |
| @@ -188,6 +191,79 @@ out_char(int c) |
| #define reset_char(item, value) \ |
| tty_settings->c_cc[item] = CHK(tty_settings->c_cc[item], value) |
| |
| +/* |
| + * Simplify ifdefs |
| + */ |
| +#ifndef BSDLY |
| +#define BSDLY 0 |
| +#endif |
| +#ifndef CRDLY |
| +#define CRDLY 0 |
| +#endif |
| +#ifndef ECHOCTL |
| +#define ECHOCTL 0 |
| +#endif |
| +#ifndef ECHOKE |
| +#define ECHOKE 0 |
| +#endif |
| +#ifndef ECHOPRT |
| +#define ECHOPRT 0 |
| +#endif |
| +#ifndef FFDLY |
| +#define FFDLY 0 |
| +#endif |
| +#ifndef IMAXBEL |
| +#define IMAXBEL 0 |
| +#endif |
| +#ifndef IUCLC |
| +#define IUCLC 0 |
| +#endif |
| +#ifndef IXANY |
| +#define IXANY 0 |
| +#endif |
| +#ifndef NLDLY |
| +#define NLDLY 0 |
| +#endif |
| +#ifndef OCRNL |
| +#define OCRNL 0 |
| +#endif |
| +#ifndef OFDEL |
| +#define OFDEL 0 |
| +#endif |
| +#ifndef OFILL |
| +#define OFILL 0 |
| +#endif |
| +#ifndef OLCUC |
| +#define OLCUC 0 |
| +#endif |
| +#ifndef ONLCR |
| +#define ONLCR 0 |
| +#endif |
| +#ifndef ONLRET |
| +#define ONLRET 0 |
| +#endif |
| +#ifndef ONOCR |
| +#define ONOCR 0 |
| +#endif |
| +#ifndef OXTABS |
| +#define OXTABS 0 |
| +#endif |
| +#ifndef TAB3 |
| +#define TAB3 0 |
| +#endif |
| +#ifndef TABDLY |
| +#define TABDLY 0 |
| +#endif |
| +#ifndef TOSTOP |
| +#define TOSTOP 0 |
| +#endif |
| +#ifndef VTDLY |
| +#define VTDLY 0 |
| +#endif |
| +#ifndef XCASE |
| +#define XCASE 0 |
| +#endif |
| + |
| /* |
| * Reset the terminal mode bits to a sensible state. Very useful after |
| * a child program dies in raw mode. |
| @@ -195,6 +271,10 @@ out_char(int c) |
| void |
| reset_tty_settings(int fd, TTY * tty_settings, int noset) |
| { |
| + unsigned mask; |
| +#ifdef TIOCMGET |
| + int modem_bits; |
| +#endif |
| GET_TTY(fd, tty_settings); |
| |
| #ifdef TERMIOS |
| @@ -228,106 +308,65 @@ reset_tty_settings(int fd, TTY * tty_settings, int noset) |
| reset_char(VWERASE, CWERASE); |
| #endif |
| |
| - tty_settings->c_iflag &= ~((unsigned) (IGNBRK |
| - | PARMRK |
| - | INPCK |
| - | ISTRIP |
| - | INLCR |
| - | IGNCR |
| -#ifdef IUCLC |
| - | IUCLC |
| -#endif |
| -#ifdef IXANY |
| - | IXANY |
| -#endif |
| - | IXOFF)); |
| - |
| - tty_settings->c_iflag |= (BRKINT |
| - | IGNPAR |
| - | ICRNL |
| - | IXON |
| -#ifdef IMAXBEL |
| - | IMAXBEL |
| -#endif |
| - ); |
| - |
| - tty_settings->c_oflag &= ~((unsigned) (0 |
| -#ifdef OLCUC |
| - | OLCUC |
| -#endif |
| -#ifdef OCRNL |
| - | OCRNL |
| -#endif |
| -#ifdef ONOCR |
| - | ONOCR |
| -#endif |
| -#ifdef ONLRET |
| - | ONLRET |
| -#endif |
| -#ifdef OFILL |
| - | OFILL |
| -#endif |
| -#ifdef OFDEL |
| - | OFDEL |
| -#endif |
| -#ifdef NLDLY |
| - | NLDLY |
| -#endif |
| -#ifdef CRDLY |
| - | CRDLY |
| -#endif |
| -#ifdef TABDLY |
| - | TABDLY |
| -#endif |
| -#ifdef BSDLY |
| - | BSDLY |
| -#endif |
| -#ifdef VTDLY |
| - | VTDLY |
| -#endif |
| -#ifdef FFDLY |
| - | FFDLY |
| -#endif |
| - )); |
| - |
| - tty_settings->c_oflag |= (OPOST |
| -#ifdef ONLCR |
| - | ONLCR |
| -#endif |
| - ); |
| - |
| - tty_settings->c_cflag &= ~((unsigned) (CSIZE |
| - | CSTOPB |
| - | PARENB |
| - | PARODD |
| - | CLOCAL)); |
| - tty_settings->c_cflag |= (CS8 | CREAD); |
| - tty_settings->c_lflag &= ~((unsigned) (ECHONL |
| - | NOFLSH |
| -#ifdef TOSTOP |
| - | TOSTOP |
| -#endif |
| -#ifdef ECHOPTR |
| - | ECHOPRT |
| -#endif |
| -#ifdef XCASE |
| - | XCASE |
| -#endif |
| - )); |
| - |
| - tty_settings->c_lflag |= (ISIG |
| - | ICANON |
| - | ECHO |
| - | ECHOE |
| - | ECHOK |
| -#ifdef ECHOCTL |
| - | ECHOCTL |
| -#endif |
| -#ifdef ECHOKE |
| - | ECHOKE |
| -#endif |
| - ); |
| -#endif |
| + clear_flags(tty_settings->c_iflag, (IGNBRK |
| + | PARMRK |
| + | INPCK |
| + | ISTRIP |
| + | INLCR |
| + | IGNCR |
| + | IUCLC |
| + | IXANY |
| + | IXOFF)); |
| + |
| + set_flags(tty_settings->c_iflag, (BRKINT |
| + | IGNPAR |
| + | ICRNL |
| + | IXON |
| + | IMAXBEL)); |
| + |
| + clear_flags(tty_settings->c_oflag, (0 |
| + | OLCUC |
| + | OCRNL |
| + | ONOCR |
| + | ONLRET |
| + | OFILL |
| + | OFDEL |
| + | NLDLY |
| + | CRDLY |
| + | TABDLY |
| + | BSDLY |
| + | VTDLY |
| + | FFDLY)); |
| + |
| + set_flags(tty_settings->c_oflag, (OPOST |
| + | ONLCR)); |
| + |
| + mask = (CSIZE | CSTOPB | PARENB | PARODD); |
| +#ifdef TIOCMGET |
| + /* leave clocal alone if this appears to use a modem */ |
| + if (ioctl(fd, TIOCMGET, &modem_bits) == -1) |
| + mask |= CLOCAL; |
| +#else |
| + /* cannot check - use the behavior from tset */ |
| + mask |= CLOCAL; |
| +#endif |
| + clear_flags(tty_settings->c_cflag, mask); |
| + |
| + set_flags(tty_settings->c_cflag, (CS8 | CREAD)); |
| + clear_flags(tty_settings->c_lflag, (ECHONL |
| + | NOFLSH |
| + | TOSTOP |
| + | ECHOPRT |
| + | XCASE)); |
| + |
| + set_flags(tty_settings->c_lflag, (ISIG |
| + | ICANON |
| + | ECHO |
| + | ECHOE |
| + | ECHOK |
| + | ECHOCTL |
| + | ECHOKE)); |
| +#endif /* TERMIOS */ |
| |
| if (!noset) { |
| SET_TTY(fd, tty_settings); |
| @@ -402,29 +441,23 @@ set_conversions(TTY * tty_settings) |
| #if defined(EXP_WIN32_DRIVER) |
| /* FIXME */ |
| #else |
| -#ifdef ONLCR |
| - tty_settings->c_oflag |= ONLCR; |
| -#endif |
| - tty_settings->c_iflag |= ICRNL; |
| - tty_settings->c_lflag |= ECHO; |
| -#ifdef OXTABS |
| - tty_settings->c_oflag |= OXTABS; |
| -#endif /* OXTABS */ |
| + set_flags(tty_settings->c_oflag, ONLCR); |
| + set_flags(tty_settings->c_iflag, ICRNL); |
| + set_flags(tty_settings->c_lflag, ECHO); |
| + set_flags(tty_settings->c_oflag, OXTABS); |
| |
| /* test used to be tgetflag("NL") */ |
| if (VALID_STRING(newline) && newline[0] == '\n' && !newline[1]) { |
| /* Newline, not linefeed. */ |
| -#ifdef ONLCR |
| - tty_settings->c_oflag &= ~((unsigned) ONLCR); |
| -#endif |
| - tty_settings->c_iflag &= ~((unsigned) ICRNL); |
| + clear_flags(tty_settings->c_oflag, ONLCR); |
| + clear_flags(tty_settings->c_iflag, ICRNL); |
| } |
| -#ifdef OXTABS |
| +#if OXTABS |
| /* test used to be tgetflag("pt") */ |
| if (VALID_STRING(set_tab) && VALID_STRING(clear_all_tabs)) |
| - tty_settings->c_oflag &= ~OXTABS; |
| + clear_flags(tty_settings->c_oflag, OXTABS); |
| #endif /* OXTABS */ |
| - tty_settings->c_lflag |= (ECHOE | ECHOK); |
| + set_flags(tty_settings->c_lflag, (ECHOE | ECHOK)); |
| #endif |
| } |
| |
| @@ -490,7 +523,7 @@ send_init_strings(int fd GCC_UNUSED, TTY * old_settings) |
| bool need_flush = FALSE; |
| |
| (void) old_settings; |
| -#ifdef TAB3 |
| +#if TAB3 |
| if (old_settings != 0 && |
| old_settings->c_oflag & (TAB3 | ONLCR | OCRNL | ONLRET)) { |
| old_settings->c_oflag &= (TAB3 | ONLCR | OCRNL | ONLRET); |
| @@ -512,22 +545,22 @@ send_init_strings(int fd GCC_UNUSED, TTY * old_settings) |
| |
| if (VALID_STRING(clear_margins)) { |
| need_flush |= sent_string(clear_margins); |
| - } else |
| + } |
| #if defined(set_lr_margin) |
| - if (VALID_STRING(set_lr_margin)) { |
| + else if (VALID_STRING(set_lr_margin)) { |
| need_flush |= sent_string(TIPARM_2(set_lr_margin, 0, columns - 1)); |
| - } else |
| + } |
| #endif |
| #if defined(set_left_margin_parm) && defined(set_right_margin_parm) |
| - if (VALID_STRING(set_left_margin_parm) |
| - && VALID_STRING(set_right_margin_parm)) { |
| + else if (VALID_STRING(set_left_margin_parm) |
| + && VALID_STRING(set_right_margin_parm)) { |
| need_flush |= sent_string(TIPARM_1(set_left_margin_parm, 0)); |
| need_flush |= sent_string(TIPARM_1(set_right_margin_parm, |
| columns - 1)); |
| - } else |
| + } |
| #endif |
| - if (VALID_STRING(set_left_margin) |
| - && VALID_STRING(set_right_margin)) { |
| + else if (VALID_STRING(set_left_margin) |
| + && VALID_STRING(set_right_margin)) { |
| need_flush |= to_left_margin(); |
| need_flush |= sent_string(set_left_margin); |
| if (VALID_STRING(parm_right_cursor)) { |
| diff --git a/progs/tabs.c b/progs/tabs.c |
| index 7378d116..d904330b 100644 |
| --- a/progs/tabs.c |
| +++ b/progs/tabs.c |
| @@ -370,7 +370,9 @@ do_set_margin(int margin, bool no_op) |
| } |
| tputs(set_left_margin, 1, putch); |
| } |
| - } else if (VALID_STRING(set_left_margin_parm)) { |
| + } |
| +#if defined(set_left_margin_parm) && defined(set_right_margin_parm) |
| + else if (VALID_STRING(set_left_margin_parm)) { |
| result = TRUE; |
| if (!no_op) { |
| if (VALID_STRING(set_right_margin_parm)) { |
| @@ -379,12 +381,16 @@ do_set_margin(int margin, bool no_op) |
| tputs(TIPARM_2(set_left_margin_parm, margin, max_cols), 1, putch); |
| } |
| } |
| - } else if (VALID_STRING(set_lr_margin)) { |
| + } |
| +#endif |
| +#if defined(set_lr_margin) |
| + else if (VALID_STRING(set_lr_margin)) { |
| result = TRUE; |
| if (!no_op) { |
| tputs(TIPARM_2(set_lr_margin, margin, max_cols), 1, putch); |
| } |
| } |
| +#endif |
| return result; |
| } |
| |
| diff --git a/progs/tic.c b/progs/tic.c |
| index 888927e2..78b568fa 100644 |
| --- a/progs/tic.c |
| +++ b/progs/tic.c |
| @@ -3142,6 +3142,7 @@ guess_ANSI_VTxx(TERMTYPE2 *tp) |
| * In particular, any ECMA-48 terminal should support these, though the details |
| * for u9 are implementation dependent. |
| */ |
| +#if defined(user6) && defined(user7) && defined(user8) && defined(user9) |
| static void |
| check_user_6789(TERMTYPE2 *tp) |
| { |
| @@ -3177,6 +3178,9 @@ check_user_6789(TERMTYPE2 *tp) |
| break; |
| } |
| } |
| +#else |
| +#define check_user_6789(tp) /* nothing */ |
| +#endif |
| |
| /* other sanity-checks (things that we don't want in the normal |
| * logic that reads a terminfo entry) |
| -- |
| 2.40.0 |