changeset 37477:6a7ab4d2c7b3

(toggle_highlight): New function. (turn_on_face): Change handling of reverse video.
author Gerd Moellmann <gerd@gnu.org>
date Wed, 25 Apr 2001 18:31:33 +0000
parents 39d5cdb9b9af
children 8f2e1bd37237
files src/term.c
diffstat 1 files changed, 50 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/term.c	Wed Apr 25 18:16:30 2001 +0000
+++ b/src/term.c	Wed Apr 25 18:31:33 2001 +0000
@@ -621,6 +621,15 @@
     }
 }
 
+static void
+toggle_highlight ()
+{
+  if (standout_mode)
+    turn_off_highlight ();
+  else
+    turn_on_highlight ();
+}
+
 
 /* Make cursor invisible.  */
 
@@ -2009,8 +2018,44 @@
      int face_id;
 {
   struct face *face = FACE_FROM_ID (f, face_id);
+  long fg = face->foreground;
+  long bg = face->background;
 
-  xassert (face != NULL);
+  /* Do this first because TS_end_standout_mode may be the same
+     as TS_exit_attribute_mode, which turns all appearances off. */
+  if (MAY_USE_WITH_COLORS_P (NC_REVERSE))
+    {
+      if (TN_max_colors > 0)
+	{
+	  if (fg >= 0 && bg >= 0)
+	    {
+	      /* If the terminal supports colors, we can set them
+		 below without using reverse video.  The face's fg
+		 and bg colors are set as they should appear on
+		 the screen, i.e. they take the inverse-video'ness
+		 of the face already into account.  */
+	    }
+	  else if (inverse_video)
+	    {
+	      if (fg == FACE_TTY_DEFAULT_FG_COLOR
+		  || bg == FACE_TTY_DEFAULT_BG_COLOR)
+		toggle_highlight ();
+	    }
+	  else
+	    {
+	      if (fg == FACE_TTY_DEFAULT_BG_COLOR
+		  || bg == FACE_TTY_DEFAULT_FG_COLOR)
+		toggle_highlight ();
+	    }
+	}
+      else
+	{
+	  /* If we can't display colors, use reverse video
+	     if the face specifies that.  */
+	  if (face->tty_reverse_p)
+	    toggle_highlight ();
+	}
+    }
 
   if (face->tty_bold_p)
     {
@@ -2036,32 +2081,20 @@
       && MAY_USE_WITH_COLORS_P (NC_UNDERLINE))
     OUTPUT1_IF (TS_enter_underline_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)
     {
       char *p;
       
-      if (face->foreground != FACE_TTY_DEFAULT_COLOR
-	  && face->foreground != FACE_TTY_DEFAULT_FG_COLOR
-	  && face->foreground != FACE_TTY_DEFAULT_BG_COLOR
-	  && TS_set_foreground)
+      if (fg >= 0 && TS_set_foreground)
 	{
-	  p = tparam (TS_set_foreground, NULL, 0, (int) face->foreground);
+	  p = tparam (TS_set_foreground, NULL, 0, (int) fg);
 	  OUTPUT (p);
 	  xfree (p);
 	}
 
-      if (face->background != FACE_TTY_DEFAULT_COLOR
-	  && face->background != FACE_TTY_DEFAULT_BG_COLOR
-	  && face->background != FACE_TTY_DEFAULT_FG_COLOR
-	  && TS_set_background)
+      if (bg >= 0 && TS_set_background)
 	{
-	  p = tparam (TS_set_background, NULL, 0, (int) face->background);
+	  p = tparam (TS_set_background, NULL, 0, (int) bg);
 	  OUTPUT (p);
 	  xfree (p);
 	}