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);
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 ();
}
/* True if styling is enabled. */
extern bool cli_styling;
+/* Check for environment variables that indicate styling should start as
+ disabled. If any are found then disable styling. Styling is never
+ enabled by this call. If styling was already disabled then it remains
+ disabled after this call. */
+extern void disable_styling_from_environment ();
+
#endif /* GDB_CLI_CLI_STYLE_H */
int save_auto_load;
int ret = 1;
- const char *no_color = getenv ("NO_COLOR");
- if (no_color != nullptr && *no_color != '\0')
- cli_styling = false;
+ /* Check for environment variables which might cause GDB to start with
+ styling disabled. */
+ disable_styling_from_environment ();
#ifdef HAVE_USEFUL_SBRK
/* Set this before constructing scoped_command_stats. */
}
}
+# Check that styling is auto-disabled when using a "dumb" terminal,
+# and/or when NO_COLOR is set.
+#
+# Also check that the user gets a warning if they enable styling in a
+# "dumb" terminal, but don't get a warning if they are in an "ansi"
+# terminal and NO_COLOR is set.
+proc test_enable_styling_warning { } {
+ save_vars { env(TERM) env(NO_COLOR) } {
+ foreach_with_prefix no_color { set unset } {
+ if { $no_color eq "set" } {
+ setenv NO_COLOR "xxx"
+ } else {
+ unset -nocomplain ::env(NO_COLOR)
+ }
+
+ foreach_with_prefix term_type { dumb unset ansi } {
+ if { $term_type eq "dumb" } {
+ setenv TERM dumb
+ } elseif { $term_type eq "unset" } {
+ unset -nocomplain ::env(TERM)
+ } elseif { $term_type eq "ansi" } {
+ setenv TERM ansi
+ }
+
+ set styling_on_re "CLI output styling is enabled\\."
+ set styling_off_re "CLI output styling is disabled\\."
+
+ if { $term_type eq "ansi" } {
+ if { $no_color eq "unset" } {
+ set init_re $styling_on_re
+ } else {
+ set init_re $styling_off_re
+ }
+ set enable_re ""
+ } else {
+ set init_re $styling_off_re
+ set enable_re \
+ "warning: The current terminal doesn't support styling\\. Styled output might not appear as expected\\."
+ }
+
+
+ clean_restart
+ gdb_test "show style enabled" $init_re
+ gdb_test "set style enabled on" $enable_re
+ }
+ }
+ }
+}
+
# Check to see if the Python styling of disassembler output is
# expected or not, this styling requires Python support in GDB, and
# the Python pygments module to be available.
test_colorsupport_256color
test_colorsupport_truecolor
test_colorsupport_truecolor_only
+
+test_enable_styling_warning
\f
-/* true if the gdb terminal supports styling, and styling is enabled. */
+/* Return true if styling is currently enabled. */
static bool
term_cli_styling ()
{
- if (!cli_styling)
- return false;
-
- 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"))
- 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 && !strcmp (term, "dumb"))
- return false;
-#endif
- return true;
+ return cli_styling;
}
\f