This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Reset terminal styles


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=ef1dfa3644f02efffa11d718fe5788c05177587b

commit ef1dfa3644f02efffa11d718fe5788c05177587b
Author: Tom Tromey <tom@tromey.com>
Date:   Sat Nov 17 11:49:25 2018 -0700

    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.

Diff:
---
 gdb/ChangeLog      |  9 +++++++++
 gdb/cli/cli-cmds.c |  2 ++
 gdb/printcmd.c     |  2 ++
 gdb/utils.c        | 37 +++++++++++++++++++++++++++++++------
 gdb/utils.h        |  4 ++++
 5 files changed, 48 insertions(+), 6 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 65b3ee6..cb126ff 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,14 @@
 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)
 	(fputs_styled): Declare.
 	* utils.c (applied_style, desired_style): New globals.
diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
index 135f550..12ac74c 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 8c99918..79c3d2d 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 2fb7476..4bb2f34 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 ());
 }
 
-/* Set the current output style.  This will affect future uses of the
-   _filtered output functions.  */
+/* Return true if ANSI escapes can be used on STREAM.  */
 
-static void
-set_output_style (struct ui_file *stream, const ui_file_style &style)
+static bool
+can_emit_style_escape (struct ui_file *stream)
 {
   if (stream != gdb_stdout
       || !cli_styling
-      || style == desired_style
       || !ui_file_isatty (stream))
-    return;
+    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 (!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 9872a15..1f09ec2 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);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]