[comp.unix.programmer] Less Optimized Curses

km@mathcs.emory.edu (Ken Mandelberg) (11/13/90)

This is an expansion on a problem I posted earlier about curses screen
update optimization. The issue concerns how clever curses is in updating
a screen to a new screen whoose contents are vertically displaced one
line. What I notice is that almost all versions of curses don't notice
the relationshsip between the screens, and repaint everything. One version
of curses does notice the relationship, and updates the screen using
scrolling.

I don't know how to officially describe the versions of libcurses.a except
to say that the version that comes with SYSVR3.0 does the scrolling, while
the version with SYSVR3.1, SYSVR3.2, SYSVR2.1, and every BSD version I
tried repaints. I did the SYSV experiments on a 3B2 running SYSVR3.2, 
linking the same .o file against various versions of libcurses.a. In all
cases I used exactly the same terminfo entry (vt100). In fact the choice
of terminal (and terminfo entry) is not relevant, I tried various
combinations of terminals and entries (sun, xterm, 4425) all with the
same results.

I'm going to include a tiny sample program that exhibits the behavior. With
the 3.0 libcurses this will paint the screen once and do each refresh() as
a physical scroll and a one line update. On all other versions the cursor
will move over every position on the screen updating every cell. On a work
station with very fast screen updates, you may not easily see the difference.
Over a serial line on a terminal (even at 9600 baud) the difference is very
obvious. 

The 3B2 is the only machine I have a full set of libcurses.a binaries for.
I've also tried this on SunOS 4.1 which runs both BSD and SYSVR3.1 curses
and do full screen updates. A/UX 1.1 and 2.0 both run some flavor of SYSVR2.X
curses and do full screen updates. The last release of the AT&T 3B1 unix has
SYSVR3.0 derived curses routines and uses scrolling.

I report this partially because I am curious as to why libcurses got less
optimized in recent versions. Perhaps the idea is that on the average it was
not worth looking for automatic scroll optimization, and programs that know
they are scrolling should do it themselves. On the practical side, I would 
like an old program that works well on 3.0 to work well on our later systems
without a rewrite (sc the spreedsheet program).

Here is the tiny test program:

#include <curses.h>
#define ODDLINE "This is an odd line
111111111111111111111111111111111111111111"
#define EVENLINE "This is an even line
000000000000000000000000000000000000000000"

main() {

        int i,j;

        initscr();
        for (j=0;j<LINES-1;j++){
                for (i=0;i<LINES-1;i++) {
                        if ((i+j)%2) mvaddstr(i,0,EVENLINE);
                        else mvaddstr(i,0,ODDLINE);
                        }
                refresh();
        }
        sleep(10);
        endwin();
}


-- 
Ken Mandelberg      | km@mathcs.emory.edu          PREFERRED
Emory University    | {rutgers,gatech}!emory!km    UUCP 
Dept of Math and CS | km@emory.bitnet              NON-DOMAIN BITNET  
Atlanta, GA 30322   | Phone: (404) 727-7963

thad@cup.portal.com (Thad P Floryan) (11/14/90)

km@mathcs.emory.edu (Ken Mandelberg) in <1990Nov13.090732@mathcs.emory.edu>
writes:

	This is an expansion on a problem I posted earlier about curses screen
	update optimization. The issue concerns how clever curses is in
	updating a screen to a new screen whoose contents are vertically
	displaced one line. What I notice is that almost all versions of
	curses don't notice the relationshsip between the screens, and repaint
	everything. One version of curses does notice the relationship, and
	updates the screen using scrolling.
	...

His included sample program clearly illustrates the "problem" he laments.

If you drop your baud down to 2400 or 1200 so you can see precisely what it is
that IS being redrawn with the "other" curses, you'll notice that it is NOT
the entire screen being refreshed but only the portion of each line AFTER the
text "This is an ".

Yes, the SVR3.0 version of curses (as I verified) performs an optimization
that does not exist in other versions, but without access to the libcurses'
source I cannot explain why the change.

However, after carefully reading ALL available docs and running numerous
test cases (we're having a curses discussion over in the unix-pc.* newsgroups
right now, and I was the "victor" in a similar dispute at my office just
yesterday) I'm NOT convinced the actions of SVR3.* curses can be considered
a bug since curses DOES refresh ONLY the portions of the physical screen that
changed.

Please note that I agree with you that in the case of ``sc'' the SVR3.0 curses
does a better optimization for that SPECIFIC case, but the other SVR3.* curses
do "good" optimizations for more general situations.

Again, without the source, I can only conjecture that the SVR3.0 curses is
performing "screen cost" optimizations along the lines of GNU emacs whereas
later curses versions appear to solely optimize in accordance with the
published docs (probably for the dual purpose of reduced CPU time and less
memory use).

The algorithms used by GNU emacs are quite effective especially for dial-in
at reduced bauds, and it would be "nice" if they could be optioned-into SVR3+
curses.

But that would be a "Development Request" and not something we're likely to
see anytime soon.  Sigh.

Along these lines, I checked the AT&T ToolChest today (Tuesday) and found
some interesting things there (including ksh-1988e, infocmp and captoinfo), but
I did NOT find ``libcurses'' available as an unbundled product.

Does anyone know if the source(s) to ``libcurses'' with SVR3.* terminfo
support are available from AT&T without requiring a complete UNIX Source
License?  I'm not asking for a "freebee", I'm looking to purchase it for use
with my product which MUST have the same "look and feel" no matter what SysV
system it's on; as I've recently discovered to my dismay, not all vendors'
ports of various SysV or SysV-like systems feature a "modern" curses.  A phone
number or email contact at AT&T would be greatly appreciated.  I'm also
willing to consider any OTHER product that will provide "vt100-style" line
drawing, region scrolling, bold/blink/underline, cursor-key cognizance, etc.

Thad Floryan [ thad@cup.portal.com (OR) ..!sun!portal!cup.portal.com!thad ]

staceyc@sco.COM (Stacey Campbell) (11/15/90)

In article <1990Nov13.090732@mathcs.emory.edu> km@mathcs.emory.edu (Ken Mandelberg) writes:
>This is an expansion on a problem I posted earlier about curses screen
>update optimization. The issue concerns how clever curses is in updating
>a screen to a new screen whoose contents are vertically displaced one
>line. What I notice is that almost all versions of curses don't notice
>the relationshsip between the screens, and repaint everything. One version
>of curses does notice the relationship, and updates the screen using
>scrolling.

Most modern versions of curses will not use insert line or delete line
to achieve scrolling unless they are explicitly requested to do so by
the application.

You will find that adding;

	idlok(stdscr, TRUE);

directly after the initscr() call will then permit System V 3.2 curses
to scroll using insert line/delete line.

Here's what the AT&T manual says (somewhat abridged);

idlok(win, bf)	If enabled, curses will consider using the hardware
	"insert/delete-line" feature of terminals so equipped.  If
	disabled, curses will very seldom use this feature [I have never
	seen it use this feature when disabled - Stacey].  It is
	disabled by default because "insert/delete-line" tends to be
	visually annoying when used in applications where it isn't really
	needed.

I agree with the manual writer, forcing scrolls in some situations
is very irritating to the eye.  It is definitely something that should
be only used when required.

>I report this partially because I am curious as to why libcurses got less
>optimized in recent versions.

It's not less optimised.  The opposite is in fact true.  It's only
in recent versions (System V 3.1 (?)) for example that typeahead
checking has been implemented.

>On the practical side, I would 
>like an old program that works well on 3.0 to work well on our later systems
>without a rewrite (sc the spreedsheet program).

No need to rewrite.  One of the first things I did to sc when I finally got
it compiled and running was to add the line idlok(stdscr, TRUE) in sc.c.
-- 
Stacey Campbell       staceyc@sco.com
{uunet,decwrl,ucscc,att,sq,altos,lotus,phoenix,sun,microsoft,xbs}!sco!staceyc