X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftui%2Ftui-winsource.c;h=94ab8c09f6721c906974537ecc3e63b486cfa130;hb=20149b6b207ac8c2bcde6f272607109f566168a9;hp=6a72c6fe74b697b583229f86efccf38606f54690;hpb=b4ef5aeb3a1880490f9441655d9de74727c9063a;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/tui/tui-winsource.c b/gdb/tui/tui-winsource.c index 6a72c6fe74..94ab8c09f6 100644 --- a/gdb/tui/tui-winsource.c +++ b/gdb/tui/tui-winsource.c @@ -44,7 +44,8 @@ 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; @@ -72,11 +73,10 @@ void 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); } @@ -86,27 +86,22 @@ void 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); - 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; @@ -149,17 +144,14 @@ tui_update_source_windows_with_addr (struct gdbarch *gdbarch, CORE_ADDR addr) 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 (); } } @@ -187,7 +179,7 @@ tui_update_source_windows_with_line (struct symtab *s, int line) 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); @@ -198,52 +190,30 @@ tui_update_source_windows_with_line (struct symtab *s, int line) } 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 (); } } @@ -275,20 +245,20 @@ tui_show_source_line (struct tui_source_window_base *win_info, int lineno) } 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 - tui_erase_source_content (win_info); + erase_source_content (); - win_info->check_and_display_highlight_if_needed (); - win_info->refresh_window (); + check_and_display_highlight_if_needed (); + refresh_window (); } /* See tui-data.h. */ @@ -319,12 +289,12 @@ tui_source_window_base::~tui_source_window_base () } 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. */ @@ -332,10 +302,9 @@ tui_source_window_base::reset (int height, int width, void tui_source_window_base::refresh_all () { - tui_show_source_content (this); + show_source_content (); check_and_display_highlight_if_needed (); - tui_erase_exec_info_content (this); - tui_update_exec_info (this); + update_exec_info (); } /* See tui-data.h. */ @@ -343,42 +312,13 @@ tui_source_window_base::refresh_all () 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; @@ -387,7 +327,7 @@ tui_source_window_base::do_make_visible_with_new_height () 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) { @@ -408,13 +348,10 @@ tui_source_window_base::do_make_visible_with_new_height () 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. */ @@ -451,8 +388,7 @@ tui_source_window_base::refill () } 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. */ @@ -517,7 +453,7 @@ tui_update_all_breakpoint_info (struct breakpoint *being_deleted) { if (tui_update_breakpoint_info (win, being_deleted, false)) { - tui_update_exec_info (win); + win->update_exec_info (); } } } @@ -589,41 +525,22 @@ tui_update_breakpoint_info (struct tui_source_window_base *win, 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) +tui_source_window_base::update_exec_info () { - 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++) + werase (execution_info->handle); + tui_update_breakpoint_info (this, nullptr, true); + for (int i = 0; i < 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; + 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)) @@ -636,120 +553,8 @@ tui_set_exec_info_content (struct tui_source_window_base *win_info) 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); - 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 (); -} - - -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) -{ - 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) -{ - 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 (); }