Fix bug with unformatted screens (sigh).
authorGregory Minshall <minshall@ucbvax.Berkeley.EDU>
Wed, 31 May 1989 13:01:42 +0000 (05:01 -0800)
committerGregory Minshall <minshall@ucbvax.Berkeley.EDU>
Wed, 31 May 1989 13:01:42 +0000 (05:01 -0800)
SCCS-vsn: usr.bin/tn3270/sys_curses/terminal.h 4.2
SCCS-vsn: usr.bin/tn3270/sys_curses/termout.c 4.2

usr/src/usr.bin/tn3270/sys_curses/terminal.h
usr/src/usr.bin/tn3270/sys_curses/termout.c

index c6dfe4f..441e9e7 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)terminal.h  4.1 (Berkeley) %G%
+ *     @(#)terminal.h  4.2 (Berkeley) %G%
  */
 
 #define        INCLUDED_TERMINAL
  */
 
 #define        INCLUDED_TERMINAL
 #define TerminalCharacterAttr(c,p,a)   (IsNonDisplayAttr(a) ? ' ':c)
 #define TerminalCharacter(c,p) TerminalCharacterAttr(c,p,FieldAttributes(p))
 
 #define TerminalCharacterAttr(c,p,a)   (IsNonDisplayAttr(a) ? ' ':c)
 #define TerminalCharacter(c,p) TerminalCharacterAttr(c,p,FieldAttributes(p))
 
+       /*
+        * Is the screen formatted?  Some algorithms change depending
+        * on whether there are any attribute bytes lying around.
+        */
+#define        TerminalFormattedScreen() \
+           ((WhereTermAttrByte(0) != 0) || ((GetTerminal(0)&ATTR_MASK) == ATTR_MASK))
+
 #define NeedToRedisplayFields(p) ((TermIsNonDisplay(p) != IsNonDisplay(p)) || \
                                (TermIsHighlighted(p) != IsHighlighted(p)))
 #define NeedToRedisplayFieldsAttr(p,c) ( \
 #define NeedToRedisplayFields(p) ((TermIsNonDisplay(p) != IsNonDisplay(p)) || \
                                (TermIsHighlighted(p) != IsHighlighted(p)))
 #define NeedToRedisplayFieldsAttr(p,c) ( \
index bdcd200..151f98a 100644 (file)
@@ -16,7 +16,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)termout.c  4.1 (Berkeley) %G%";
+static char sccsid[] = "@(#)termout.c  4.2 (Berkeley) %G%";
 #endif /* not lint */
 
 #if defined(unix)
 #endif /* not lint */
 
 #if defined(unix)
@@ -188,8 +188,10 @@ SlowScreen()
     register int fieldattr, termattr;
     register int columnsleft;
 
     register int fieldattr, termattr;
     register int columnsleft;
 
+#define        NORMAL          0               
 #define        HIGHLIGHT       1               /* Mask bits */
 #define        NONDISPLAY      4               /* Mask bits */
 #define        HIGHLIGHT       1               /* Mask bits */
 #define        NONDISPLAY      4               /* Mask bits */
+#define        UNDETERMINED    8               /* Mask bits */
 
 #define        DoAttributes(x) \
            switch (x&ATTR_DSPD_MASK) { \
 
 #define        DoAttributes(x) \
            switch (x&ATTR_DSPD_MASK) { \
@@ -298,10 +300,18 @@ SlowScreen()
            move(ScreenLine(pointer), ScreenLineOffset(pointer));
 
                /* what is the field attribute of the current position */
            move(ScreenLine(pointer), ScreenLineOffset(pointer));
 
                /* what is the field attribute of the current position */
-           fieldattr = FieldAttributes(pointer);
-           DoAttributes(fieldattr);
-           termattr = TermAttributes(pointer);
-           DoAttributes(termattr);
+           if (FormattedScreen()) {
+               fieldattr = FieldAttributes(pointer);
+               DoAttributes(fieldattr);
+           } else {
+               fieldattr = NORMAL;
+           }
+           if (TerminalFormattedScreen()) {
+               termattr = TermAttributes(pointer);
+               DoAttributes(termattr);
+           } else {
+               termattr = NORMAL;
+           }
 
            SetHighlightMode(fieldattr);
            /*
 
            SetHighlightMode(fieldattr);
            /*
@@ -326,8 +336,7 @@ SlowScreen()
                if (TermIsStartField(pointer)) {
                    is = DISP_BLANK;
                    isattr = 0;
                if (TermIsStartField(pointer)) {
                    is = DISP_BLANK;
                    isattr = 0;
-                   termattr = GetTerminal(pointer);
-                   DoAttributes(termattr);
+                   termattr = UNDETERMINED; /* Need to find out AFTER update */
                } else {
                    if (termattr&NONDISPLAY) {
                        is = DISP_BLANK;
                } else {
                    if (termattr&NONDISPLAY) {
                        is = DISP_BLANK;
@@ -350,8 +359,23 @@ SlowScreen()
                DoCharacterAt(shouldbe, pointer);
                if (IsStartField(pointer)) {
                    TermNewField(pointer, FieldAttributes(pointer));
                DoCharacterAt(shouldbe, pointer);
                if (IsStartField(pointer)) {
                    TermNewField(pointer, FieldAttributes(pointer));
+                   termattr = GetTerminal(pointer);
+                   DoAttributes(termattr);
                } else {
                    SetTerminal(pointer, GetHost(pointer));
                } else {
                    SetTerminal(pointer, GetHost(pointer));
+                   /*
+                    * If this USED to be a start field location,
+                    * recompute the terminal attributes.
+                    */
+                   if (termattr == UNDETERMINED) {
+                       termattr = WhereTermAttrByte(pointer);
+                       if ((termattr != 0) || TermIsStartField(0)) {
+                           termattr = GetTerminal(termattr);
+                           DoAttributes(termattr);
+                       } else {        /* Unformatted screen */
+                           termattr = NORMAL;
+                       }
+                   }
                }
                pointer = ScreenInc(pointer);
                if (!(--columnsleft)) {
                }
                pointer = ScreenInc(pointer);
                if (!(--columnsleft)) {