all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: mohkale@kisara.moe
To: 62994@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>
Cc: Mohsin Kaleem <mohkale@kisara.moe>
Subject: bug#62994: [PATCH v4 3/3] Add support for colored underlines on tty frames
Date: Sun, 11 Feb 2024 17:15:56 +0000	[thread overview]
Message-ID: <20240211171556.597236-4-mohkale@kisara.moe> (raw)
In-Reply-To: <20240211171556.597236-1-mohkale@kisara.moe>

From: Mohsin Kaleem <mohkale@kisara.moe>

* src/term.c (turn_on_face, init_tty): Output escape sequence to set
underline color when set in the face and supported by the tty. Save
a default value for this sequence on init_tty when styled underlines
are supported.
* src/termchar.c (tty_display_info): Add an entry for the escape
sequence to set the underline color on terminal frames.
* src/xfaces.c (tty_supports_face_attributes_p, realize_tty_face):
Assert whether colored underlines are supported by the current terminal
on display-supports-face-attributes-p checks. Load and save the color
of the underline from the face spec when realizing a face.
---
 etc/NEWS       | 11 +++++++----
 src/term.c     | 11 +++++++++++
 src/termchar.h |  3 +++
 src/xfaces.c   | 16 +++++++++++++---
 4 files changed, 34 insertions(+), 7 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index d868ee773fd..73a15eb44a4 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -421,20 +421,23 @@ respectively, in addition to the existing translations 'C-x 8 / e' and
 'C-x 8 / E'.
 
 ---
-** Support for 'styled-underline' face attributes on TTY frames
+** Support for 'styled' and 'colored' underline face attributes on TTY frames
 If your terminals termcap or terminfo database entry has the 'Su' or
 'Smulx' capability defined, Emacs will now emit the prescribed escape
 sequence necessary to render faces with styled underlines on TTY
 frames.
 
 Styled underlines are any underlines containing a non-default
-underline style.  The available underline styles for TTY frames are
-'double', 'wave', 'dotted', and 'dashed'.
+underline style or a color other than the foreground-color.
+The available underline styles for TTY frames are 'double', 'wave',
+'dotted', and 'dashed'.
 
 The 'Smulx' capability should define the actual sequence needed to
 render styled underlines. If ommitted, but the 'Su' flag is defined,
 then a default sequence will be used. It's recommended to use 'Smulx'
-instead of 'Su', with priority being given to 'Smulx'.
+instead of 'Su', with priority being given to 'Smulx'.  Support for
+colored underlines is automatically enabled with a default escape
+sequence when styled underline are supported.
 
 \f
 * Changes in Specialized Modes and Packages in Emacs 30.1
diff --git a/src/term.c b/src/term.c
index 06dbb95171e..1ab6936db76 100644
--- a/src/term.c
+++ b/src/term.c
@@ -2050,6 +2050,14 @@ turn_on_face (struct frame *f, int face_id)
 	  OUTPUT (tty, p);
 	  xfree (p);
 	}
+
+      ts = tty->TF_set_underline_color;
+      if (ts && face->underline_color)
+	{
+          p = tparam (ts, NULL, 0, face->underline_color, 0, 0, 0);
+	  OUTPUT (tty, p);
+	  xfree (p);
+	}
     }
 }
 
@@ -4387,6 +4395,9 @@ init_tty (const char *name, const char *terminal_type, bool must_succeed)
   if (!tty->TF_set_underline_style && tgetflag("Su"))
     tty->TF_set_underline_style = "\x1b[4:%p1%dm";
 
+  if (tty->TF_set_underline_style)
+    tty->TF_set_underline_color = "\x1b[58:2::%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&%dm";
+
 #else /* DOS_NT */
 #ifdef WINDOWSNT
   {
diff --git a/src/termchar.h b/src/termchar.h
index 7fc1f347230..846cd3001cc 100644
--- a/src/termchar.h
+++ b/src/termchar.h
@@ -175,6 +175,9 @@ #define EMACS_TERMCHAR_H
                                            style based on the parameter. Param should
                                            be one of: 0 (none), 1 (straight), 2 (double),
                                            3 (wave), 4 (dotted), or 5 (dashed). */
+  const char *TF_set_underline_color;   /* Enabled when TF_set_underline_style is set:
+                                           Sets the color of the underline. Accepts a
+                                           single parameter, the color index. */
 
   int RPov;                     /* # chars to start a TS_repeat */
 
diff --git a/src/xfaces.c b/src/xfaces.c
index 684e72bd897..4d860540cb9 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -5469,7 +5469,7 @@ tty_supports_face_attributes_p (struct frame *f,
   if (!UNSPECIFIEDP (val))
     {
       if (STRINGP (val))
-	return false;		/* ttys can't use colored underlines */
+	test_caps |= TTY_CAP_UNDERLINE_STYLED;
       else if (EQ (CAR_SAFE (val), QCstyle))
     {
         if (!(EQ (CAR_SAFE (CDR_SAFE (val)), Qline) ||
@@ -6572,14 +6572,18 @@ realize_tty_face (struct face_cache *cache,
   underline = attrs[LFACE_UNDERLINE_INDEX];
   if (NILP (underline)) {
     face->tty_underline = FACE_NO_UNDERLINE;
+    face->underline_color = 0;
   } else if (EQ (underline, Qt)) {
     face->tty_underline = FACE_UNDER_LINE;
+    face->underline_color = 0;
   } else if (STRINGP (underline)) {
     face->tty_underline = FACE_UNDER_LINE;
+	face->underline_color = load_color (f, face, underline, LFACE_UNDERLINE_INDEX);
   } else if (CONSP (underline)) {
-    /* `(:style STYLE)'.
+    /* `(:color COLOR :style STYLE)'.
        STYLE being one of `line', `double', `wave', `dotted' or `dashed'. */
     face->tty_underline = FACE_UNDER_LINE;
+    face->underline_color = 0;
 
     while (CONSP (underline)) {
       Lisp_Object keyword, value;
@@ -6592,7 +6596,13 @@ realize_tty_face (struct face_cache *cache,
       value = XCAR (underline);
       underline = XCDR (underline);
 
-      if (EQ (keyword, QCstyle)) {
+      if (EQ (keyword, QCcolor)) {
+        if (EQ (value, Qforeground_color))
+          face->underline_color = 0;
+        else if (STRINGP (value))
+          face->underline_color = load_color (f, face, value, LFACE_UNDERLINE_INDEX);
+      }
+      else if (EQ (keyword, QCstyle)) {
         if (EQ (value, Qline))
           face->tty_underline = FACE_UNDER_LINE;
         else if (EQ (value, Qdouble))
-- 
2.43.0






  parent reply	other threads:[~2024-02-11 17:15 UTC|newest]

Thread overview: 77+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-21 14:29 bug#62994: Support styled underlines on TTY frames Mohsin Kaleem
     [not found] ` <handler.62994.B.168208734930664.ack@debbugs.gnu.org>
2023-04-21 14:34   ` bug#62994: [PATCH 0/3] Support styled underlines on tty Emacs frames mohkale
2023-04-21 14:34     ` bug#62994: [PATCH 1/3] Add face definitions for more underline styles mohkale
2023-04-21 15:58       ` Eli Zaretskii
2023-04-21 16:08         ` Mohsin Kaleem
2023-04-21 14:34     ` bug#62994: [PATCH 2/3] Add support for styled underlines on tty frames mohkale
2023-04-21 16:07       ` Eli Zaretskii
     [not found]         ` <878rel5fqr.fsf@kisara.moe>
2023-04-21 17:49           ` Eli Zaretskii
2023-04-21 18:04             ` Mohsin Kaleem
2023-04-21 18:43               ` Mohsin Kaleem
2023-04-22  7:00                 ` Eli Zaretskii
2023-04-22  9:32                   ` Mohsin Kaleem
2023-04-22  6:47               ` Eli Zaretskii
2023-04-22  9:57                 ` Mohsin Kaleem
2023-04-21 14:34     ` bug#62994: [PATCH 3/3] Add support for colored " mohkale
2023-04-21 16:12       ` Eli Zaretskii
     [not found]         ` <875y9p5fg0.fsf@kisara.moe>
2023-04-21 17:56           ` Eli Zaretskii
2023-04-21 15:52     ` bug#62994: [PATCH 0/3] Support styled underlines on tty Emacs frames Eli Zaretskii
2023-04-21 16:10       ` Mohsin Kaleem
2023-04-21 19:24   ` bug#62994: [PATCH v2 0/1] " mohkale
2023-04-21 19:24     ` bug#62994: [PATCH v2 1/1] Add support for colored and styled underlines on tty frames mohkale
2023-04-24  9:21       ` Robert Pluim
2023-04-22 10:21   ` bug#62994: [PATCH v3 0/1] Support styled underlines on tty Emacs frames mohkale
2023-04-22 10:21     ` bug#62994: [PATCH v3 1/1] Add support for colored and styled underlines on tty frames mohkale
2024-02-12  1:28       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-01-28 11:30     ` bug#62994: [PATCH v3 0/1] Support styled underlines on tty Emacs frames Mohsin Kaleem
2024-01-28 12:05       ` Eli Zaretskii
     [not found]         ` <86fryg62kh.fsf@kisara.moe>
2024-01-29 12:37           ` Eli Zaretskii
2024-02-11 17:40   ` bug#62994: [PATCH v4] Add support for colored and styled underlines on tty frames mohkale
2024-02-11 18:05   ` bug#62994: [PATCH v5] " mohkale
2024-02-11 18:07     ` Mohsin Kaleem
2024-02-12  1:43     ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-02-12 13:50       ` Eli Zaretskii
2024-02-12 14:49         ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-10 17:20           ` Mohsin Kaleem
2024-03-10 17:15       ` Mohsin Kaleem
2024-03-10 17:45         ` Eli Zaretskii
2024-03-10 18:22           ` Mohsin Kaleem
2024-03-10 18:51             ` Jim Porter
2024-03-10 19:28               ` Eli Zaretskii
2024-03-10 19:47                 ` Jim Porter
2024-03-11  2:07                 ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-10 19:27             ` Eli Zaretskii
2024-02-12 12:48     ` Eli Zaretskii
2024-03-10 18:08       ` Mohsin Kaleem
2024-03-14 10:20         ` Eli Zaretskii
2024-02-14 19:40     ` Jim Porter
2024-03-10 18:10       ` Mohsin Kaleem
2024-04-14 13:56   ` bug#62994: [PATCH v6] " mohkale
2024-04-14 14:13     ` Mohsin Kaleem
2024-04-20  8:16     ` Eli Zaretskii
2024-04-21 14:51       ` Mohsin Kaleem
2024-04-21 15:57         ` Eli Zaretskii
2024-04-21 16:09           ` Mohsin Kaleem
2024-04-21 16:11   ` bug#62994: [PATCH v7] " Mohsin Kaleem
2024-04-22  0:44     ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-04-22  6:01       ` Eli Zaretskii
2024-04-22 17:35         ` Jim Porter
2024-04-23  0:53         ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-04-23  6:02           ` Eli Zaretskii
2024-04-23  7:32             ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-04-22 17:52       ` Mohsin Kaleem
2024-04-22 17:53   ` bug#62994: [PATCH v8] " Mohsin Kaleem
2024-04-27  9:11     ` Eli Zaretskii
2024-04-29  1:04       ` Jim Porter
2024-04-29  4:52         ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-04-29  7:25           ` Eli Zaretskii
2024-04-29 11:36             ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-04-29  7:10         ` Eli Zaretskii
2024-04-30 17:53       ` Mohsin Kaleem
2024-04-30 18:20         ` Eli Zaretskii
2024-02-11 17:15 ` bug#62994: [PATCH v4 0/3] Support styled underlines on tty Emacs frames mohkale
2024-02-11 17:15   ` bug#62994: [PATCH v4 1/3] Add face definitions for more underline styles mohkale
2024-02-11 17:15   ` bug#62994: [PATCH v4 2/3] Add support for styled underlines on tty frames mohkale
2024-02-11 17:15   ` mohkale [this message]
2024-02-11 17:23   ` bug#62994: [PATCH v4 0/3] Support styled underlines on tty Emacs frames Mohsin Kaleem
2024-02-11 17:46     ` Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240211171556.597236-4-mohkale@kisara.moe \
    --to=mohkale@kisara.moe \
    --cc=62994@debbugs.gnu.org \
    --cc=eliz@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.