From 87c9b0289d73382cc72adb84d221b0a8ceb33ef8 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Wed, 26 Jul 2023 13:31:53 +0200 Subject: [PATCH] [gdb/tui] Fix secondary prompt With CLI, a session defining a command looks like: ... (gdb) define foo Type commands for definition of "foo". End with a line saying just "end". >bar >end (gdb) ... With TUI however, we get the same secondary prompts, and type the same, but are left with: ... (gdb) define foo Type commands for definition of "foo". End with a line saying just "end". (gdb) ... Fix this by calling tui_inject_newline_into_command_window in gdb_readline_wrapper_line, as is done in tui_command_line_handler. Tested on x86_64-linux. PR tui/30636 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30636 --- gdb/testsuite/gdb.tui/secondary-prompt.exp | 38 ++++++++++++++++++++++ gdb/top.c | 6 ++++ 2 files changed, 44 insertions(+) create mode 100644 gdb/testsuite/gdb.tui/secondary-prompt.exp diff --git a/gdb/testsuite/gdb.tui/secondary-prompt.exp b/gdb/testsuite/gdb.tui/secondary-prompt.exp new file mode 100644 index 00000000000..99fedaa3e47 --- /dev/null +++ b/gdb/testsuite/gdb.tui/secondary-prompt.exp @@ -0,0 +1,38 @@ +# Copyright 2023 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +require allow_tui_tests + +tuiterm_env + +Term::clean_restart 24 80 + +if {![Term::enter_tui]} { + unsupported "TUI not supported" + return +} + +# Define a macro. +send_gdb "define foo\n" +send_gdb "bar\n" +send_gdb "end\n" + +# Wait for the last secondary prompt to appear, followed by the gdb prompt. +Term::wait_for ">end" + +# Regression test for PR tui/30636. Make sure the secondary prompts are not +# overwritten. +Term::check_region_contents "secondary prompt not overwritten" 0 19 80 2 \ + "^>bar *\r\n>end *$" diff --git a/gdb/top.c b/gdb/top.c index 90ddc5f5ea7..2322e55f1db 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -77,6 +77,7 @@ #if defined(TUI) # include "tui/tui.h" +# include "tui/tui-io.h" #endif #ifndef O_NOCTTY @@ -958,6 +959,11 @@ gdb_readline_wrapper_line (gdb::unique_xmalloc_ptr &&line) saved_after_char_processing_hook = after_char_processing_hook; after_char_processing_hook = NULL; +#if defined(TUI) + if (tui_active) + tui_inject_newline_into_command_window (); +#endif + /* Prevent parts of the prompt from being redisplayed if annotations are enabled, and readline's state getting out of sync. We'll reinstall the callback handler, which puts the terminal in raw -- 2.30.2