/* 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 "tui/tui.h"
#include "tui/tui-data.h"
#include "tui/tui-wingeneral.h"
+#include "tui/tui-winsource.h"
#include "gdb_curses.h"
-/****************************
-** GLOBAL DECLARATIONS
-****************************/
struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
-/***************************
-** Private data
-****************************/
-static enum tui_layout_type current_layout = UNDEFINED_LAYOUT;
static int term_height, term_width;
-static struct tui_gen_win_info _locator;
-static struct tui_gen_win_info exec_info[2];
-static struct tui_win_info *src_win_list[2];
-static struct tui_list source_windows = {src_win_list, 0};
static struct tui_win_info *win_with_focus = NULL;
-static struct tui_layout_def layout_def = {
- SRC_WIN, /* DISPLAY_MODE */
- FALSE}; /* SPLIT */
-static int win_resized = FALSE;
-
-
-/*********************************
-** Static function forward decls
-**********************************/
-static void free_content (tui_win_content,
- int,
- enum tui_win_type);
-static void free_content_elements (tui_win_content,
- int,
- enum tui_win_type);
-
-
-
-/*********************************
-** PUBLIC FUNCTIONS
-**********************************/
-
-int
-tui_win_is_source_type (enum tui_win_type win_type)
-{
- return (win_type == SRC_WIN || win_type == DISASSEM_WIN);
-}
-
-int
-tui_win_is_auxillary (enum tui_win_type win_type)
-{
- return (win_type > MAX_MAJOR_WINDOWS);
-}
-
-int
-tui_win_has_locator (struct tui_win_info *win_info)
-{
- return (win_info != NULL
- && win_info->detail.source_info.has_locator);
-}
-
-void
-tui_set_win_highlight (struct tui_win_info *win_info,
- int highlight)
-{
- if (win_info != NULL)
- win_info->is_highlighted = highlight;
-}
-
-/******************************************
-** 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;
}
-/* Answer a pointer to the current layout definition. */
-struct tui_layout_def *
-tui_layout_def (void)
-{
- return &layout_def;
-}
-
-
/* Answer the window with the logical focus. */
struct tui_win_info *
tui_win_with_focus (void)
}
-/* 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. */
-struct tui_list *
-tui_source_windows (void)
-{
- 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 (void)
-{
- source_windows.list[0] = NULL;
- source_windows.list[1] = NULL;
- source_windows.count = 0;
-}
-
-
-/* Clear the pertinant detail in the source windows. */
-void
-tui_clear_source_windows_detail (void)
-{
- int i;
-
- for (i = 0; i < (tui_source_windows ())->count; i++)
- tui_clear_win_detail ((tui_source_windows ())->list[i]);
-}
-
-
-/* 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_win_info *win_info)
-{
- if (source_windows.count < 2)
- source_windows.list[source_windows.count++] = win_info;
-}
-
-
-/* Clear the pertinant detail in the windows. */
-void
-tui_clear_win_detail (struct tui_win_info *win_info)
-{
- if (win_info != NULL)
- {
- switch (win_info->generic.type)
- {
- case SRC_WIN:
- case DISASSEM_WIN:
- win_info->detail.source_info.gdbarch = NULL;
- win_info->detail.source_info.start_line_or_addr.loa = LOA_ADDRESS;
- win_info->detail.source_info.start_line_or_addr.u.addr = 0;
- win_info->detail.source_info.horizontal_offset = 0;
- break;
- case CMD_WIN:
- wmove (win_info->generic.handle, 0, 0);
- break;
- case DATA_WIN:
- win_info->detail.data_display_info.data_content = NULL;
- win_info->detail.data_display_info.data_content_count = 0;
- win_info->detail.data_display_info.regs_content = NULL;
- win_info->detail.data_display_info.regs_content_count = 0;
- win_info->detail.data_display_info.regs_column_count = 1;
- win_info->detail.data_display_info.display_regs = FALSE;
- break;
- default:
- break;
- }
- }
-}
-
-
-/* Accessor for the source execution info ptr. */
-struct tui_gen_win_info *
-tui_source_exec_info_win_ptr (void)
-{
- return &exec_info[0];
-}
-
-
-/* Accessor for the disassem execution info ptr. */
-struct tui_gen_win_info *
-tui_disassem_exec_info_win_ptr (void)
-{
- return &exec_info[1];
-}
-
-
-/* Accessor for the locator win info. Answers a pointer to the static
- locator win info struct. */
-struct tui_gen_win_info *
-tui_locator_win_info_ptr (void)
-{
- return &_locator;
-}
-
-
/* Accessor for the term_height. */
int
tui_term_height (void)
}
-/* Accessor for the current layout. */
-enum tui_layout_type
-tui_current_layout (void)
-{
- return current_layout;
-}
-
-
-/* Mutator for the current layout. */
-void
-tui_set_current_layout_to (enum tui_layout_type new_layout)
-{
- current_layout = new_layout;
-}
-
-
-/*****************************
-** 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->generic.type;
+ int type = cur_win->type;
struct tui_win_info *next_win = NULL;
- if (cur_win->generic.type == CMD_WIN)
+ if (cur_win->type == CMD_WIN)
type = SRC_WIN;
else
- type = cur_win->generic.type + 1;
- while (type != cur_win->generic.type && (next_win == NULL))
+ type = cur_win->type + 1;
+ while (type != cur_win->type && (next_win == NULL))
{
if (tui_win_list[type]
- && tui_win_list[type]->generic.is_visible)
+ && tui_win_list[type]->is_visible ())
next_win = tui_win_list[type];
else
{
struct tui_win_info *
tui_prev_win (struct tui_win_info *cur_win)
{
- int type = cur_win->generic.type;
+ int type = cur_win->type;
struct tui_win_info *prev = NULL;
- if (cur_win->generic.type == SRC_WIN)
+ if (cur_win->type == SRC_WIN)
type = CMD_WIN;
else
- type = cur_win->generic.type - 1;
- while (type != cur_win->generic.type && (prev == NULL))
+ type = cur_win->type - 1;
+ while (type != cur_win->type && (prev == NULL))
{
if (tui_win_list[type]
- && tui_win_list[type]->generic.is_visible)
+ && tui_win_list[type]->is_visible ())
prev = tui_win_list[type];
else
{
}
-/* Answer the window represented by name. */
-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)
- {
- if (tui_win_list[i] != 0)
- {
- const char *cur_name =
- tui_win_name (&tui_win_list[i]->generic);
-
- if (strlen (name) <= strlen (cur_name)
- && startswith (cur_name, name))
- win_info = tui_win_list[i];
- }
- i++;
- }
- }
-
- return win_info;
-}
-
-
-/* Answer the name of the window. */
-const char *
-tui_win_name (const struct tui_gen_win_info *win_info)
-{
- const char *name = NULL;
-
- switch (win_info->type)
- {
- case SRC_WIN:
- name = SRC_NAME;
- break;
- case CMD_WIN:
- name = CMD_NAME;
- break;
- case DISASSEM_WIN:
- name = DISASSEM_NAME;
- break;
- case DATA_WIN:
- name = DATA_NAME;
- break;
- default:
- name = "";
- break;
- }
-
- return name;
-}
-
+/* See tui-data.h. */
void
-tui_initialize_static_data (void)
+tui_delete_invisible_windows ()
{
- tui_init_generic_part (tui_source_exec_info_win_ptr ());
- tui_init_generic_part (tui_disassem_exec_info_win_ptr ());
- tui_init_generic_part (tui_locator_win_info_ptr ());
-}
-
-
-struct tui_gen_win_info *
-tui_alloc_generic_win_info (void)
-{
- struct tui_gen_win_info *win = XNEW (struct tui_gen_win_info);
-
- tui_init_generic_part (win);
-
- return win;
-}
-
-
-void
-tui_init_generic_part (struct tui_gen_win_info *win)
-{
- win->width =
- win->height =
- win->origin.x =
- win->origin.y =
- win->viewport_height =
- win->content_size =
- win->last_visible_line = 0;
- win->handle = NULL;
- win->content = NULL;
- win->content_in_use =
- win->is_visible = FALSE;
- win->title = 0;
-}
-
-
-/* init_content_element().
- */
-static void
-init_content_element (struct tui_win_element *element,
- enum tui_win_type type)
-{
- switch (type)
- {
- case SRC_WIN:
- case DISASSEM_WIN:
- element->which_element.source.line = NULL;
- element->which_element.source.line_or_addr.loa = LOA_LINE;
- element->which_element.source.line_or_addr.u.line_no = 0;
- element->which_element.source.is_exec_point = FALSE;
- element->which_element.source.has_break = FALSE;
- break;
- case DATA_WIN:
- tui_init_generic_part (&element->which_element.data_window);
- element->which_element.data_window.type = DATA_ITEM_WIN;
- element->which_element.data_window.content =
- tui_alloc_content (1, DATA_ITEM_WIN);
- element->which_element.data_window.content_size = 1;
- break;
- case CMD_WIN:
- element->which_element.command.line = NULL;
- break;
- case DATA_ITEM_WIN:
- element->which_element.data.name = NULL;
- element->which_element.data.type = TUI_REGISTER;
- element->which_element.data.item_no = UNDEFINED_ITEM;
- element->which_element.data.value = NULL;
- element->which_element.data.highlight = FALSE;
- element->which_element.data.content = NULL;
- break;
- case LOCATOR_WIN:
- element->which_element.locator.full_name[0] =
- element->which_element.locator.proc_name[0] = (char) 0;
- element->which_element.locator.line_no = 0;
- element->which_element.locator.addr = 0;
- break;
- case EXEC_INFO_WIN:
- memset(element->which_element.simple_string, ' ',
- sizeof(element->which_element.simple_string));
- break;
- default:
- break;
- }
-}
-
-tui_win_info::tui_win_info (enum tui_win_type type)
-{
- generic.type = type;
- tui_init_generic_part (&generic);
-}
-
-tui_source_window::tui_source_window (enum tui_win_type type)
- : tui_win_info (type)
-{
- gdb_assert (type == SRC_WIN || type == DISASSEM_WIN);
- detail.source_info.execution_info = NULL;
- detail.source_info.has_locator = FALSE;
- detail.source_info.horizontal_offset = 0;
- detail.source_info.gdbarch = NULL;
- detail.source_info.start_line_or_addr.loa = LOA_ADDRESS;
- detail.source_info.start_line_or_addr.u.addr = 0;
- detail.source_info.fullname = NULL;
-}
-
-tui_data_window::tui_data_window ()
- : tui_win_info (DATA_WIN)
-{
- detail.data_display_info.data_content = (tui_win_content) NULL;
- detail.data_display_info.data_content_count = 0;
- detail.data_display_info.regs_content = (tui_win_content) NULL;
- detail.data_display_info.regs_content_count = 0;
- detail.data_display_info.regs_column_count = 1;
- detail.data_display_info.display_regs = FALSE;
- detail.data_display_info.current_group = 0;
-}
-
-tui_cmd_window::tui_cmd_window ()
- : tui_win_info (CMD_WIN)
-{
-}
-
-struct tui_win_info *
-tui_alloc_win_info (enum tui_win_type type)
-{
- switch (type)
- {
- case SRC_WIN:
- case DISASSEM_WIN:
- return new tui_source_window (type);
-
- case DATA_WIN:
- return new tui_data_window ();
-
- case CMD_WIN:
- return new tui_cmd_window ();
- }
-
- gdb_assert_not_reached (_("Unhandled window type"));
-}
-
-
-/* Allocates the content and elements in a block. */
-tui_win_content
-tui_alloc_content (int num_elements, enum tui_win_type type)
-{
- tui_win_content content;
- struct tui_win_element *element_block_ptr;
- int i;
-
- content = XNEWVEC (struct tui_win_element *, num_elements);
-
- /*
- * All windows, except the data window, can allocate the
- * elements in a chunk. The data window cannot because items
- * can be added/removed from the data display by the user at any
- * time.
- */
- if (type != DATA_WIN)
- {
- element_block_ptr = XNEWVEC (struct tui_win_element, num_elements);
- for (i = 0; i < num_elements; i++)
- {
- content[i] = element_block_ptr;
- init_content_element (content[i], type);
- element_block_ptr++;
- }
- }
-
- return content;
-}
-
-
-/* Adds the input number of elements to the windows's content. If no
- content has been allocated yet, alloc_content() is called to do
- this. The index of the first element added is returned, unless
- there is a memory allocation error, in which case, (-1) is
- returned. */
-int
-tui_add_content_elements (struct tui_gen_win_info *win_info,
- int num_elements)
-{
- struct tui_win_element *element_ptr;
- int i, index_start;
-
- if (win_info->content == NULL)
- {
- win_info->content = tui_alloc_content (num_elements, win_info->type);
- index_start = 0;
- }
- else
- index_start = win_info->content_size;
- if (win_info->content != NULL)
- {
- for (i = index_start; (i < num_elements + index_start); i++)
- {
- element_ptr = XNEW (struct tui_win_element);
- win_info->content[i] = element_ptr;
- init_content_element (element_ptr, win_info->type);
- win_info->content_size++;
- }
- }
-
- return index_start;
-}
-
-tui_win_info::~tui_win_info ()
-{
- struct tui_gen_win_info *generic_win;
-
- switch (generic.type)
+ for (int win_type = SRC_WIN; (win_type < MAX_MAJOR_WINDOWS); win_type++)
{
- case SRC_WIN:
- case DISASSEM_WIN:
- if (detail.source_info.fullname)
- {
- xfree (detail.source_info.fullname);
- detail.source_info.fullname = NULL;
- }
- generic_win = detail.source_info.execution_info;
- if (generic_win != NULL)
+ if (tui_win_list[win_type] != NULL
+ && !tui_win_list[win_type]->is_visible ())
{
- tui_delete_win (generic_win->handle);
- generic_win->handle = NULL;
- tui_free_win_content (generic_win);
- }
- break;
- case DATA_WIN:
- if (generic.content != NULL)
- {
- tui_free_data_content (detail.data_display_info.regs_content,
- detail.data_display_info.regs_content_count);
- detail.data_display_info.regs_content = NULL;
- detail.data_display_info.regs_content_count = 0;
- tui_free_data_content (detail.data_display_info.data_content,
- detail.data_display_info.data_content_count);
- detail.data_display_info.data_content = NULL;
- detail.data_display_info.data_content_count = 0;
- detail.data_display_info.regs_column_count = 1;
- detail.data_display_info.display_regs = FALSE;
- generic.content = NULL;
- generic.content_size = 0;
- }
- break;
- default:
- break;
- }
- if (generic.handle != NULL)
- {
- tui_delete_win (generic.handle);
- generic.handle = NULL;
- tui_free_win_content (&generic);
- }
- if (generic.title)
- xfree (generic.title);
-}
-
+ /* This should always be made visible before a call to this
+ function. */
+ gdb_assert (win_type != CMD_WIN);
-void
-tui_free_all_source_wins_content (void)
-{
- int i;
+ if (win_with_focus == tui_win_list[win_type])
+ win_with_focus = nullptr;
- for (i = 0; i < (tui_source_windows ())->count; i++)
- {
- struct tui_win_info *win_info = (tui_source_windows ())->list[i];
-
- if (win_info != NULL)
- {
- tui_free_win_content (&(win_info->generic));
- tui_free_win_content (win_info->detail.source_info.execution_info);
+ delete tui_win_list[win_type];
+ tui_win_list[win_type] = NULL;
}
}
}
-
-void
-tui_free_win_content (struct tui_gen_win_info *win_info)
+tui_win_info::tui_win_info (enum tui_win_type type)
+ : tui_gen_win_info (type)
{
- if (win_info->content != NULL)
- {
- free_content (win_info->content,
- win_info->content_size,
- win_info->type);
- win_info->content = NULL;
- }
- win_info->content_size = 0;
}
-
void
-tui_free_data_content (tui_win_content content,
- int content_size)
+tui_win_info::rerender ()
{
- int i;
-
- /* Remember that data window content elements are of type struct
- tui_gen_win_info *, each of which whose single element is a data
- element. */
- for (i = 0; i < content_size; i++)
- {
- struct tui_gen_win_info *generic_win
- = &content[i]->which_element.data_window;
-
- if (generic_win != NULL)
- {
- tui_delete_win (generic_win->handle);
- generic_win->handle = NULL;
- tui_free_win_content (generic_win);
- }
- }
- free_content (content,
- content_size,
- DATA_WIN);
-}
-
-
-/**********************************
-** LOCAL STATIC FUNCTIONS **
-**********************************/
-
-
-static void
-free_content (tui_win_content content,
- int content_size,
- enum tui_win_type win_type)
-{
- if (content != NULL)
- {
- free_content_elements (content, content_size, win_type);
- xfree (content);
- }
-}
-
-
-/* free_content_elements().
- */
-static void
-free_content_elements (tui_win_content content,
- int content_size,
- enum tui_win_type type)
-{
- if (content != NULL)
- {
- int i;
-
- if (type == DISASSEM_WIN)
- {
- /* Free whole source block. */
- xfree (content[0]->which_element.source.line);
- }
- else
- {
- for (i = 0; i < content_size; i++)
- {
- struct tui_win_element *element;
-
- element = content[i];
- if (element != NULL)
- {
- switch (type)
- {
- case SRC_WIN:
- xfree (element->which_element.source.line);
- break;
- case DATA_WIN:
- xfree (element);
- break;
- case DATA_ITEM_WIN:
- /* Note that data elements are not allocated in
- a single block, but individually, as
- needed. */
- if (element->which_element.data.type != TUI_REGISTER)
- xfree ((void *)element->which_element.data.name);
- xfree (element->which_element.data.value);
- xfree (element->which_element.data.content);
- xfree (element);
- break;
- case CMD_WIN:
- xfree (element->which_element.command.line);
- break;
- default:
- break;
- }
- }
- }
- }
- if (type != DATA_WIN && type != DATA_ITEM_WIN)
- xfree (content[0]); /* Free the element block. */
- }
+ check_and_display_highlight_if_needed ();
}