}
}
+/* See tui-winsource.h. */
+
+std::string
+tui_copy_source_line (const char **ptr, int line_no, int first_col,
+ int line_width, int ndigits)
+{
+ const char *lineptr = *ptr;
+
+ /* Init the line with the line number. */
+ std::string result;
+
+ if (line_no > 0)
+ {
+ if (ndigits > 0)
+ result = string_printf ("%*d ", ndigits, line_no);
+ else
+ {
+ result = string_printf ("%-6d", line_no);
+ int len = result.size ();
+ len = len - ((len / tui_tab_width) * tui_tab_width);
+ result.append (len, ' ');
+ }
+ }
+ int column = 0;
+ char c;
+ do
+ {
+ int skip_bytes;
+
+ c = *lineptr;
+ if (c == '\033' && skip_ansi_escape (lineptr, &skip_bytes))
+ {
+ /* We always have to preserve escapes. */
+ result.append (lineptr, lineptr + skip_bytes);
+ lineptr += skip_bytes;
+ continue;
+ }
+ if (c == '\0')
+ break;
+
+ ++lineptr;
+ ++column;
+
+ auto process_tab = [&] ()
+ {
+ int max_tab_len = tui_tab_width;
+
+ --column;
+ for (int j = column % max_tab_len;
+ j < max_tab_len && column < first_col + line_width;
+ column++, j++)
+ if (column >= first_col)
+ result.push_back (' ');
+ };
+
+ /* We have to process all the text in order to pick up all the
+ escapes. */
+ if (column <= first_col || column > first_col + line_width)
+ {
+ if (c == '\t')
+ process_tab ();
+ continue;
+ }
+
+ if (c == '\n' || c == '\r' || c == '\0')
+ {
+ /* Nothing. */
+ }
+ else if (c < 040 && c != '\t')
+ {
+ result.push_back ('^');
+ result.push_back (c + 0100);
+ }
+ else if (c == 0177)
+ {
+ result.push_back ('^');
+ result.push_back ('?');
+ }
+ else if (c == '\t')
+ process_tab ();
+ else
+ result.push_back (c);
+ }
+ while (c != '\0' && c != '\n' && c != '\r');
+
+ if (c == '\r' && *lineptr == '\n')
+ ++lineptr;
+ *ptr = lineptr;
+
+ return result;
+}
+
+void
+tui_source_window_base::style_changed ()
+{
+ if (tui_active && is_visible ())
+ refill ();
+}
/* Function to display source in the source window. This function
initializes the horizontal scroll to 0. */
content.clear ();
if (handle != NULL)
{
- werase (handle);
+ werase (handle.get ());
check_and_display_highlight_if_needed ();
if (strlen (str) >= half_width)
x_pos = 1;
else
x_pos = half_width - strlen (str);
- mvwaddstr (handle,
+ mvwaddstr (handle.get (),
(height / 2),
x_pos,
(char *) str);
refresh_window ();
-
- werase (execution_info->handle);
- execution_info->refresh_window ();
}
}
line = &win_info->content[lineno - 1];
if (line->is_exec_point)
- tui_set_reverse_mode (win_info->handle, true);
+ tui_set_reverse_mode (win_info->handle.get (), true);
- wmove (win_info->handle, lineno, 1);
- tui_puts (line->line,
- win_info->handle);
+ wmove (win_info->handle.get (), lineno, TUI_EXECINFO_SIZE);
+ tui_puts (line->line.c_str (), win_info->handle.get ());
if (line->is_exec_point)
- tui_set_reverse_mode (win_info->handle, false);
+ tui_set_reverse_mode (win_info->handle.get (), false);
/* Clear to end of line but stop before the border. */
- x = getcurx (win_info->handle);
+ x = getcurx (win_info->handle.get ());
while (x + 1 < win_info->width)
{
- waddch (win_info->handle, ' ');
- x = getcurx (win_info->handle);
+ waddch (win_info->handle.get (), ' ');
+ x = getcurx (win_info->handle.get ());
}
}
void
tui_source_window_base::show_source_content ()
{
- if (!content.empty ())
- {
- int lineno;
+ gdb_assert (!content.empty ());
- for (lineno = 1; lineno <= content.size (); lineno++)
- tui_show_source_line (this, lineno);
- }
- else
- erase_source_content ();
+ for (int lineno = 1; lineno <= content.size (); lineno++)
+ tui_show_source_line (this, lineno);
check_and_display_highlight_if_needed ();
refresh_window ();
}
-/* See tui-data.h. */
-
-void
-tui_source_window_base::clear_detail ()
-{
- gdbarch = NULL;
- start_line_or_addr.loa = LOA_ADDRESS;
- start_line_or_addr.u.addr = 0;
- horizontal_offset = 0;
-}
-
tui_source_window_base::tui_source_window_base (enum tui_win_type type)
- : tui_win_info (type),
- execution_info (new tui_exec_info_window ())
+ : tui_win_info (type)
{
gdb_assert (type == SRC_WIN || type == DISASSEM_WIN);
start_line_or_addr.loa = LOA_ADDRESS;
start_line_or_addr.u.addr = 0;
-}
-
-tui_source_window_base::~tui_source_window_base ()
-{
- xfree (fullname);
- delete execution_info;
-}
-
-void
-tui_source_window_base::resize (int height, int width,
- int origin_x, int origin_y)
-{
- tui_gen_win_info::resize (height, width - 3,
- origin_x + 3, origin_y);
- execution_info->resize (height, 3, origin_x, origin_y);
+ gdb::observers::source_styling_changed.attach
+ (std::bind (&tui_source_window::style_changed, this),
+ m_observable);
}
-/* See tui-data.h. */
-
-void
-tui_source_window_base::refresh_all ()
+tui_source_window_base::~tui_source_window_base ()
{
- show_source_content ();
- check_and_display_highlight_if_needed ();
- update_exec_info ();
+ gdb::observers::source_styling_changed.detach (m_observable);
}
/* See tui-data.h. */
void
tui_source_window_base::update_tab_width ()
{
- werase (handle);
+ werase (handle.get ());
rerender ();
}
/* See tui-data.h. */
-void
-tui_source_window_base::make_visible (bool visible)
-{
- execution_info->make_visible (visible);
- tui_win_info::make_visible (visible);
-}
-
-/* See tui-data.h. */
-
-void
-tui_source_window_base::refresh_window ()
-{
- execution_info->refresh_window ();
- tui_win_info::refresh_window ();
-}
-
-/* See tui-data.h. */
-
void
tui_source_window_base::refill ()
{
for (i = 0; i < content.size (); i++)
{
- struct breakpoint *bp;
- extern struct breakpoint *breakpoint_chain;
struct tui_source_element *line;
line = &content[i];
do with it. Identify enable/disabled breakpoints as well as
those that we already hit. */
tui_bp_flags mode = 0;
- for (bp = breakpoint_chain;
- bp != NULL;
- bp = bp->next)
+ iterate_over_breakpoints ([&] (breakpoint *bp) -> bool
{
struct bp_location *loc;
|| line->line_or_addr.loa == LOA_ADDRESS);
if (bp == being_deleted)
- continue;
+ return false;
for (loc = bp->loc; loc != NULL; loc = loc->next)
{
mode |= TUI_BP_HARDWARE;
}
}
- }
+ return false;
+ });
if (line->break_mode != mode)
{
line->break_mode = mode;
void
tui_source_window_base::update_exec_info ()
{
- werase (execution_info->handle);
update_breakpoint_info (nullptr, true);
for (int i = 0; i < content.size (); i++)
{
if (src_element->is_exec_point)
element[TUI_EXEC_POS] = '>';
- mvwaddstr (execution_info->handle, i + 1, 0, element);
+ mvwaddstr (handle.get (), i + 1, 1, element);
}
- execution_info->refresh_window ();
+ refresh_window ();
}