]> git.eshelyaron.com Git - emacs.git/commitdiff
TTY Support for ECMA-48 strike-through graphic rendition
authorMike Hamrick <mikeh@muppetlabs.com>
Sun, 13 Sep 2020 22:52:24 +0000 (15:52 -0700)
committerEli Zaretskii <eliz@gnu.org>
Fri, 18 Sep 2020 08:31:12 +0000 (11:31 +0300)
* term.c: Support strike-through in capable terminals.
(no_color_bit): Replace unused NC_INVIS with
NC_STRIKE_THROUGH.
(turn_on_face): Output via TS_enter_strike_through_mode
if available.
(turn_off_face): Handle strike-through case.
(tty_capable_p, init_tty): Support strike-through.
* termchar.h (struct tty_display_info): Add field for
strike-through.
* xfaces.c (tty_supports_face_attributes_p, realize_tty_face):
Handle strike-through case.
* dispextern.h: Add TTY_CAP_STRIKE_THROUGH definition.
(struct face): Add field tty_strike_through_p.

etc/NEWS
src/dispextern.h
src/term.c
src/termchar.h
src/xfaces.c

index 3a7180cacf2a9d9b80a58d5a5ac753d0cb558825..54bad068f8573e5571c62fa9e5647f7ea68ca6e7 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -85,6 +85,13 @@ useful on systems such as FreeBSD which ships only with "etc/termcap".
 \f
 * Changes in Emacs 28.1
 
+---
+** Support for the 'strike-through' face attribute on TTY frames.
+If your terminal's termcap or terminfo database entry has the 'smxx'
+capability defined, Emacs will now emit the prescribed escape
+sequences necessary to render faces with the 'strike-through'
+attribute on TTY frames.
+
 +++
 *** Emacs now defaults to UTF-8 instead of ISO-8859-1.
 This is only for the default, where the user has set no 'LANG' (or
index 956ca96eb619f6e31cf13e0dbf98740fe517f759..e20f7bb7b6c07fc3ebc77f50572bffce3cd109f9 100644 (file)
@@ -1744,6 +1744,7 @@ struct face
   bool_bf tty_italic_p : 1;
   bool_bf tty_underline_p : 1;
   bool_bf tty_reverse_p : 1;
+  bool_bf tty_strike_through_p : 1;
 
   /* True means that colors of this face may not be freed because they
      have been copied bitwise from a base face (see
@@ -3290,6 +3291,7 @@ enum tool_bar_item_image
 #define TTY_CAP_BOLD           0x04
 #define TTY_CAP_DIM            0x08
 #define TTY_CAP_ITALIC         0x10
+#define TTY_CAP_STRIKE_THROUGH 0x20
 
 \f
 /***********************************************************************
index 5cbb092ad177e98658495a00e292004401c14fa1..22035f4fe3ac23df4a790c50970e3f040dac33ea 100644 (file)
@@ -105,14 +105,14 @@ struct tty_display_info *tty_list;
 
 enum no_color_bit
 {
-  NC_STANDOUT   = 1 << 0,
-  NC_UNDERLINE  = 1 << 1,
-  NC_REVERSE    = 1 << 2,
-  NC_ITALIC     = 1 << 3,
-  NC_DIM        = 1 << 4,
-  NC_BOLD       = 1 << 5,
-  NC_INVIS      = 1 << 6,
-  NC_PROTECT    = 1 << 7
+  NC_STANDOUT           = 1 << 0,
+  NC_UNDERLINE          = 1 << 1,
+  NC_REVERSE            = 1 << 2,
+  NC_ITALIC             = 1 << 3,
+  NC_DIM                = 1 << 4,
+  NC_BOLD               = 1 << 5,
+  NC_STRIKE_THROUGH     = 1 << 6,
+  NC_PROTECT            = 1 << 7
 };
 
 /* internal state */
@@ -1931,6 +1931,9 @@ turn_on_face (struct frame *f, int face_id)
   if (face->tty_underline_p && MAY_USE_WITH_COLORS_P (tty, NC_UNDERLINE))
     OUTPUT1_IF (tty, tty->TS_enter_underline_mode);
 
+  if (face->tty_strike_through_p && MAY_USE_WITH_COLORS_P (tty, NC_STRIKE_THROUGH))
+    OUTPUT1_IF (tty, tty->TS_enter_strike_through_mode);
+
   if (tty->TN_max_colors > 0)
     {
       const char *ts;
@@ -1971,7 +1974,8 @@ turn_off_face (struct frame *f, int face_id)
       if (face->tty_bold_p
          || face->tty_italic_p
          || face->tty_reverse_p
-         || face->tty_underline_p)
+         || face->tty_underline_p
+         || face->tty_strike_through_p)
        {
          OUTPUT1_IF (tty, tty->TS_exit_attribute_mode);
          if (strcmp (tty->TS_exit_attribute_mode, tty->TS_end_standout_mode) == 0)
@@ -2006,11 +2010,12 @@ tty_capable_p (struct tty_display_info *tty, unsigned int caps)
   if ((caps & (cap)) && (!(TS) || !MAY_USE_WITH_COLORS_P(tty, NC_bit)))        \
     return 0;
 
-  TTY_CAPABLE_P_TRY (tty, TTY_CAP_INVERSE,     tty->TS_standout_mode,          NC_REVERSE);
-  TTY_CAPABLE_P_TRY (tty, TTY_CAP_UNDERLINE,   tty->TS_enter_underline_mode,   NC_UNDERLINE);
-  TTY_CAPABLE_P_TRY (tty, TTY_CAP_BOLD,        tty->TS_enter_bold_mode,        NC_BOLD);
-  TTY_CAPABLE_P_TRY (tty, TTY_CAP_DIM,                 tty->TS_enter_dim_mode,         NC_DIM);
-  TTY_CAPABLE_P_TRY (tty, TTY_CAP_ITALIC,      tty->TS_enter_italic_mode,      NC_ITALIC);
+  TTY_CAPABLE_P_TRY (tty, TTY_CAP_INVERSE,       tty->TS_standout_mode,                NC_REVERSE);
+  TTY_CAPABLE_P_TRY (tty, TTY_CAP_UNDERLINE,     tty->TS_enter_underline_mode,         NC_UNDERLINE);
+  TTY_CAPABLE_P_TRY (tty, TTY_CAP_BOLD,                  tty->TS_enter_bold_mode,              NC_BOLD);
+  TTY_CAPABLE_P_TRY (tty, TTY_CAP_DIM,           tty->TS_enter_dim_mode,               NC_DIM);
+  TTY_CAPABLE_P_TRY (tty, TTY_CAP_ITALIC,        tty->TS_enter_italic_mode,            NC_ITALIC);
+  TTY_CAPABLE_P_TRY (tty, TTY_CAP_STRIKE_THROUGH, tty->TS_enter_strike_through_mode,   NC_STRIKE_THROUGH);
 
   /* We can do it!  */
   return 1;
@@ -4124,6 +4129,7 @@ use the Bourne shell command 'TERM=...; export TERM' (C-shell:\n\
   tty->TS_enter_alt_charset_mode = tgetstr ("as", address);
   tty->TS_exit_alt_charset_mode = tgetstr ("ae", address);
   tty->TS_exit_attribute_mode = tgetstr ("me", address);
+  tty->TS_enter_strike_through_mode = tgetstr ("smxx", address);
 
   MultiUp (tty) = tgetstr ("UP", address);
   MultiDown (tty) = tgetstr ("DO", address);
index c96b81913b0a4a0d82a65ec59f6fb353dc515a4d..a8b30517677799a5ddd33e6a177953ca4368a514 100644 (file)
@@ -136,6 +136,7 @@ struct tty_display_info
   const char *TS_enter_reverse_mode; /* "mr" -- enter reverse video mode.  */
   const char *TS_exit_underline_mode; /* "us" -- start underlining.  */
   const char *TS_enter_underline_mode; /* "ue" -- end underlining.  */
+  const char *TS_enter_strike_through_mode; /* "smxx" -- turn on strike-through mode.  */
 
   /* "as"/"ae" -- start/end alternate character set.  Not really
      supported, yet.  */
index 06d2f994de622bc2100fd4b3b6f3c3225ad2e4ea..73a536b19c6f37041957b17a7012fd10f21ae308 100644 (file)
@@ -5217,7 +5217,6 @@ tty_supports_face_attributes_p (struct frame *f,
       || !UNSPECIFIEDP (attrs[LFACE_HEIGHT_INDEX])
       || !UNSPECIFIEDP (attrs[LFACE_SWIDTH_INDEX])
       || !UNSPECIFIEDP (attrs[LFACE_OVERLINE_INDEX])
-      || !UNSPECIFIEDP (attrs[LFACE_STRIKE_THROUGH_INDEX])
       || !UNSPECIFIEDP (attrs[LFACE_BOX_INDEX]))
     return false;
 
@@ -5282,6 +5281,15 @@ tty_supports_face_attributes_p (struct frame *f,
        test_caps |= TTY_CAP_INVERSE;
     }
 
+  /* strike through */
+  val = attrs[LFACE_STRIKE_THROUGH_INDEX];
+  if (!UNSPECIFIEDP (val))
+    {
+      if (face_attr_equal_p (val, def_attrs[LFACE_STRIKE_THROUGH_INDEX]))
+       return false;           /* same as default */
+      else
+       test_caps |= TTY_CAP_STRIKE_THROUGH;
+    }
 
   /* Color testing.  */
 
@@ -6244,6 +6252,8 @@ realize_tty_face (struct face_cache *cache,
     face->tty_underline_p = true;
   if (!NILP (attrs[LFACE_INVERSE_INDEX]))
     face->tty_reverse_p = true;
+  if (!NILP (attrs[LFACE_STRIKE_THROUGH_INDEX]))
+    face->tty_strike_through_p = true;
 
   /* Map color names to color indices.  */
   map_tty_color (f, face, LFACE_FOREGROUND_INDEX, &face_colors_defaulted);