aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2025-04-07 22:27:39 +0200
committerTom de Vries <tdevries@suse.de>2025-04-07 22:27:39 +0200
commit907c06d0e4eb0bb9b7eb712d7d1018836bb52cc4 (patch)
tree79003a7015968df746ea835fb1f5b944b4eeac78
parent2707d55e539ef323dd14a1293e762bf3d9739ee7 (diff)
downloadbinutils-907c06d0e4eb0bb9b7eb712d7d1018836bb52cc4.zip
binutils-907c06d0e4eb0bb9b7eb712d7d1018836bb52cc4.tar.gz
binutils-907c06d0e4eb0bb9b7eb712d7d1018836bb52cc4.tar.bz2
[gdb/tui] Don't try deferred curses initialization twice
I noticed that if deferred curses initialization fails, for instance when using TERM=dumb, and we try the same again, we run into the same error: ... $ TERM=dumb gdb -batch -ex "tui enable" -ex "tui enable" Cannot enable the TUI: terminal doesn't support cursor addressing [TERM=dumb] Cannot enable the TUI: terminal doesn't support cursor addressing [TERM=dumb] ... I think it's better to try deferred curses initialization only once. Fix this by changing bool tui_finish_init into a tribool, and using TRIBOOL_UNKNOWN to represent the "initialization failed" state, such that we get instead: ... $ TERM=dumb gdb -batch -ex "tui enable" -ex "tui enable" Cannot enable the TUI: terminal doesn't support cursor addressing [TERM=dumb] Cannot enable the TUI ... Tested on x86_64-linux. Approved-By: Tom Tromey <tom@tromey.com>
-rw-r--r--gdb/tui/tui.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/gdb/tui/tui.c b/gdb/tui/tui.c
index 491fcb1..9f60e87 100644
--- a/gdb/tui/tui.c
+++ b/gdb/tui/tui.c
@@ -67,7 +67,12 @@ show_tui_debug (struct ui_file *file, int from_tty,
/* Tells whether the TUI is active or not. */
bool tui_active = false;
-static bool tui_finish_init = true;
+
+/* Tells whether the TUI should do deferred curses initialization.
+ If TRIBOOL_TRUE, then yes. If TRIBOOL_FALSE. then no (because
+ initialization is already done). If TRIBOOL_UNKNOWN, then no (because
+ initialization failed). */
+static tribool tui_finish_init = TRIBOOL_TRUE;
enum tui_key_mode tui_current_key_mode = TUI_COMMAND_MODE;
@@ -392,7 +397,13 @@ tui_enable (void)
/* To avoid to initialize curses when gdb starts, there is a deferred
curses initialization. This initialization is made only once
and the first time the curses mode is entered. */
- if (tui_finish_init)
+ if (tui_finish_init == TRIBOOL_UNKNOWN)
+ {
+ /* Initialization failed before, just throw a generic error, don't try
+ again. */
+ error (_("Cannot enable the TUI"));
+ }
+ else if (tui_finish_init == TRIBOOL_TRUE)
{
WINDOW *w;
SCREEN *s;
@@ -412,6 +423,9 @@ tui_enable (void)
if (!gdb_stderr->isatty ())
error (_("Cannot enable the TUI when output is not a terminal"));
+ /* Don't try initialization again. */
+ tui_finish_init = TRIBOOL_UNKNOWN;
+
s = newterm (NULL, stdout, stdin);
#ifdef __MINGW32__
/* The MinGW port of ncurses requires $TERM to be unset in order
@@ -470,7 +484,7 @@ tui_enable (void)
tui_set_win_focus_to (tui_src_win ());
keypad (tui_cmd_win ()->handle.get (), TRUE);
wrefresh (tui_cmd_win ()->handle.get ());
- tui_finish_init = false;
+ tui_finish_init = TRIBOOL_FALSE;
}
else
{