aboutsummaryrefslogtreecommitdiff
path: root/gdb/terminal.h
diff options
context:
space:
mode:
authorPatrick Palka <patrick@parcs.ath.cx>2014-11-22 14:12:49 -0500
committerPatrick Palka <patrick@parcs.ath.cx>2015-01-07 09:02:07 -0500
commit6a06d66006d33293215eaf706ee416f6a99da273 (patch)
tree83411c66f901029094b7c967db1f514fc7c8e293 /gdb/terminal.h
parent8d983e3645b62e72373b3ba4a9af548b82fb43bc (diff)
downloadfsf-binutils-gdb-6a06d66006d33293215eaf706ee416f6a99da273.zip
fsf-binutils-gdb-6a06d66006d33293215eaf706ee416f6a99da273.tar.gz
fsf-binutils-gdb-6a06d66006d33293215eaf706ee416f6a99da273.tar.bz2
Don't propagate our current terminal state to the inferior
Currently when we start an inferior we have the inferior inherit our terminal state. Under TUI, our terminal is highly modified by ncurses and readline. So when starting an inferior under TUI, the inferior will have a highly modified terminal state which will interfere with standard I/O. For example, $ gdb gdb (gdb) break main (gdb) run (gdb) print puts ("a\nb") a b $1 = 4 (gdb) [enter TUI mode] (gdb) run (gdb) [exit TUI mode] (gdb) print puts ("a\nb") a b $2 = 4 (gdb) print puts ("a\r\nb\r") a b $3 = 6 As you can see, when we start the inferior under the regular interface, puts() prints the text properly. But when we start the inferior under TUI, puts() does not print the text properly. This is because when we start the inferior under TUI it inherits our current terminal state which has been modified by ncurses to, among other things, require an explicit \r\n to print a new line. As a result the inferior performs standard I/O in an unexpected way. Because of this discrepancy, it doesn't seem like a good idea to have the inferior inherit our _current_ terminal state for it may have been modified by readline and/or ncurses. Instead, we should have the inferior inherit a pristine snapshot of our terminal state taken before readline or ncurses have had a chance to alter it. This enables the inferior to run in a more accurate way, more closely mimicking the program's behavior had it run standalone. And it fixes the above mentioned issue. Tested on x86_64-unknown-linux-gnu. gdb/ChangeLog: * terminal.h (set_initial_gdb_ttystate): Declare. * inflow.c (initial_gdb_ttystate): New static variable. (set_initial_gdb_ttystate): New setter. (child_terminal_init_with_pgrp): Copy initial_gdb_ttystate instead of our current terminal state. * top.c (gdb_init): Call set_initial_gdb_ttystate.
Diffstat (limited to 'gdb/terminal.h')
-rw-r--r--gdb/terminal.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/gdb/terminal.h b/gdb/terminal.h
index ae25c98..17acde2 100644
--- a/gdb/terminal.h
+++ b/gdb/terminal.h
@@ -103,6 +103,8 @@ extern int gdb_has_a_terminal (void);
extern void gdb_save_tty_state (void);
+extern void set_initial_gdb_ttystate (void);
+
/* Set the process group of the caller to its own pid, or do nothing
if we lack job control. */
extern int gdb_setpgid (void);