SCCS-vsn: usr.bin/tn3270/sys_curses/terminal.h 4.2
SCCS-vsn: usr.bin/tn3270/sys_curses/termout.c 4.2
* 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) ( \
-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)
register int fieldattr, termattr;
register int columnsleft;
register int fieldattr, termattr;
register int columnsleft;
#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) { \
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);
/*
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;
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)) {