2019-07-17 Tom Tromey <tom@tromey.com>
+ * tui/tui-wingeneral.h (tui_refresh_all): Update.
+ * tui/tui-wingeneral.c (make_all_visible): Use foreach.
+ (tui_refresh_all): Remove "list" parameter. Use foreach.
+ * tui/tui-win.c (window_name_completer): Use foreach.
+ (tui_refresh_all_win, tui_rehighlight_all, tui_all_windows_info)
+ (update_tab_width): Likewise.
+ * tui/tui-layout.c (show_layout): Update.
+ * tui/tui-data.h (class tui_window_iterator): New.
+ (struct all_tui_windows): New.
+ * tui/tui-data.c (tui_partial_win_by_name): Use foreach.
+
+2019-07-17 Tom Tromey <tom@tromey.com>
+
* tui/tui-regs.c (tui_reg_next, tui_reg_prev): Add "current_group"
parameter. Don't reference globals.
(tui_reg_command): Update.
struct tui_win_info *
tui_partial_win_by_name (const char *name)
{
- struct tui_win_info *win_info = NULL;
-
if (name != NULL)
{
- int i = 0;
-
- while (i < MAX_MAJOR_WINDOWS && win_info == NULL)
+ for (tui_win_info *item : all_tui_windows ())
{
- if (tui_win_list[i] != 0)
- {
- const char *cur_name = tui_win_list[i]->name ();
-
- if (strlen (name) <= strlen (cur_name)
- && startswith (cur_name, name))
- win_info = tui_win_list[i];
- }
- i++;
+ const char *cur_name = item->name ();
+
+ if (strlen (name) <= strlen (cur_name)
+ && startswith (cur_name, name))
+ return item;
}
}
- return win_info;
+ return NULL;
}
#define TUI_DATA_WIN ((tui_data_window *) tui_win_list[DATA_WIN])
#define TUI_CMD_WIN ((tui_cmd_window *) tui_win_list[CMD_WIN])
+/* An iterator that iterates over all windows. */
+
+class tui_window_iterator
+{
+public:
+
+ typedef tui_window_iterator self_type;
+ typedef struct tui_win_info *value_type;
+ typedef struct tui_win_info *&reference;
+ typedef struct tui_win_info **pointer;
+ typedef std::forward_iterator_tag iterator_category;
+ typedef int difference_type;
+
+ explicit tui_window_iterator (enum tui_win_type type)
+ : m_type (type)
+ {
+ advance ();
+ }
+
+ tui_window_iterator ()
+ : m_type (MAX_MAJOR_WINDOWS)
+ {
+ }
+
+ bool operator!= (const self_type &other) const
+ {
+ return m_type != other.m_type;
+ }
+
+ value_type operator* () const
+ {
+ gdb_assert (m_type < MAX_MAJOR_WINDOWS);
+ return tui_win_list[m_type];
+ }
+
+ self_type &operator++ ()
+ {
+ ++m_type;
+ advance ();
+ return *this;
+ }
+
+private:
+
+ void advance ()
+ {
+ while (m_type < MAX_MAJOR_WINDOWS && tui_win_list[m_type] == nullptr)
+ ++m_type;
+ }
+
+ int m_type;
+};
+
+/* A range adapter for iterating over TUI windows. */
+
+struct all_tui_windows
+{
+ tui_window_iterator begin () const
+ {
+ return tui_window_iterator (SRC_WIN);
+ }
+
+ tui_window_iterator end () const
+ {
+ return tui_window_iterator ();
+ }
+};
+
+
/* Data Manipulation Functions. */
extern void tui_initialize_static_data (void);
extern struct tui_win_info *tui_partial_win_by_name (const char *);
|| layout == DISASSEM_DATA_COMMAND)
{
show_data (layout);
- tui_refresh_all (tui_win_list);
+ tui_refresh_all ();
}
else
{
const char *text, const char *word)
{
std::vector<const char *> completion_name_vec;
- int win_type;
- for (win_type = SRC_WIN; win_type < MAX_MAJOR_WINDOWS; win_type++)
+ for (tui_win_info *win_info : all_tui_windows ())
{
const char *completion_name = NULL;
/* We can't focus on an invisible window. */
- if (tui_win_list[win_type] == NULL
- || !tui_win_list[win_type]->is_visible)
+ if (!win_info->is_visible)
continue;
- completion_name = tui_win_list[win_type]->name ();
+ completion_name = win_info->name ();
gdb_assert (completion_name != NULL);
completion_name_vec.push_back (completion_name);
}
void
tui_refresh_all_win (void)
{
- int type;
-
clearok (curscr, TRUE);
- tui_refresh_all (tui_win_list);
- for (type = SRC_WIN; type < MAX_MAJOR_WINDOWS; type++)
+ tui_refresh_all ();
+ for (tui_win_info *win_info : all_tui_windows ())
{
- if (tui_win_list[type] && tui_win_list[type]->is_visible)
- tui_win_list[type]->refresh_all ();
+ if (win_info->is_visible)
+ win_info->refresh_all ();
}
tui_show_locator_content ();
}
void
tui_rehighlight_all (void)
{
- int type;
-
- for (type = SRC_WIN; type < MAX_MAJOR_WINDOWS; type++)
- tui_check_and_display_highlight_if_needed (tui_win_list[type]);
+ for (tui_win_info *win_info : all_tui_windows ())
+ tui_check_and_display_highlight_if_needed (win_info);
}
/* Resize all the windows based on the terminal size. This function
static void
tui_all_windows_info (const char *arg, int from_tty)
{
- int type;
struct tui_win_info *win_with_focus = tui_win_with_focus ();
- for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++)
- if (tui_win_list[type]
- && tui_win_list[type]->is_visible)
+ for (tui_win_info *win_info : all_tui_windows ())
+ if (win_info->is_visible)
{
- if (win_with_focus == tui_win_list[type])
+ if (win_with_focus == win_info)
printf_filtered (" %s\t(%d lines) <has focus>\n",
- tui_win_list[type]->name (),
- tui_win_list[type]->height);
+ win_info->name (),
+ win_info->height);
else
printf_filtered (" %s\t(%d lines)\n",
- tui_win_list[type]->name (),
- tui_win_list[type]->height);
+ win_info->name (),
+ win_info->height);
}
}
static void
update_tab_width ()
{
- for (int win_type = SRC_WIN; win_type < MAX_MAJOR_WINDOWS; win_type++)
+ for (tui_win_info *win_info : all_tui_windows ())
{
- if (tui_win_list[win_type] != NULL
- && tui_win_list[win_type]->is_visible)
- tui_win_list[win_type]->update_tab_width ();
+ if (win_info->is_visible)
+ win_info->update_tab_width ();
}
}
static void
make_all_visible (bool visible)
{
- int i;
-
- for (i = 0; i < MAX_MAJOR_WINDOWS; i++)
- {
- if (tui_win_list[i] != NULL)
- tui_win_list[i]->make_visible (visible);
- }
-
- return;
+ for (tui_win_info *win_info : all_tui_windows ())
+ win_info->make_visible (visible);
}
void
/* Function to refresh all the windows currently displayed. */
void
-tui_refresh_all (struct tui_win_info **list)
+tui_refresh_all ()
{
- int type;
struct tui_locator_window *locator = tui_locator_win_info_ptr ();
- for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++)
+ for (tui_win_info *win_info : all_tui_windows ())
{
- if (list[type] && list[type]->is_visible)
- list[type]->refresh ();
+ if (win_info->is_visible)
+ win_info->refresh ();
}
if (locator->is_visible)
{
extern void tui_box_win (struct tui_gen_win_info *, int);
extern void tui_highlight_win (struct tui_win_info *);
extern void tui_check_and_display_highlight_if_needed (struct tui_win_info *);
-extern void tui_refresh_all (struct tui_win_info **);
+extern void tui_refresh_all ();
extern void tui_delete_win (WINDOW *window);
#endif /* TUI_TUI_WINGENERAL_H */