On Thu, 2 Dec 1999 [EMAIL PROTECTED] 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 [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to