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);
+ 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 (win_info, gdbarch, line_or_addr.u.addr);
if (ret == TUI_FAILURE)
- {
- tui_clear_source_content (win_info);
- tui_clear_exec_info_content (win_info);
- }
+ win_info->erase_source_content ();
else
{
tui_update_breakpoint_info (win_info, nullptr, false);
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);
- 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);
}
void
-tui_clear_source_content (struct tui_source_window_base *win_info)
-{
- if (win_info != NULL)
- {
- int i;
-
- tui_erase_source_content (win_info);
- for (i = 0; i < win_info->content.size (); i++)
- {
- struct tui_source_element *element = &win_info->content[i];
-
- element->break_mode = 0;
- element->is_exec_point = false;
- }
- }
-}
-
-
-void
-tui_erase_source_content (struct tui_source_window_base *win_info)
+tui_source_window_base::do_erase_source_content (const char *str)
{
int x_pos;
- int half_width = (win_info->width - 2) / 2;
+ int half_width = (width - 2) / 2;
- if (win_info->handle != NULL)
+ content.clear ();
+ if (handle != NULL)
{
- werase (win_info->handle);
- win_info->check_and_display_highlight_if_needed ();
+ werase (handle);
+ check_and_display_highlight_if_needed ();
- 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)
+ if (strlen (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 = half_width - strlen (str);
+ mvwaddstr (handle,
+ (height / 2),
x_pos,
- (char *) no_src_str);
+ (char *) str);
- win_info->content.clear ();
- win_info->refresh_window ();
+ refresh_window ();
+
+ werase (execution_info->handle);
+ execution_info->refresh_window ();
}
}
tui_show_source_line (this, lineno);
}
else
- tui_erase_source_content (this);
+ erase_source_content ();
check_and_display_highlight_if_needed ();
refresh_window ();
}
void
-tui_source_window_base::reset (int height, int width,
- int origin_x, int origin_y)
+tui_source_window_base::resize (int height, int width,
+ int origin_x, int origin_y)
{
- tui_gen_win_info::reset (height, width - 3,
- origin_x + 3, origin_y);
- execution_info->reset (height, 3, origin_x, 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::update_tab_width ()
{
- /* We don't really change the height of any windows, but
- calling these 2 functions causes a complete regeneration
- and redisplay of the window's contents, which will take
- the new tab width into account. */
- make_invisible_and_set_new_height (height);
- make_visible_with_new_height ();
+ werase (handle);
+ rerender ();
}
-/* See tui-data.h. */
-
void
-tui_source_window_base::set_new_height (int height)
+tui_source_window_base::rerender ()
{
- execution_info->make_visible (false);
- execution_info->height = height;
- execution_info->origin.y = origin.y;
- if (height > 1)
- execution_info->viewport_height = height - 1;
- else
- execution_info->viewport_height = height;
- execution_info->viewport_height--;
-
- if (m_has_locator)
- {
- tui_locator_window *gen_win_info = tui_locator_win_info_ptr ();
- gen_win_info->make_visible (false);
- gen_win_info->origin.y = origin.y + height;
- }
-}
-
-/* See tui-data.h. */
-
-void
-tui_source_window_base::do_make_visible_with_new_height ()
-{
- execution_info->make_visible (true);
if (!content.empty ())
{
struct tui_line_or_address line_or_addr;
line_or_addr = start_line_or_addr;
tui_update_source_window (this, gdbarch,
- cursal.symtab, line_or_addr, TRUE);
+ cursal.symtab, line_or_addr);
}
else if (deprecated_safe_get_selected_frame () != NULL)
{
line.loa = LOA_ADDRESS;
find_line_pc (s, cursal.line, &line.u.addr);
}
- tui_update_source_window (this, gdbarch, s, line, TRUE);
- }
- if (m_has_locator)
- {
- tui_locator_win_info_ptr ()->make_visible (true);
- tui_show_locator_content ();
+ tui_update_source_window (this, gdbarch, s, line);
}
+ else
+ erase_source_content ();
}
/* 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. */
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_source_window_base::set_exec_info_content ()
+tui_source_window_base::update_exec_info ()
{
- tui_exec_info_content *exec_content
- = execution_info->maybe_allocate_content (height);
-
+ werase (execution_info->handle);
tui_update_breakpoint_info (this, nullptr, true);
for (int i = 0; i < content.size (); i++)
{
- tui_exec_info_content &element = exec_content[i];
- struct tui_source_element *src_element;
- tui_bp_flags mode;
-
- src_element = &content[i];
-
- memset (element, ' ', sizeof (tui_exec_info_content));
- element[TUI_EXECINFO_SIZE - 1] = 0;
+ 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. */
- mode = src_element->break_mode;
+ 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))
if (src_element->is_exec_point)
element[TUI_EXEC_POS] = '>';
- }
-}
-
-
-void
-tui_source_window_base::show_exec_info_content ()
-{
- struct tui_exec_info_window *exec_info = execution_info;
- const tui_exec_info_content *exec_content = exec_info->get_content ();
-
- werase (exec_info->handle);
- for (int cur_line = 1; cur_line <= content.size (); cur_line++)
- mvwaddstr (exec_info->handle,
- cur_line,
- 0,
- exec_content[cur_line - 1]);
- exec_info->refresh_window ();
-}
-
-
-void
-tui_clear_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 ();
-}
-/* Function to update the execution info window. */
-void
-tui_source_window_base::update_exec_info ()
-{
- set_exec_info_content ();
- show_exec_info_content ();
-}
-
-void
-tui_alloc_source_buffer (struct tui_source_window_base *win_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++)
- {
- if (win_info->content[i].line == nullptr)
- win_info->content[i].line = (char *) xmalloc (line_width);
+ mvwaddstr (execution_info->handle, i + 1, 0, element);
}
-}
-
-
-/* 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;
+ execution_info->refresh_window ();
}