Date: Thu, 2 Dec 1999 22:15:20 +1100 (EST) From: Bruce Evans <bde@zeta.org.au> To: charon@freethought.org Cc: current@FreeBSD.ORG, peter@FreeBSD.ORG Subject: Re: minor bug in ee? Message-ID: <Pine.BSF.4.10.9912022132150.2281-100000@alphplex.bde.org> In-Reply-To: <3.0.5.32.19991202005411.00a39cb0@nsit-popmail.uchicago.edu>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 2 Dec 1999 charon@freethought.org wrote:
> I recently noticed that ^v (the scroll down a page command in ee) must be
> entered twice to scroll down once (i.e. if you hit ^v once it won't do
> anything, you must hit it again) on a 4.0-CURRENT system. As far as I can
> recall, this has been happening for as long as I've been tracking -CURRENT
> (~1 month), and still continues on the system I updated as of Nov. 30.
> 3-STABLE (as of Dec. 1) doesn't have this problem - it has a simple
> one-to-one ratio for ^v / scroll down. As far as I can recall, none of the
> other 3.x or 2.x releases had this problem either.
>
> I doubt this is very important - should I file a PR or anything?
This is the classic IEXTEN bug. The interaction of IEXTEN with ICANON is
implementation-defined. In FreeBSD, IEXTEN is independent of ICANON.
Buggy software doesn't know this and leaves IEXTEN set in "raw" mode.
This normally leaves ^V as the lnext character.
This bug, as it affects ee, is another libncurses bug. The old libcurses
never had it, and it was "fixed" in in rev.1.4 of lib_raw.c in the old
libncurses. Here is the "fix" cleaned up and merged into the current
lib_raw.c:
Index: ncurses/tinfo/lib_raw.c
===================================================================
RCS file: /home/ncvs/src/contrib/ncurses/ncurses/tinfo/lib_raw.c,v
retrieving revision 1.1.1.1
diff -c -2 -r1.1.1.1 lib_raw.c
*** lib_raw.c 1999/08/24 01:06:44 1.1.1.1
--- lib_raw.c 1999/12/02 10:39:01
***************
*** 75,78 ****
--- 75,82 ----
#endif /* TRACE */
+ #ifdef TERMIOS
+ static tcflag_t iexten = 0;
+ #endif
+
int raw(void)
{
***************
*** 89,93 ****
#ifdef TERMIOS
BEFORE("raw");
! cur_term->Nttyb.c_lflag &= ~(ICANON|ISIG);
cur_term->Nttyb.c_iflag &= ~(COOKED_INPUT);
cur_term->Nttyb.c_cc[VMIN] = 1;
--- 93,99 ----
#ifdef TERMIOS
BEFORE("raw");
! if (iexten == 0)
! iexten = cur_term->Nttyb.c_lflag & IEXTEN;
! cur_term->Nttyb.c_lflag &= ~(ICANON|ISIG|IEXTEN);
cur_term->Nttyb.c_iflag &= ~(COOKED_INPUT);
cur_term->Nttyb.c_cc[VMIN] = 1;
***************
*** 158,162 ****
#ifdef TERMIOS
BEFORE("noraw");
! cur_term->Nttyb.c_lflag |= ISIG|ICANON;
cur_term->Nttyb.c_iflag |= COOKED_INPUT;
AFTER("noraw");
--- 164,168 ----
#ifdef TERMIOS
BEFORE("noraw");
! cur_term->Nttyb.c_lflag |= ISIG|ICANON|iexten;
cur_term->Nttyb.c_iflag |= COOKED_INPUT;
AFTER("noraw");
Problems with this fix: `iexten' shouldn't exist. The IEXTEN setting for
the "noraw" state should be obtained from the original setting or forced
on or off.
Unfixed nearby problems: About 27 termios flags must be set (on or off)
for raw mode (see libc/gen/termios.c:cfmakeraw()), but raw() only sets
about 5 of them.
Bruce
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.10.9912022132150.2281-100000>
