Change TUI source window iteration

Currently the TUI does separate bookkeeping to track which source
windows exist.  It seems better to me to just refer to the list of
windows for this, so this patch removes the special handling and
instead adds a new iterator.

gdb/ChangeLog
2019-08-15  Tom Tromey  <tom@tromey.com>

	* tui/tui-winsource.h (struct tui_source_window_iterator): New.
	(struct tui_source_windows): New.
	* tui/tui-winsource.c (tui_display_main): Update.
	* tui/tui-win.c (tui_resize_all, tui_adjust_win_heights)
	(new_height_ok, parse_scrolling_args): Update.
	* tui/tui-layout.c (show_layout, show_data): Update.
	* tui/tui-data.h (tui_source_windows, tui_clear_source_windows)
	(tui_add_to_source_windows): Don't declare.
	* tui/tui-data.c (source_windows, tui_source_windows)
	(tui_clear_source_windows, tui_add_to_source_windows): Remove.
This commit is contained in:
Tom Tromey
2019-07-06 21:19:45 -06:00
parent ee556432c4
commit 3891b65efe
7 changed files with 92 additions and 51 deletions

View File

@ -1,3 +1,16 @@
2019-08-15 Tom Tromey <tom@tromey.com>
* tui/tui-winsource.h (struct tui_source_window_iterator): New.
(struct tui_source_windows): New.
* tui/tui-winsource.c (tui_display_main): Update.
* tui/tui-win.c (tui_resize_all, tui_adjust_win_heights)
(new_height_ok, parse_scrolling_args): Update.
* tui/tui-layout.c (show_layout, show_data): Update.
* tui/tui-data.h (tui_source_windows, tui_clear_source_windows)
(tui_add_to_source_windows): Don't declare.
* tui/tui-data.c (source_windows, tui_source_windows)
(tui_clear_source_windows, tui_add_to_source_windows): Remove.
2019-08-15 Tom Tromey <tom@tromey.com> 2019-08-15 Tom Tromey <tom@tromey.com>
* tui/tui-winsource.h (struct tui_source_window_base) <resize>: * tui/tui-winsource.h (struct tui_source_window_base) <resize>:

View File

@ -36,7 +36,6 @@ struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
** Private data ** Private data
****************************/ ****************************/
static int term_height, term_width; static int term_height, term_width;
static std::vector<tui_source_window_base *> source_windows;
static struct tui_win_info *win_with_focus = NULL; static struct tui_win_info *win_with_focus = NULL;
static int win_resized = FALSE; static int win_resized = FALSE;
@ -88,26 +87,6 @@ tui_set_win_with_focus (struct tui_win_info *win_info)
} }
/* Accessor for the current source window. Usually there is only one
source window (either source or disassembly), but both can be
displayed at the same time. */
std::vector<tui_source_window_base *> &
tui_source_windows ()
{
return source_windows;
}
/* Clear the list of source windows. Usually there is only one source
window (either source or disassembly), but both can be displayed at
the same time. */
void
tui_clear_source_windows ()
{
source_windows.clear ();
}
/* Clear the pertinent detail in the source windows. */ /* Clear the pertinent detail in the source windows. */
void void
tui_clear_source_windows_detail () tui_clear_source_windows_detail ()
@ -117,16 +96,6 @@ tui_clear_source_windows_detail ()
} }
/* Add a window to the list of source windows. Usually there is only
one source window (either source or disassembly), but both can be
displayed at the same time. */
void
tui_add_to_source_windows (struct tui_source_window_base *win_info)
{
if (source_windows.size () < 2)
source_windows.push_back (win_info);
}
/* Accessor for the term_height. */ /* Accessor for the term_height. */
int int
tui_term_height (void) tui_term_height (void)

View File

@ -324,10 +324,7 @@ extern void tui_set_term_height_to (int);
extern int tui_term_width (void); extern int tui_term_width (void);
extern void tui_set_term_width_to (int); extern void tui_set_term_width_to (int);
extern struct tui_locator_window *tui_locator_win_info_ptr (void); extern struct tui_locator_window *tui_locator_win_info_ptr (void);
extern std::vector<tui_source_window_base *> &tui_source_windows ();
extern void tui_clear_source_windows (void);
extern void tui_clear_source_windows_detail (void); extern void tui_clear_source_windows_detail (void);
extern void tui_add_to_source_windows (struct tui_source_window_base *);
extern struct tui_win_info *tui_win_with_focus (void); extern struct tui_win_info *tui_win_with_focus (void);
extern void tui_set_win_with_focus (struct tui_win_info *); extern void tui_set_win_with_focus (struct tui_win_info *);
extern int tui_win_resized (void); extern int tui_win_resized (void);

View File

@ -76,10 +76,6 @@ show_layout (enum tui_layout_type layout)
if (layout != cur_layout) if (layout != cur_layout)
{ {
/* Since the new layout may cause changes in window size, we
should free the content and reallocate on next display of
source/asm. */
tui_clear_source_windows ();
/* First make the current layout be invisible. */ /* First make the current layout be invisible. */
tui_make_all_invisible (); tui_make_all_invisible ();
tui_locator_win_info_ptr ()->make_visible (false); tui_locator_win_info_ptr ()->make_visible (false);
@ -93,16 +89,12 @@ show_layout (enum tui_layout_type layout)
/* Now show the new layout. */ /* Now show the new layout. */
case SRC_COMMAND: case SRC_COMMAND:
show_source_command (); show_source_command ();
tui_add_to_source_windows (TUI_SRC_WIN);
break; break;
case DISASSEM_COMMAND: case DISASSEM_COMMAND:
show_disasm_command (); show_disasm_command ();
tui_add_to_source_windows (TUI_DISASM_WIN);
break; break;
case SRC_DISASSEM_COMMAND: case SRC_DISASSEM_COMMAND:
show_source_disasm_command (); show_source_disasm_command ();
tui_add_to_source_windows (TUI_SRC_WIN);
tui_add_to_source_windows (TUI_DISASM_WIN);
break; break;
default: default:
break; break;
@ -595,7 +587,6 @@ show_data (enum tui_layout_type new_layout)
base->m_has_locator = true; base->m_has_locator = true;
locator->make_visible (true); locator->make_visible (true);
tui_show_locator_content (); tui_show_locator_content ();
tui_add_to_source_windows (base);
TUI_CMD_WIN->make_visible (true); TUI_CMD_WIN->make_visible (true);
current_layout = new_layout; current_layout = new_layout;
} }

View File

@ -571,7 +571,7 @@ tui_resize_all (void)
{ {
case SRC_COMMAND: case SRC_COMMAND:
case DISASSEM_COMMAND: case DISASSEM_COMMAND:
src_win = tui_source_windows ()[0]; src_win = *(tui_source_windows ().begin ());
first_win = src_win; first_win = src_win;
first_win->width += width_diff; first_win->width += width_diff;
locator->width += width_diff; locator->width += width_diff;
@ -610,7 +610,7 @@ tui_resize_all (void)
{ {
first_win = TUI_DATA_WIN; first_win = TUI_DATA_WIN;
first_win->width += width_diff; first_win->width += width_diff;
src_win = tui_source_windows ()[0]; src_win = *(tui_source_windows ().begin ());
second_win = src_win; second_win = src_win;
second_win->width += width_diff; second_win->width += width_diff;
} }
@ -1046,7 +1046,7 @@ tui_adjust_win_heights (struct tui_win_info *primary_win_info,
primary_win_info->make_invisible_and_set_new_height (new_height); primary_win_info->make_invisible_and_set_new_height (new_height);
if (primary_win_info->type == CMD_WIN) if (primary_win_info->type == CMD_WIN)
{ {
win_info = tui_source_windows ()[0]; win_info = *(tui_source_windows ().begin ());
src_win_info = win_info; src_win_info = win_info;
} }
else else
@ -1084,7 +1084,7 @@ tui_adjust_win_heights (struct tui_win_info *primary_win_info,
{ {
src1 = nullptr; src1 = nullptr;
first_win = TUI_DATA_WIN; first_win = TUI_DATA_WIN;
second_win = tui_source_windows ()[0]; second_win = *(tui_source_windows ().begin ());
} }
if (primary_win_info == TUI_CMD_WIN) if (primary_win_info == TUI_CMD_WIN)
{ /* Split the change in height accross the 1st & 2nd { /* Split the change in height accross the 1st & 2nd
@ -1238,7 +1238,7 @@ new_height_ok (struct tui_win_info *primary_win_info,
struct tui_win_info *win_info; struct tui_win_info *win_info;
if (primary_win_info == TUI_CMD_WIN) if (primary_win_info == TUI_CMD_WIN)
win_info = tui_source_windows ()[0]; win_info = *(tui_source_windows ().begin ());
else else
win_info = TUI_CMD_WIN; win_info = TUI_CMD_WIN;
ok = ((new_height + ok = ((new_height +
@ -1259,7 +1259,7 @@ new_height_ok (struct tui_win_info *primary_win_info,
else else
{ {
first_win = TUI_DATA_WIN; first_win = TUI_DATA_WIN;
second_win = tui_source_windows ()[0]; second_win = *(tui_source_windows ().begin ());
} }
/* We could simply add all the heights to obtain the same /* We could simply add all the heights to obtain the same
result but below is more explicit since we subtract 1 for result but below is more explicit since we subtract 1 for
@ -1385,7 +1385,7 @@ parse_scrolling_args (const char *arg,
if (!(*win_to_scroll)->is_visible) if (!(*win_to_scroll)->is_visible)
error (_("Window is not visible")); error (_("Window is not visible"));
else if (*win_to_scroll == TUI_CMD_WIN) else if (*win_to_scroll == TUI_CMD_WIN)
*win_to_scroll = tui_source_windows ()[0]; *win_to_scroll = *(tui_source_windows ().begin ());
} }
} }
} }

View File

@ -44,7 +44,8 @@
void void
tui_display_main () tui_display_main ()
{ {
if (!tui_source_windows ().empty ()) auto adapter = tui_source_windows ();
if (adapter.begin () != adapter.end ())
{ {
struct gdbarch *gdbarch; struct gdbarch *gdbarch;
CORE_ADDR addr; CORE_ADDR addr;

View File

@ -156,6 +156,76 @@ public:
std::vector<tui_source_element> content; std::vector<tui_source_element> content;
}; };
/* A wrapper for a TUI window iterator that only iterates over source
windows. */
struct tui_source_window_iterator
{
public:
typedef tui_source_window_iterator self_type;
typedef struct tui_source_window_base *value_type;
typedef struct tui_source_window_base *&reference;
typedef struct tui_source_window_base **pointer;
typedef std::forward_iterator_tag iterator_category;
typedef int difference_type;
explicit tui_source_window_iterator (bool dummy)
: m_iter (SRC_WIN)
{
advance ();
}
tui_source_window_iterator ()
: m_iter (tui_win_type (DISASSEM_WIN + 1))
{
}
bool operator!= (const self_type &other) const
{
return m_iter != other.m_iter;
}
value_type operator* () const
{
return (value_type) *m_iter;
}
self_type &operator++ ()
{
++m_iter;
advance ();
return *this;
}
private:
void advance ()
{
tui_window_iterator end;
while (m_iter != end && *m_iter == nullptr)
++m_iter;
}
tui_window_iterator m_iter;
};
/* A range adapter for source windows. */
struct tui_source_windows
{
tui_source_window_iterator begin () const
{
return tui_source_window_iterator (true);
}
tui_source_window_iterator end () const
{
return tui_source_window_iterator ();
}
};
/* Update the execution windows to show the active breakpoints. This /* Update the execution windows to show the active breakpoints. This
is called whenever a breakpoint is inserted, removed or has its is called whenever a breakpoint is inserted, removed or has its
state changed. Normally BEING_DELETED is nullptr; if not nullptr, state changed. Normally BEING_DELETED is nullptr; if not nullptr,