X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Ftui%2Ftui-regs.c;h=50b3e72e51037f27c6406c1ce9cd21ab6ab00cd2;hb=cbfa85811792ca8e96ace40bef0aaaf507e54bcc;hp=98096e2cdc4881562ca845cc28fb4fd27c186ea8;hpb=89df7f9056d72418720ac655e1ad97decc471da9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c index 98096e2cdc..50b3e72e51 100644 --- a/gdb/tui/tui-regs.c +++ b/gdb/tui/tui-regs.c @@ -1,6 +1,6 @@ /* TUI display registers in window. - Copyright (C) 1998-2019 Free Software Foundation, Inc. + Copyright (C) 1998-2020 Free Software Foundation, Inc. Contributed by Hewlett-Packard Company. @@ -42,8 +42,6 @@ #include "gdb_curses.h" -static void tui_display_register (struct tui_data_item_window *data); - /* Get the register from the frame and return a printable representation of it. */ @@ -98,8 +96,8 @@ tui_get_register (struct frame_info *frame, int tui_data_window::last_regs_line_no () const { - int num_lines = regs_content.size () / regs_column_count; - if (regs_content.size () % regs_column_count) + int num_lines = m_regs_content.size () / m_regs_column_count; + if (m_regs_content.size () % m_regs_column_count) num_lines++; return num_lines; } @@ -109,14 +107,14 @@ tui_data_window::last_regs_line_no () const int tui_data_window::line_from_reg_element_no (int element_no) const { - if (element_no < regs_content.size ()) + if (element_no < m_regs_content.size ()) { int i, line = (-1); i = 1; while (line == (-1)) { - if (element_no < regs_column_count * i) + if (element_no < m_regs_column_count * i) line = i - 1; else i++; @@ -133,8 +131,8 @@ tui_data_window::line_from_reg_element_no (int element_no) const int tui_data_window::first_reg_element_no_inline (int line_no) const { - if (line_no * regs_column_count <= regs_content.size ()) - return ((line_no + 1) * regs_column_count) - regs_column_count; + if (line_no * m_regs_column_count <= m_regs_content.size ()) + return ((line_no + 1) * m_regs_column_count) - m_regs_column_count; else return (-1); } @@ -150,30 +148,31 @@ tui_data_window::show_registers (struct reggroup *group) if (target_has_registers && target_has_stack && target_has_memory) { show_register_group (group, get_selected_frame (NULL), - group == current_group); + group == m_current_group); /* Clear all notation of changed values. */ - for (auto &&data_item_win : regs_content) + for (auto &&data_item_win : m_regs_content) data_item_win.highlight = false; - current_group = group; - rerender (); + m_current_group = group; } else { - current_group = 0; - erase_data_content (_("[ Register Values Unavailable ]")); + m_current_group = 0; + m_regs_content.clear (); } + + rerender (); } /* Set the data window to display the registers of the register group using the given frame. Values are refreshed only when - refresh_values_only is TRUE. */ + refresh_values_only is true. */ void tui_data_window::show_register_group (struct reggroup *group, struct frame_info *frame, - int refresh_values_only) + bool refresh_values_only) { struct gdbarch *gdbarch = get_frame_arch (frame); int nr_regs; @@ -201,7 +200,7 @@ tui_data_window::show_register_group (struct reggroup *group, nr_regs++; } - regs_content.resize (nr_regs); + m_regs_content.resize (nr_regs); /* Now set the register names and values. */ pos = 0; @@ -220,7 +219,7 @@ tui_data_window::show_register_group (struct reggroup *group, if (name == 0 || *name == '\0') continue; - data_item_win = ®s_content[pos]; + data_item_win = &m_regs_content[pos]; if (data_item_win) { if (!refresh_values_only) @@ -243,7 +242,7 @@ tui_data_window::display_registers_from (int start_element_no) int j, item_win_width, cur_y; int max_len = 0; - for (auto &&data_item_win : regs_content) + for (auto &&data_item_win : m_regs_content) { const char *p; int len; @@ -259,49 +258,23 @@ tui_data_window::display_registers_from (int start_element_no) item_win_width = max_len + 1; int i = start_element_no; - regs_column_count = (width - 2) / item_win_width; - if (regs_column_count == 0) - regs_column_count = 1; - item_win_width = (width - 2) / regs_column_count; + m_regs_column_count = (width - 2) / item_win_width; + if (m_regs_column_count == 0) + m_regs_column_count = 1; + item_win_width = (width - 2) / m_regs_column_count; /* Now create each data "sub" window, and write the display into it. */ cur_y = 1; - while (i < regs_content.size () - && cur_y <= viewport_height) + while (i < m_regs_content.size () && cur_y <= height - 2) { for (j = 0; - j < regs_column_count && i < regs_content.size (); + j < m_regs_column_count && i < m_regs_content.size (); j++) { - struct tui_data_item_window *data_item_win; - /* Create the window if necessary. */ - data_item_win = ®s_content[i]; - if (data_item_win->handle != NULL - && (data_item_win->height != 1 - || data_item_win->width != item_win_width - || data_item_win->origin.x != (item_win_width * j) + 1 - || data_item_win->origin.y != cur_y)) - { - tui_delete_win (data_item_win->handle); - data_item_win->handle = 0; - } - - if (data_item_win->handle == NULL) - { - data_item_win->height = 1; - data_item_win->width = item_win_width; - data_item_win->origin.x = (item_win_width * j) + 1; - data_item_win->origin.y = cur_y; - data_item_win->make_visible (true); - scrollok (data_item_win->handle, FALSE); - } - touchwin (data_item_win->handle); - - /* Get the printable representation of the register - and display it. */ - tui_display_register (data_item_win); + m_regs_content[i].resize (1, item_win_width, + (item_win_width * j) + 1, cur_y); i++; /* Next register. */ } cur_y++; /* Next row. */ @@ -349,14 +322,14 @@ tui_data_window::display_registers_from_line (int line_no) registers. */ if (line_no >= last_regs_line_no ()) { - line_no = line_from_reg_element_no (regs_content.size () - 1); + line_no = line_from_reg_element_no (m_regs_content.size () - 1); if (line_no < 0) line_no = 0; } } element_no = first_reg_element_no_inline (line_no); - if (element_no < regs_content.size ()) + if (element_no < m_regs_content.size ()) display_reg_element_at_line (element_no, line_no); else line_no = (-1); @@ -370,11 +343,11 @@ tui_data_window::display_registers_from_line (int line_no) int tui_data_window::first_data_item_displayed () { - for (int i = 0; i < regs_content.size (); i++) + for (int i = 0; i < m_regs_content.size (); i++) { struct tui_gen_win_info *data_item_win; - data_item_win = ®s_content[i]; + data_item_win = &m_regs_content[i]; if (data_item_win->is_visible ()) return i; } @@ -387,18 +360,15 @@ tui_data_window::first_data_item_displayed () void tui_data_window::delete_data_content_windows () { - for (auto &&win : regs_content) - { - tui_delete_win (win.handle); - win.handle = NULL; - } + for (auto &&win : m_regs_content) + win.handle.reset (nullptr); } void tui_data_window::erase_data_content (const char *prompt) { - werase (handle); + werase (handle.get ()); check_and_display_highlight_if_needed (); if (prompt != NULL) { @@ -409,9 +379,9 @@ tui_data_window::erase_data_content (const char *prompt) x_pos = 1; else x_pos = half_width - strlen (prompt); - mvwaddstr (handle, (height / 2), x_pos, (char *) prompt); + mvwaddstr (handle.get (), (height / 2), x_pos, (char *) prompt); } - wrefresh (handle); + wrefresh (handle.get ()); } /* See tui-regs.h. */ @@ -419,7 +389,7 @@ tui_data_window::erase_data_content (const char *prompt) void tui_data_window::rerender () { - if (regs_content.empty ()) + if (m_regs_content.empty ()) erase_data_content (_("[ Register Values Unavailable ]")); else { @@ -430,29 +400,6 @@ tui_data_window::rerender () } -/* Function to redisplay the contents of the data window. */ -void -tui_data_window::refresh_all () -{ - erase_data_content (NULL); - if (!regs_content.empty ()) - { - int first_element = first_data_item_displayed (); - - if (first_element >= 0) /* Re-use existing windows. */ - { - int first_line = (-1); - - if (first_element < regs_content.size ()) - first_line = line_from_reg_element_no (first_element); - - if (first_line >= 0) - display_registers_from_line (first_line); - } - } -} - - /* Scroll the data window vertically forward or backward. */ void tui_data_window::do_scroll_vertical (int num_to_scroll) @@ -461,7 +408,7 @@ tui_data_window::do_scroll_vertical (int num_to_scroll) int first_line = (-1); first_element_no = first_data_item_displayed (); - if (first_element_no < regs_content.size ()) + if (first_element_no < m_regs_content.size ()) first_line = line_from_reg_element_no (first_element_no); else { /* Calculate the first line from the element number which is in @@ -483,7 +430,7 @@ void tui_data_window::refresh_window () { tui_gen_win_info::refresh_window (); - for (auto &&win : regs_content) + for (auto &&win : m_regs_content) win.refresh_window (); } @@ -493,11 +440,11 @@ tui_data_window::refresh_window () void tui_data_window::check_register_values (struct frame_info *frame) { - if (regs_content.empty ()) - show_registers (current_group); + if (m_regs_content.empty ()) + show_registers (m_current_group); else { - for (auto &&data_item_win : regs_content) + for (auto &&data_item_win : m_regs_content) { int was_hilighted; @@ -508,43 +455,54 @@ tui_data_window::check_register_values (struct frame_info *frame) &data_item_win.highlight); if (data_item_win.highlight || was_hilighted) - tui_display_register (&data_item_win); + data_item_win.rerender (); } } } /* Display a register in a window. If hilite is TRUE, then the value will be displayed in reverse video. */ -static void -tui_display_register (struct tui_data_item_window *data) +void +tui_data_item_window::rerender () { - if (data->handle != NULL) - { - int i; - - if (data->highlight) - /* We ignore the return value, casting it to void in order to avoid - a compiler warning. The warning itself was introduced by a patch - to ncurses 5.7 dated 2009-08-29, changing this macro to expand - to code that causes the compiler to generate an unused-value - warning. */ - (void) wstandout (data->handle); + int i; + + scrollok (handle.get (), FALSE); + if (highlight) + /* We ignore the return value, casting it to void in order to avoid + a compiler warning. The warning itself was introduced by a patch + to ncurses 5.7 dated 2009-08-29, changing this macro to expand + to code that causes the compiler to generate an unused-value + warning. */ + (void) wstandout (handle.get ()); - wmove (data->handle, 0, 0); - for (i = 1; i < data->width; i++) - waddch (data->handle, ' '); - wmove (data->handle, 0, 0); - if (data->content) - waddstr (data->handle, data->content.get ()); - - if (data->highlight) - /* We ignore the return value, casting it to void in order to avoid - a compiler warning. The warning itself was introduced by a patch - to ncurses 5.7 dated 2009-08-29, changing this macro to expand - to code that causes the compiler to generate an unused-value - warning. */ - (void) wstandend (data->handle); - data->refresh_window (); + wmove (handle.get (), 0, 0); + for (i = 1; i < width; i++) + waddch (handle.get (), ' '); + wmove (handle.get (), 0, 0); + if (content) + waddstr (handle.get (), content.get ()); + + if (highlight) + /* We ignore the return value, casting it to void in order to avoid + a compiler warning. The warning itself was introduced by a patch + to ncurses 5.7 dated 2009-08-29, changing this macro to expand + to code that causes the compiler to generate an unused-value + warning. */ + (void) wstandend (handle.get ()); + refresh_window (); +} + +void +tui_data_item_window::refresh_window () +{ + if (handle != nullptr) + { + /* This seems to be needed because the data items are nested + windows, which according to the ncurses man pages aren't well + supported. */ + touchwin (handle.get ()); + wrefresh (handle.get ()); } }