| /* TUI data manipulation routines. | |
| Copyright (C) 1998-2020 Free Software Foundation, Inc. | |
| Contributed by Hewlett-Packard Company. | |
| This file is part of GDB. | |
| This program is free software; you can redistribute it and/or modify | |
| it under the terms of the GNU General Public License as published by | |
| the Free Software Foundation; either version 3 of the License, or | |
| (at your option) any later version. | |
| This program is distributed in the hope that it will be useful, | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| GNU General Public License for more details. | |
| You should have received a copy of the GNU General Public License | |
| along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
| #include "defs.h" | |
| #include "symtab.h" | |
| #include "tui/tui.h" | |
| #include "tui/tui-data.h" | |
| #include "tui/tui-wingeneral.h" | |
| #include "tui/tui-winsource.h" | |
| #include "gdb_curses.h" | |
| struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS]; | |
| static int term_height, term_width; | |
| static struct tui_win_info *win_with_focus = NULL; | |
| static bool win_resized = false; | |
| /* Answer a whether the terminal window has been resized or not. */ | |
| bool | |
| tui_win_resized () | |
| { | |
| return win_resized; | |
| } | |
| /* Set a whether the terminal window has been resized or not. */ | |
| void | |
| tui_set_win_resized_to (bool resized) | |
| { | |
| win_resized = resized; | |
| } | |
| /* Answer the window with the logical focus. */ | |
| struct tui_win_info * | |
| tui_win_with_focus (void) | |
| { | |
| return win_with_focus; | |
| } | |
| /* Set the window that has the logical focus. */ | |
| void | |
| tui_set_win_with_focus (struct tui_win_info *win_info) | |
| { | |
| win_with_focus = win_info; | |
| } | |
| /* Accessor for the term_height. */ | |
| int | |
| tui_term_height (void) | |
| { | |
| return term_height; | |
| } | |
| /* Mutator for the term height. */ | |
| void | |
| tui_set_term_height_to (int h) | |
| { | |
| term_height = h; | |
| } | |
| /* Accessor for the term_width. */ | |
| int | |
| tui_term_width (void) | |
| { | |
| return term_width; | |
| } | |
| /* Mutator for the term_width. */ | |
| void | |
| tui_set_term_width_to (int w) | |
| { | |
| term_width = w; | |
| } | |
| /* 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++; | |
| } | |
| } | |
| return next_win; | |
| } | |
| /* Answer the prev window in the list, cycling back to the bottom if | |
| necessary. */ | |
| 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; | |
| } | |
| /* 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; | |
| } | |
| } | |
| } | |
| tui_win_info::tui_win_info (enum tui_win_type type) | |
| : tui_gen_win_info (type) | |
| { | |
| } | |
| void | |
| tui_win_info::rerender () | |
| { | |
| check_and_display_highlight_if_needed (); | |
| } |