]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
systemctl: don't do ANSI underlining on TERM=linux (#6778)
authorLennart Poettering <lennart@poettering.net>
Sat, 9 Sep 2017 20:48:35 +0000 (22:48 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sat, 9 Sep 2017 20:48:35 +0000 (22:48 +0200)
The linux console apparently can't do underlining, hence let's not do it
on the console.

Also see: #6601

src/basic/terminal-util.c
src/basic/terminal-util.h

index 4df23ae6133eea74b37a2c5d2ba2e71d80d03c6b..64745e80632c7a6b9b68843280032df2962c5107 100644 (file)
@@ -1228,6 +1228,22 @@ bool colors_enabled(void) {
         return enabled;
 }
 
+bool underline_enabled(void) {
+        static int enabled = -1;
+
+        if (enabled < 0) {
+
+                /* The Linux console doesn't support underlining, turn it off, but only there. */
+
+                if (!colors_enabled())
+                        enabled = false;
+                else
+                        enabled = !streq_ptr(getenv("TERM"), "linux");
+        }
+
+        return enabled;
+}
+
 int vt_default_utf8(void) {
         _cleanup_free_ char *b = NULL;
         int r;
index 8c50ed0936d01b969309f208c376ac48e2049a8a..c3045eb09d909ce87fb270423c327e8ed3748db5 100644 (file)
@@ -86,6 +86,7 @@ void columns_lines_cache_reset(int _unused_ signum);
 bool on_tty(void);
 bool terminal_is_dumb(void);
 bool colors_enabled(void);
+bool underline_enabled(void);
 
 #define DEFINE_ANSI_FUNC(name, NAME)                            \
         static inline const char *ansi_##name(void) {           \
@@ -93,19 +94,28 @@ bool colors_enabled(void);
         }                                                       \
         struct __useless_struct_to_allow_trailing_semicolon__
 
-DEFINE_ANSI_FUNC(underline,                  UNDERLINE);
+#define DEFINE_ANSI_FUNC_UNDERLINE(name, NAME, REPLACEMENT)             \
+        static inline const char *ansi_##name(void) {                   \
+                return underline_enabled() ? ANSI_##NAME :              \
+                        colors_enabled() ? ANSI_##REPLACEMENT : "";     \
+        }                                                               \
+        struct __useless_struct_to_allow_trailing_semicolon__
+
+
 DEFINE_ANSI_FUNC(highlight,                  HIGHLIGHT);
-DEFINE_ANSI_FUNC(highlight_underline,        HIGHLIGHT_UNDERLINE);
 DEFINE_ANSI_FUNC(highlight_red,              HIGHLIGHT_RED);
 DEFINE_ANSI_FUNC(highlight_green,            HIGHLIGHT_GREEN);
 DEFINE_ANSI_FUNC(highlight_yellow,           HIGHLIGHT_YELLOW);
 DEFINE_ANSI_FUNC(highlight_blue,             HIGHLIGHT_BLUE);
-DEFINE_ANSI_FUNC(highlight_red_underline,    HIGHLIGHT_RED_UNDERLINE);
-DEFINE_ANSI_FUNC(highlight_green_underline,  HIGHLIGHT_GREEN_UNDERLINE);
-DEFINE_ANSI_FUNC(highlight_yellow_underline, HIGHLIGHT_YELLOW_UNDERLINE);
-DEFINE_ANSI_FUNC(highlight_blue_underline,   HIGHLIGHT_BLUE_UNDERLINE);
 DEFINE_ANSI_FUNC(normal,                     NORMAL);
 
+DEFINE_ANSI_FUNC_UNDERLINE(underline,                  UNDERLINE, NORMAL);
+DEFINE_ANSI_FUNC_UNDERLINE(highlight_underline,        HIGHLIGHT_UNDERLINE, HIGHLIGHT);
+DEFINE_ANSI_FUNC_UNDERLINE(highlight_red_underline,    HIGHLIGHT_RED_UNDERLINE, HIGHLIGHT_RED);
+DEFINE_ANSI_FUNC_UNDERLINE(highlight_green_underline,  HIGHLIGHT_GREEN_UNDERLINE, HIGHLIGHT_GREEN);
+DEFINE_ANSI_FUNC_UNDERLINE(highlight_yellow_underline, HIGHLIGHT_YELLOW_UNDERLINE, HIGHLIGHT_YELLOW);
+DEFINE_ANSI_FUNC_UNDERLINE(highlight_blue_underline,   HIGHLIGHT_BLUE_UNDERLINE, HIGHLIGHT_BLUE);
+
 int get_ctty_devnr(pid_t pid, dev_t *d);
 int get_ctty(pid_t, dev_t *_devnr, char **r);