void
tui_display_main ()
{
- if (!tui_source_windows ().empty ())
+ auto adapter = tui_source_windows ();
+ if (adapter.begin () != adapter.end ())
{
struct gdbarch *gdbarch;
CORE_ADDR addr;
tui_update_source_window (struct tui_source_window_base *win_info,
struct gdbarch *gdbarch,
struct symtab *s,
- struct tui_line_or_address line_or_addr,
- int noerror)
+ struct tui_line_or_address line_or_addr)
{
win_info->horizontal_offset = 0;
- tui_update_source_window_as_is (win_info, gdbarch, s, line_or_addr, noerror);
-
- return;
+ tui_update_source_window_as_is (win_info, gdbarch, s, line_or_addr);
}
tui_update_source_window_as_is (struct tui_source_window_base *win_info,
struct gdbarch *gdbarch,
struct symtab *s,
- struct tui_line_or_address line_or_addr,
- int noerror)
+ struct tui_line_or_address line_or_addr)
{
enum tui_status ret;
if (win_info->type == SRC_WIN)
- ret = tui_set_source_content (win_info, s, line_or_addr.u.line_no,
- noerror);
+ ret = tui_set_source_content (win_info, s, line_or_addr.u.line_no);
else
- ret = tui_set_disassem_content (gdbarch, line_or_addr.u.addr);
+ ret = tui_set_disassem_content (win_info, gdbarch, line_or_addr.u.addr);
if (ret == TUI_FAILURE)
- {
- tui_clear_source_content (win_info, EMPTY_SOURCE_PROMPT);
- tui_clear_exec_info_content (win_info);
- }
+ win_info->erase_source_content ();
else
{
tui_update_breakpoint_info (win_info, nullptr, false);
- tui_show_source_content (win_info);
- tui_update_exec_info (win_info);
+ win_info->show_source_content ();
+ win_info->update_exec_info ();
if (win_info->type == SRC_WIN)
{
symtab_and_line sal;
tui_set_win_focus_to (win_info);
}
}
-
-
- return;
}
sal = find_pc_line (addr, 0);
l.loa = LOA_LINE;
l.u.line_no = sal.line;
- tui_show_symtab_source (TUI_SRC_WIN, gdbarch, sal.symtab, l, FALSE);
+ tui_show_symtab_source (TUI_SRC_WIN, gdbarch, sal.symtab, l);
break;
}
}
else
{
for (struct tui_source_window_base *win_info : tui_source_windows ())
- {
- tui_clear_source_content (win_info, EMPTY_SOURCE_PROMPT);
- tui_clear_exec_info_content (win_info);
- }
+ win_info->erase_source_content ();
}
}
default:
l.loa = LOA_LINE;
l.u.line_no = line;
- tui_show_symtab_source (TUI_SRC_WIN, gdbarch, s, l, FALSE);
+ tui_show_symtab_source (TUI_SRC_WIN, gdbarch, s, l);
if (tui_current_layout () == SRC_DISASSEM_COMMAND)
{
find_line_pc (s, line, &pc);
}
break;
}
-
- return;
}
void
-tui_clear_source_content (struct tui_source_window_base *win_info,
- int display_prompt)
+tui_source_window_base::do_erase_source_content (const char *str)
{
- if (win_info != NULL)
- {
- int i;
+ int x_pos;
+ int half_width = (width - 2) / 2;
- win_info->content_in_use = FALSE;
- tui_erase_source_content (win_info, display_prompt);
- for (i = 0; i < win_info->content.size (); i++)
- {
- struct tui_source_element *element = &win_info->content[i];
+ content.clear ();
+ if (handle != NULL)
+ {
+ werase (handle);
+ check_and_display_highlight_if_needed ();
- element->break_mode = 0;
- element->is_exec_point = false;
- }
- }
-}
+ if (strlen (str) >= half_width)
+ x_pos = 1;
+ else
+ x_pos = half_width - strlen (str);
+ mvwaddstr (handle,
+ (height / 2),
+ x_pos,
+ (char *) str);
+ refresh_window ();
-void
-tui_erase_source_content (struct tui_source_window_base *win_info,
- int display_prompt)
-{
- int x_pos;
- int half_width = (win_info->width - 2) / 2;
-
- if (win_info->handle != NULL)
- {
- werase (win_info->handle);
- tui_check_and_display_highlight_if_needed (win_info);
- if (display_prompt == EMPTY_SOURCE_PROMPT)
- {
- const char *no_src_str;
-
- if (win_info->type == SRC_WIN)
- no_src_str = NO_SRC_STRING;
- else
- no_src_str = NO_DISASSEM_STRING;
- if (strlen (no_src_str) >= half_width)
- x_pos = 1;
- else
- x_pos = half_width - strlen (no_src_str);
- mvwaddstr (win_info->handle,
- (win_info->height / 2),
- x_pos,
- (char *) no_src_str);
-
- /* elz: Added this function call to set the real contents of
- the window to what is on the screen, so that later calls
- to refresh, do display the correct stuff, and not the old
- image. */
-
- tui_set_source_content_nil (win_info, no_src_str);
- }
- win_info->refresh_window ();
+ werase (execution_info->handle);
+ execution_info->refresh_window ();
}
}
}
void
-tui_show_source_content (struct tui_source_window_base *win_info)
+tui_source_window_base::show_source_content ()
{
- if (!win_info->content.empty ())
+ if (!content.empty ())
{
int lineno;
- for (lineno = 1; lineno <= win_info->content.size (); lineno++)
- tui_show_source_line (win_info, lineno);
+ for (lineno = 1; lineno <= content.size (); lineno++)
+ tui_show_source_line (this, lineno);
+ }
+ else
+ erase_source_content ();
+
+ 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 ())
+{
+ 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);
+}
+
+/* See tui-data.h. */
+
+void
+tui_source_window_base::refresh_all ()
+{
+ show_source_content ();
+ check_and_display_highlight_if_needed ();
+ update_exec_info ();
+}
+
+/* See tui-data.h. */
+
+void
+tui_source_window_base::update_tab_width ()
+{
+ werase (handle);
+ rerender ();
+}
+
+void
+tui_source_window_base::rerender ()
+{
+ if (!content.empty ())
+ {
+ struct tui_line_or_address line_or_addr;
+ struct symtab_and_line cursal
+ = get_current_source_symtab_and_line ();
+
+ line_or_addr = start_line_or_addr;
+ tui_update_source_window (this, gdbarch,
+ cursal.symtab, line_or_addr);
+ }
+ else if (deprecated_safe_get_selected_frame () != NULL)
+ {
+ struct tui_line_or_address line;
+ struct symtab_and_line cursal
+ = get_current_source_symtab_and_line ();
+ struct frame_info *frame = deprecated_safe_get_selected_frame ();
+ struct gdbarch *gdbarch = get_frame_arch (frame);
+
+ struct symtab *s = find_pc_line_symtab (get_frame_pc (frame));
+ if (type == SRC_WIN)
+ {
+ line.loa = LOA_LINE;
+ line.u.line_no = cursal.line;
+ }
+ else
+ {
+ line.loa = LOA_ADDRESS;
+ find_line_pc (s, cursal.line, &line.u.addr);
+ }
+ tui_update_source_window (this, gdbarch, s, line);
}
else
- tui_erase_source_content (win_info, TRUE);
+ erase_source_content ();
+}
- tui_check_and_display_highlight_if_needed (win_info);
- win_info->refresh_window ();
- win_info->content_in_use = TRUE;
+/* 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. */
}
tui_update_source_window_as_is (this, gdbarch, s,
- content[0].line_or_addr,
- FALSE);
+ content[0].line_or_addr);
}
/* Scroll the source forward or backward horizontally. */
{
if (tui_update_breakpoint_info (win, being_deleted, false))
{
- tui_update_exec_info (win);
+ win->update_exec_info ();
}
}
}
return need_refresh;
}
-/* See tui-data.h. */
-
-tui_exec_info_content *
-tui_exec_info_window::maybe_allocate_content (int n_elements)
-{
- if (m_content == nullptr)
- m_content = XNEWVEC (tui_exec_info_content, n_elements);
- return m_content;
-}
-
-
/* Function to initialize the content of the execution info window,
based upon the input window which is either the source or
disassembly window. */
void
-tui_set_exec_info_content (struct tui_source_window_base *win_info)
-{
- if (win_info->execution_info != NULL)
- {
- tui_exec_info_content *content
- = win_info->execution_info->maybe_allocate_content (win_info->height);
-
- tui_update_breakpoint_info (win_info, nullptr, true);
- for (int i = 0; i < win_info->content.size (); i++)
- {
- tui_exec_info_content &element = content[i];
- struct tui_source_element *src_element;
- tui_bp_flags mode;
-
- src_element = &win_info->content[i];
-
- memset (element, ' ', sizeof (tui_exec_info_content));
- element[TUI_EXECINFO_SIZE - 1] = 0;
-
- /* Now update the exec info content based upon the state
- of each line as indicated by the source content. */
- mode = src_element->break_mode;
- if (mode & TUI_BP_HIT)
- element[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'H' : 'B';
- else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED))
- element[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'h' : 'b';
-
- if (mode & TUI_BP_ENABLED)
- element[TUI_BP_BREAK_POS] = '+';
- else if (mode & TUI_BP_DISABLED)
- element[TUI_BP_BREAK_POS] = '-';
-
- if (src_element->is_exec_point)
- element[TUI_EXEC_POS] = '>';
- }
- }
-}
-
-
-void
-tui_show_exec_info_content (struct tui_source_window_base *win_info)
-{
- struct tui_exec_info_window *exec_info = win_info->execution_info;
- const tui_exec_info_content *content = exec_info->get_content ();
-
- werase (exec_info->handle);
- exec_info->refresh_window ();
- for (int cur_line = 1; cur_line <= win_info->content.size (); cur_line++)
- mvwaddstr (exec_info->handle,
- cur_line,
- 0,
- content[cur_line - 1]);
- exec_info->refresh_window ();
- exec_info->content_in_use = TRUE;
-}
-
-
-void
-tui_erase_exec_info_content (struct tui_source_window_base *win_info)
-{
- struct tui_gen_win_info *exec_info = win_info->execution_info;
-
- werase (exec_info->handle);
- exec_info->refresh_window ();
-}
-
-void
-tui_clear_exec_info_content (struct tui_source_window_base *win_info)
-{
- win_info->execution_info->content_in_use = FALSE;
- tui_erase_exec_info_content (win_info);
-}
-
-/* Function to update the execution info window. */
-void
-tui_update_exec_info (struct tui_source_window_base *win_info)
-{
- tui_set_exec_info_content (win_info);
- tui_show_exec_info_content (win_info);
-}
-
-void
-tui_alloc_source_buffer (struct tui_source_window_base *win_info)
+tui_source_window_base::update_exec_info ()
{
- int i, line_width, max_lines;
-
- /* The window width/height includes the highlight box. Determine actual
- content dimensions, including string null-terminators. */
- max_lines = win_info->height - 2;
- line_width = win_info->width - 2 + 1;
-
- /* Allocate the buffer for the source lines. */
- win_info->content.resize (max_lines);
- for (i = 0; i < max_lines; i++)
+ werase (execution_info->handle);
+ tui_update_breakpoint_info (this, nullptr, true);
+ for (int i = 0; i < content.size (); i++)
{
- if (win_info->content[i].line == nullptr)
- win_info->content[i].line = (char *) xmalloc (line_width);
+ struct tui_source_element *src_element = &content[i];
+ char element[TUI_EXECINFO_SIZE] = " ";
+
+ /* Now update the exec info content based upon the state
+ of each line as indicated by the source content. */
+ tui_bp_flags mode = src_element->break_mode;
+ if (mode & TUI_BP_HIT)
+ element[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'H' : 'B';
+ else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED))
+ element[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'h' : 'b';
+
+ if (mode & TUI_BP_ENABLED)
+ element[TUI_BP_BREAK_POS] = '+';
+ else if (mode & TUI_BP_DISABLED)
+ element[TUI_BP_BREAK_POS] = '-';
+
+ if (src_element->is_exec_point)
+ element[TUI_EXEC_POS] = '>';
+
+ mvwaddstr (execution_info->handle, i + 1, 0, element);
}
+ execution_info->refresh_window ();
}
-
-
-/* Answer whether a particular line number or address is displayed
- in the current source window. */
-int
-tui_line_is_displayed (int line,
- struct tui_source_window_base *win_info,
- int check_threshold)
-{
- int is_displayed = FALSE;
- int i, threshold;
-
- if (check_threshold)
- threshold = SCROLL_THRESHOLD;
- else
- threshold = 0;
- i = 0;
- while (i < win_info->content.size () - threshold
- && !is_displayed)
- {
- is_displayed
- = win_info->content[i].line_or_addr.loa == LOA_LINE
- && win_info->content[i].line_or_addr.u.line_no == line;
- i++;
- }
-
- return is_displayed;
-}
-
-
-/* Answer whether a particular line number or address is displayed
- in the current source window. */
-int
-tui_addr_is_displayed (CORE_ADDR addr,
- struct tui_source_window_base *win_info,
- int check_threshold)
-{
- int is_displayed = FALSE;
- int i, threshold;
-
- if (check_threshold)
- threshold = SCROLL_THRESHOLD;
- else
- threshold = 0;
- i = 0;
- while (i < win_info->content.size () - threshold
- && !is_displayed)
- {
- is_displayed
- = win_info->content[i].line_or_addr.loa == LOA_ADDRESS
- && win_info->content[i].line_or_addr.u.addr == addr;
- i++;
- }
-
- return is_displayed;
-}
-
-
-/*****************************************
-** STATIC LOCAL FUNCTIONS **
-******************************************/