Reset terminal styles

This adds a function that can be used to reset terminal styles,
regardless of what style the low-level output routines currently think
is applied.

This is used to make "echo" and "printf" work properly when emitting
ANSI terminal escapes -- now gdb will reset the style at the end of
the command.

gdb/ChangeLog
2018-12-28  Tom Tromey  <tom@tromey.com>

	* utils.h (reset_terminal_style): Declare.
	* utils.c (can_emit_style_escape): New function.
	(set_output_style): Use it.
	(reset_terminal_style): New function.
	* printcmd.c (printf_command): Call reset_terminal_style.
	* cli/cli-cmds.c (echo_command): Call reset_terminal_style.
This commit is contained in:
Tom Tromey 2018-11-17 11:49:25 -07:00
parent cbe5657196
commit ef1dfa3644
5 changed files with 49 additions and 7 deletions

View File

@ -1,3 +1,12 @@
2018-12-28 Tom Tromey <tom@tromey.com>
* utils.h (reset_terminal_style): Declare.
* utils.c (can_emit_style_escape): New function.
(set_output_style): Use it.
(reset_terminal_style): New function.
* printcmd.c (printf_command): Call reset_terminal_style.
* cli/cli-cmds.c (echo_command): Call reset_terminal_style.
2018-12-28 Tom Tromey <tom@tromey.com>
* utils.h (set_output_style, fprintf_styled)

View File

@ -689,6 +689,8 @@ echo_command (const char *text, int from_tty)
printf_filtered ("%c", c);
}
reset_terminal_style (gdb_stdout);
/* Force this output to appear now. */
wrap_here ("");
gdb_flush (gdb_stdout);

View File

@ -2609,6 +2609,8 @@ static void
printf_command (const char *arg, int from_tty)
{
ui_printf (arg, gdb_stdout);
reset_terminal_style (gdb_stdout);
wrap_here ("");
gdb_flush (gdb_stdout);
}

View File

@ -1444,25 +1444,50 @@ emit_style_escape (const ui_file_style &style)
wrap_buffer.append (style.to_ansi ());
}
/* Return true if ANSI escapes can be used on STREAM. */
static bool
can_emit_style_escape (struct ui_file *stream)
{
if (stream != gdb_stdout
|| !cli_styling
|| !ui_file_isatty (stream))
return false;
const char *term = getenv ("TERM");
if (term == nullptr || !strcmp (term, "dumb"))
return false;
return true;
}
/* Set the current output style. This will affect future uses of the
_filtered output functions. */
static void
set_output_style (struct ui_file *stream, const ui_file_style &style)
{
if (stream != gdb_stdout
|| !cli_styling
|| style == desired_style
|| !ui_file_isatty (stream))
return;
const char *term = getenv ("TERM");
if (term == nullptr || !strcmp (term, "dumb"))
if (!can_emit_style_escape (stream)
|| style == desired_style)
return;
desired_style = style;
emit_style_escape (style);
}
/* See utils.h. */
void
reset_terminal_style (struct ui_file *stream)
{
if (can_emit_style_escape (stream))
{
/* Force the setting, regardless of what we think the setting
might already be. */
desired_style = ui_file_style ();
applied_style = desired_style;
wrap_buffer.append (desired_style.to_ansi ());
}
}
/* Wait, so the user can read what's on the screen. Prompt the user
to continue by pressing RETURN. 'q' is also provided because
telling users what to do in the prompt is more user-friendly than

View File

@ -439,6 +439,10 @@ extern void fputs_styled (const char *linebuffer,
const ui_file_style &style,
struct ui_file *stream);
/* Reset the terminal style to the default, if needed. */
extern void reset_terminal_style (struct ui_file *stream);
/* Display the host ADDR on STREAM formatted as ``0x%x''. */
extern void gdb_print_host_address_1 (const void *addr, struct ui_file *stream);