(TN_no_color_video): New variable.
authorGerd Moellmann <gerd@gnu.org>
Sat, 1 Apr 2000 13:33:12 +0000 (13:33 +0000)
committerGerd Moellmann <gerd@gnu.org>
Sat, 1 Apr 2000 13:33:12 +0000 (13:33 +0000)
(term_init): Intitialize TN_no_color_video.
(enum no_color_bit): New enumeration.
(MAY_USE_WITH_COLORS_P): New macro.
(turn_on_face): Use it to determine if attributes may be used
combined with colors.

src/term.c

index ae82907..5ee9428 100644 (file)
@@ -268,6 +268,27 @@ char *TS_cursor_invisible; /* "vi" */
 char *TS_set_window;           /* "wi" (4 params, start and end of window,
                                   each as vpos and hpos) */
 
+/* Value of the "NC" (no_color_video) capability, or 0 if not
+   present.  */
+
+static int TN_no_color_video;
+
+/* Meaning of bits in no_color_video.  Each bit set means that the
+   corresponding attribute cannot be combined with colors.  */
+
+enum no_color_bit
+{
+  NC_STANDOUT   = 1 << 0,
+  NC_UNDERLINE  = 1 << 1,
+  NC_REVERSE    = 1 << 2,
+  NC_BLINK      = 1 << 3,
+  NC_DIM        = 1 << 4,
+  NC_BOLD       = 1 << 5,
+  NC_INVIS      = 1 << 6,
+  NC_PROTECT    = 1 << 7,
+  NC_ALT_CHARSET = 1 << 8
+};
+
 /* "md" -- turn on bold (extra bright mode).  */
 
 char *TS_enter_bold_mode;
@@ -1934,6 +1955,15 @@ estimate_mode_line_height (f, face_id)
                                Faces
  ***********************************************************************/
 
+/* Value is non-zero if attribute ATTR may be used.  ATTR should be
+   one of the enumerators from enum no_color_bit, or a bit set built
+   from them.  Some display attributes may not be used together with
+   color; the termcap capability `NC' specifies which ones.  */
+
+#define MAY_USE_WITH_COLORS_P(ATTR)            \
+     (TN_max_colors > 0                                \
+      ? (TN_no_color_video & (ATTR)) == 0      \
+      : 1)
 
 /* Turn appearances of face FACE_ID on tty frame F on.  */
 
@@ -1947,26 +1977,34 @@ turn_on_face (f, face_id)
   xassert (face != NULL);
 
   if (face->tty_bold_p)
-    OUTPUT1_IF (TS_enter_bold_mode);
+    {
+      if (MAY_USE_WITH_COLORS_P (NC_BOLD))
+       OUTPUT1_IF (TS_enter_bold_mode);
+    }
   else if (face->tty_dim_p)
-    OUTPUT1_IF (TS_enter_dim_mode);
+    if (MAY_USE_WITH_COLORS_P (NC_DIM))
+      OUTPUT1_IF (TS_enter_dim_mode);
 
   /* Alternate charset and blinking not yet used.  */
-  if (face->tty_alt_charset_p)
+  if (face->tty_alt_charset_p
+      && MAY_USE_WITH_COLORS_P (NC_ALT_CHARSET))
     OUTPUT1_IF (TS_enter_alt_charset_mode);
 
-  if (face->tty_blinking_p)
+  if (face->tty_blinking_p
+      && MAY_USE_WITH_COLORS_P (NC_BLINK))
     OUTPUT1_IF (TS_enter_blink_mode);
 
   if (face->tty_underline_p
       /* Don't underline if that's difficult.  */
-      && TN_magic_cookie_glitch_ul <= 0)
+      && TN_magic_cookie_glitch_ul <= 0
+      && MAY_USE_WITH_COLORS_P (NC_UNDERLINE))
     OUTPUT1_IF (TS_enter_underline_mode);
 
-  if (face->tty_reverse_p
-      || face->foreground == FACE_TTY_DEFAULT_BG_COLOR
-      || face->background == FACE_TTY_DEFAULT_FG_COLOR)
-    OUTPUT1_IF (TS_enter_reverse_mode);
+  if (MAY_USE_WITH_COLORS_P (NC_REVERSE))
+    if (face->tty_reverse_p
+       || face->foreground == FACE_TTY_DEFAULT_BG_COLOR
+       || face->background == FACE_TTY_DEFAULT_FG_COLOR)
+      OUTPUT1_IF (TS_enter_reverse_mode);
 
   if (TN_max_colors > 0)
     {
@@ -2237,8 +2275,13 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
          TS_set_foreground = tgetstr ("Sf", address);
          TS_set_background = tgetstr ("Sb", address);
        }
+      
       TN_max_colors = tgetnum ("Co");
       TN_max_pairs = tgetnum ("pa");
+      
+      TN_no_color_video = tgetnum ("NC");
+      if (TN_no_color_video == -1)
+       TN_no_color_video = 0;
     }
 
   MagicWrap = tgetflag ("xn");