/* TUI data manipulation routines.
- Copyright (C) 1998-2019 Free Software Foundation, Inc.
+ Copyright (C) 1998-2020 Free Software Foundation, Inc.
Contributed by Hewlett-Packard Company.
#include "symtab.h"
#include "tui/tui.h"
#include "tui/tui-data.h"
+#include "tui/tui-win.h"
#include "tui/tui-wingeneral.h"
#include "tui/tui-winsource.h"
#include "gdb_curses.h"
+#include <algorithm>
-/****************************
-** GLOBAL DECLARATIONS
-****************************/
struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
-/***************************
-** Private data
-****************************/
static int term_height, term_width;
static struct tui_win_info *win_with_focus = NULL;
-static int win_resized = FALSE;
-
-
-/*********************************
-** PUBLIC FUNCTIONS
-**********************************/
-
-int
-tui_win_is_auxiliary (enum tui_win_type win_type)
-{
- return (win_type > MAX_MAJOR_WINDOWS);
-}
-
-/******************************************
-** ACCESSORS & MUTATORS FOR PRIVATE DATA
-******************************************/
+static bool win_resized = false;
/* Answer a whether the terminal window has been resized or not. */
-int
-tui_win_resized (void)
+bool
+tui_win_resized ()
{
return win_resized;
}
/* Set a whether the terminal window has been resized or not. */
void
-tui_set_win_resized_to (int resized)
+tui_set_win_resized_to (bool resized)
{
win_resized = resized;
}
}
-/* Set the window that has the logical focus. */
+/* Set the logical focus to win_info. */
void
-tui_set_win_with_focus (struct tui_win_info *win_info)
+tui_set_win_focus_to (struct tui_win_info *win_info)
{
- win_with_focus = win_info;
+ if (win_info != NULL)
+ {
+ tui_unhighlight_win (win_with_focus);
+ win_with_focus = win_info;
+ tui_highlight_win (win_info);
+ }
}
}
-/*****************************
-** OTHER PUBLIC FUNCTIONS
-*****************************/
-
-
/* Answer the next window in the list, cycling back to the top if
necessary. */
struct tui_win_info *
tui_next_win (struct tui_win_info *cur_win)
{
- int type = cur_win->type;
- struct tui_win_info *next_win = NULL;
-
- if (cur_win->type == CMD_WIN)
- type = SRC_WIN;
- else
- type = cur_win->type + 1;
- while (type != cur_win->type && (next_win == NULL))
- {
- if (tui_win_list[type]
- && tui_win_list[type]->is_visible ())
- next_win = tui_win_list[type];
- else
- {
- if (type == CMD_WIN)
- type = SRC_WIN;
- else
- type++;
- }
- }
+ auto iter = std::find (tui_windows.begin (), tui_windows.end (), cur_win);
+ gdb_assert (iter != tui_windows.end ());
- return next_win;
+ ++iter;
+ if (iter == tui_windows.end ())
+ return tui_windows[0];
+ return *iter;
}
struct tui_win_info *
tui_prev_win (struct tui_win_info *cur_win)
{
- int type = cur_win->type;
- struct tui_win_info *prev = NULL;
-
- if (cur_win->type == SRC_WIN)
- type = CMD_WIN;
- else
- type = cur_win->type - 1;
- while (type != cur_win->type && (prev == NULL))
- {
- if (tui_win_list[type]
- && tui_win_list[type]->is_visible ())
- prev = tui_win_list[type];
- else
- {
- if (type == SRC_WIN)
- type = CMD_WIN;
- else
- type--;
- }
- }
-
- return prev;
-}
-
-
-/* Answer the window represented by name. */
-struct tui_win_info *
-tui_partial_win_by_name (const char *name)
-{
- if (name != NULL)
- {
- for (tui_win_info *item : all_tui_windows ())
- {
- const char *cur_name = item->name ();
-
- if (strlen (name) <= strlen (cur_name)
- && startswith (cur_name, name))
- return item;
- }
- }
-
- return NULL;
-}
-
-/* See tui-data.h. */
-
-void
-tui_delete_invisible_windows ()
-{
- for (int win_type = SRC_WIN; (win_type < MAX_MAJOR_WINDOWS); win_type++)
- {
- if (tui_win_list[win_type] != NULL
- && !tui_win_list[win_type]->is_visible ())
- {
- /* This should always be made visible before a call to this
- function. */
- gdb_assert (win_type != CMD_WIN);
-
- if (win_with_focus == tui_win_list[win_type])
- win_with_focus = nullptr;
-
- delete tui_win_list[win_type];
- tui_win_list[win_type] = NULL;
- }
- }
-}
+ auto iter = std::find (tui_windows.begin (), tui_windows.end (), cur_win);
+ gdb_assert (iter != tui_windows.end ());
-tui_win_info::tui_win_info (enum tui_win_type type)
- : tui_gen_win_info (type)
-{
+ if (iter == tui_windows.begin ())
+ return tui_windows.back ();
+ --iter;
+ return *iter;
}
-tui_gen_win_info::~tui_gen_win_info ()
-{
- tui_delete_win (handle);
-}
void
tui_win_info::rerender ()