diff options
author | Tom de Vries <tdevries@suse.de> | 2025-04-07 22:27:39 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2025-04-07 22:27:39 +0200 |
commit | 907c06d0e4eb0bb9b7eb712d7d1018836bb52cc4 (patch) | |
tree | 79003a7015968df746ea835fb1f5b944b4eeac78 | |
parent | 2707d55e539ef323dd14a1293e762bf3d9739ee7 (diff) | |
download | binutils-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.c | 20 |
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 { |