diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 65b3ee69890..cb126ff65d0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2018-12-28 Tom Tromey + + * 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 * utils.h (set_output_style, fprintf_styled) diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c index 135f550b801..12ac74c7e95 100644 --- a/gdb/cli/cli-cmds.c +++ b/gdb/cli/cli-cmds.c @@ -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); diff --git a/gdb/printcmd.c b/gdb/printcmd.c index 8c999188d71..79c3d2d2ffb 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -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); } diff --git a/gdb/utils.c b/gdb/utils.c index 2fb7476a35a..4bb2f34fc9a 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -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 diff --git a/gdb/utils.h b/gdb/utils.h index 9872a15fd7f..1f09ec2d471 100644 --- a/gdb/utils.h +++ b/gdb/utils.h @@ -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);