gdb/styling: only check TERM environment once, during initialisation

We currently check the TERM environment variable any time we call one
of the ui_file::can_emit_style_escape() functions.  This seems
excessive.

During GDB's startup we also check for the NO_COLOR environment
variable and disable styling if this is set.

I propose that we combine these two checks, and perform them just once
during startup (as the current NO_COLOR check is currently done).  As
with the NO_COLOR check, if the TERM variable is set to "dumb"
indicating that styling is not supported then we should just set
cli_styling to false.

This does mean that the user can then 'set style enabled on', even for
a dumb terminal, which was not possible previously.  Before this
commit the "dumb" terminal check was separate and would prevent
styling even if 'set style enabled on' was in effect.

Of course, trying to turn on styling in a dumb terminal might not give
the results that a user hope for.  And so, I have implemented a check
in `set_style_enabled`, so in a dumb terminal a user will see this:

  (gdb) set style enabled on
  warning: The current terminal doesn't support styling.  Styled output might not appear as expected.

After which GDB will try to emit styling.  We could, potentially,
prevent styling being enabled instead of emitting a warning, but I'm
inclined to let the user turn on styling if they really want to.

Approved-By: Kevin Buettner <kevinb@redhat.com>
Acked-By: Tom Tromey <tom@tromey.com>
This commit is contained in:
Andrew Burgess
2025-02-17 10:21:12 +00:00
parent dbfac07a71
commit 431b369e1c
5 changed files with 113 additions and 21 deletions

View File

@@ -51,6 +51,46 @@ static const char * const cli_intensities[] = {
nullptr
};
/* Return true if GDB's output terminal should support styling, otherwise,
return false. This function really checks for things that indicate
styling might not be supported, so a return value of false indicates
we've seen something to indicate we should not perform styling. A
return value of true is the default. */
static bool
terminal_supports_styling ()
{
const char *term = getenv ("TERM");
/* Windows doesn't by default define $TERM, but can support styles
regardless. */
#ifndef _WIN32
if (term == nullptr || strcmp (term, "dumb") == 0)
return false;
#else
/* But if they do define $TERM, let us behave the same as on Posix
platforms, for the benefit of programs which invoke GDB as their
back-end. */
if (term != nullptr && strcmp (term, "dumb") == 0)
return false;
#endif
return true;
}
/* See cli/cli-style.h. */
void
disable_styling_from_environment ()
{
const char *no_color = getenv ("NO_COLOR");
if (no_color != nullptr && *no_color != '\0')
cli_styling = false;
if (!terminal_supports_styling ())
cli_styling = false;
}
/* See cli-style.h. */
cli_style_option file_name_style ("filename", ui_file_style::GREEN);
@@ -286,6 +326,17 @@ static cmd_list_element *style_disasm_show_list;
static void
set_style_enabled (const char *args, int from_tty, struct cmd_list_element *c)
{
/* This finds the 'set style enabled' command. */
struct cmd_list_element *set_style_enabled_cmd
= lookup_cmd_exact ("enabled", style_set_list);
/* If the user does 'set style enabled on', but the terminal doesn't
appear to support styling, then warn the user. */
if (c == set_style_enabled_cmd && cli_styling
&& !terminal_supports_styling ())
warning ("The current terminal doesn't support styling. Styled output "
"might not appear as expected.");
g_source_cache.clear ();
gdb::observers::styling_changed.notify ();
}