/* TUI support I/O functions.
- Copyright (C) 1998-2019 Free Software Foundation, Inc.
+ Copyright (C) 1998-2020 Free Software Foundation, Inc.
Contributed by Hewlett-Packard Company.
#include "defs.h"
#include "target.h"
-#include "event-loop.h"
+#include "gdbsupport/event-loop.h"
#include "event-top.h"
#include "command.h"
#include "top.h"
be garbled. This is implemented with a pipe that TUI reads and
readline writes to. A gdb input handler is created so that reading
the pipe is handled automatically. This will probably not work on
- non-Unix platforms. The best fix is to make readline clean enougth
+ non-Unix platforms. The best fix is to make readline clean enough
so that is never write on stdout.
Note SCz/2002-09-01: we now use more readline hooks and it seems
static int tui_readline_pipe[2];
#endif
-/* The last gdb prompt that was registered in readline.
- This may be the main gdb prompt or a secondary prompt. */
-static char *tui_rl_saved_prompt;
-
/* Print a character in the curses command window. The output is
buffered. It is up to the caller to refresh the screen if
necessary. */
static void
do_tui_putc (WINDOW *w, char c)
{
- static int tui_skip_line = -1;
-
- /* Catch annotation and discard them. We need two \032 and discard
- until a \n is seen. */
- if (c == '\032')
+ /* Expand TABs, since ncurses on MS-Windows doesn't. */
+ if (c == '\t')
{
- tui_skip_line++;
- }
- else if (tui_skip_line != 1)
- {
- tui_skip_line = -1;
- /* Expand TABs, since ncurses on MS-Windows doesn't. */
- if (c == '\t')
- {
- int col;
+ int col;
- col = getcurx (w);
- do
- {
- waddch (w, ' ');
- col++;
- }
- while ((col % 8) != 0);
+ col = getcurx (w);
+ do
+ {
+ waddch (w, ' ');
+ col++;
}
- else
- waddch (w, c);
+ while ((col % 8) != 0);
}
- else if (c == '\n')
- tui_skip_line = -1;
+ else
+ waddch (w, c);
}
/* Update the cached value of the command window's start line based on
/* Apply STYLE to W. */
-static void
-apply_style (WINDOW *w, ui_file_style style)
+void
+tui_apply_style (WINDOW *w, ui_file_style style)
{
/* Reset. */
wattron (w, A_NORMAL);
style.set_reverse (true);
}
- apply_style (w, style);
+ tui_apply_style (w, style);
return n_read;
}
style.set_fg (reverse_save_fg);
}
- apply_style (w, style);
+ tui_apply_style (w, style);
}
/* Print LENGTH characters from the buffer pointed to by BUF to the
if (tui_current_key_mode == TUI_SINGLE_KEY_MODE)
prompt = "";
else
- prompt = tui_rl_saved_prompt;
+ prompt = rl_display_prompt;
c_pos = -1;
c_line = -1;
static void
tui_prep_terminal (int notused1)
{
- /* Save the prompt registered in readline to correctly display it.
- (we can't use gdb_prompt() due to secondary prompts and can't use
- rl_prompt because it points to an alloca buffer). */
- xfree (tui_rl_saved_prompt);
- tui_rl_saved_prompt = rl_prompt != NULL ? xstrdup (rl_prompt) : NULL;
}
/* Readline callback to restore the terminal. It is called once each
return 0;
}
-/* Get a character from the command window. This is called from the
- readline package. */
+/* Main worker for tui_getc. Get a character from the command window.
+ This is called from the readline package, but wrapped in a
+ try/catch by tui_getc. */
+
static int
-tui_getc (FILE *fp)
+tui_getc_1 (FILE *fp)
{
int ch;
WINDOW *w;
return ch;
}
+/* Get a character from the command window. This is called from the
+ readline package. */
+
+static int
+tui_getc (FILE *fp)
+{
+ try
+ {
+ return tui_getc_1 (fp);
+ }
+ catch (const gdb_exception &ex)
+ {
+ /* Just in case, don't ever let an exception escape to readline.
+ This shouldn't ever happen, but if it does, print the
+ exception instead of just crashing GDB. */
+ exception_print (gdb_stderr, ex);
+
+ /* If we threw an exception, it's because we recognized the
+ character. */
+ return 0;
+ }
+}
+
/* See tui-io.h. */
gdb::unique_xmalloc_ptr<char>