forked from Imagelibrary/binutils-gdb
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:
@@ -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 ();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user