1 /* TUI data manipulation routines. 2 3 Copyright (C) 1998-2023 Free Software Foundation, Inc. 4 5 Contributed by Hewlett-Packard Company. 6 7 This file is part of GDB. 8 9 This program is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 3 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 21 22 #ifndef TUI_TUI_DATA_H 23 #define TUI_TUI_DATA_H 24 25 #include "tui/tui.h" 26 #include "gdb_curses.h" /* For WINDOW. */ 27 #include "observable.h" 28 29 /* A deleter that calls delwin. */ 30 struct curses_deleter 31 { 32 void operator() (WINDOW *win) const 33 { 34 delwin (win); 35 } 36 }; 37 38 #define MIN_WIN_HEIGHT 3 39 40 /* Generic window information. */ 41 struct tui_win_info 42 { 43 protected: 44 45 tui_win_info () = default; 46 DISABLE_COPY_AND_ASSIGN (tui_win_info); 47 48 /* This is called after the window is resized, and should update the 49 window's contents. */ 50 virtual void rerender (); 51 52 virtual void make_window (); 53 54 public: 55 tui_win_info (tui_win_info &&) = default; 56 virtual ~tui_win_info () = default; 57 58 /* Call to refresh this window. */ 59 virtual void refresh_window (); 60 61 /* Make this window visible or invisible. */ 62 virtual void make_visible (bool visible); 63 64 /* Return the name of this type of window. */ 65 virtual const char *name () const = 0; 66 67 /* Compute the maximum height of this window. */ 68 virtual int max_height () const; 69 70 /* Compute the minimum height of this window. */ 71 virtual int min_height () const 72 { 73 return MIN_WIN_HEIGHT; 74 } 75 76 /* Compute the maximum width of this window. */ 77 int max_width () const; 78 79 /* Compute the minimum width of this window. */ 80 int min_width () const 81 { 82 return 3; 83 } 84 85 /* Return true if this window can be boxed. */ 86 virtual bool can_box () const 87 { 88 return true; 89 } 90 91 /* Resize this window. The parameters are used to set the window's 92 size and position. */ 93 virtual void resize (int height, int width, 94 int origin_x, int origin_y); 95 96 /* Return true if this window is visible. */ 97 bool is_visible () const 98 { 99 return handle != nullptr && tui_active; 100 } 101 102 /* Return true if this window can accept the focus. */ 103 virtual bool can_focus () const 104 { 105 return true; 106 } 107 108 /* Disable output until the next call to doupdate. */ 109 void no_refresh () 110 { 111 if (handle != nullptr) 112 wnoutrefresh (handle.get ()); 113 } 114 115 /* Called after the tab width has been changed. */ 116 virtual void update_tab_width () 117 { 118 } 119 120 /* Set whether this window is highlighted. */ 121 void set_highlight (bool highlight) 122 { 123 is_highlighted = highlight; 124 } 125 126 /* Methods to scroll the contents of this window. Note that they 127 are named with "_scroll" coming at the end because the more 128 obvious "scroll_forward" is defined as a macro in term.h. */ 129 void forward_scroll (int num_to_scroll); 130 void backward_scroll (int num_to_scroll); 131 void left_scroll (int num_to_scroll); 132 void right_scroll (int num_to_scroll); 133 134 /* Return true if this window can be scrolled, false otherwise. */ 135 virtual bool can_scroll () const 136 { 137 return true; 138 } 139 140 /* Called for each mouse click inside this window. Coordinates MOUSE_X 141 and MOUSE_Y are 0-based relative to the window, and MOUSE_BUTTON can 142 be 1 (left), 2 (middle), or 3 (right). */ 143 virtual void click (int mouse_x, int mouse_y, int mouse_button) 144 { 145 } 146 147 void check_and_display_highlight_if_needed (); 148 149 /* Window handle. */ 150 std::unique_ptr<WINDOW, curses_deleter> handle; 151 /* Window width. */ 152 int width = 0; 153 /* Window height. */ 154 int height = 0; 155 /* Origin of window. */ 156 int x = 0; 157 int y = 0; 158 159 /* Window title to display. */ 160 std::string title; 161 162 /* Is this window highlighted? */ 163 bool is_highlighted = false; 164 165 protected: 166 167 /* Scroll the contents vertically. This is only called via 168 forward_scroll and backward_scroll. */ 169 virtual void do_scroll_vertical (int num_to_scroll) = 0; 170 171 /* Scroll the contents horizontally. This is only called via 172 left_scroll and right_scroll. */ 173 virtual void do_scroll_horizontal (int num_to_scroll) = 0; 174 }; 175 176 /* Constant definitions. */ 177 #define SRC_NAME "src" 178 #define CMD_NAME "cmd" 179 #define DATA_NAME "regs" 180 #define DISASSEM_NAME "asm" 181 #define STATUS_NAME "status" 182 183 /* Global Data. */ 184 extern struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS]; 185 186 #define TUI_SRC_WIN ((tui_source_window *) tui_win_list[SRC_WIN]) 187 #define TUI_DISASM_WIN ((tui_disasm_window *) tui_win_list[DISASSEM_WIN]) 188 #define TUI_DATA_WIN ((tui_data_window *) tui_win_list[DATA_WIN]) 189 #define TUI_CMD_WIN ((tui_cmd_window *) tui_win_list[CMD_WIN]) 190 #define TUI_STATUS_WIN ((tui_locator_window *) tui_win_list[STATUS_WIN]) 191 192 /* All the windows that are currently instantiated, in layout 193 order. */ 194 extern std::vector<tui_win_info *> tui_windows; 195 196 /* Return a range adapter for iterating over TUI windows. */ 197 static inline std::vector<tui_win_info *> & 198 all_tui_windows () 199 { 200 return tui_windows; 201 } 202 203 /* Data Manipulation Functions. */ 204 extern int tui_term_height (void); 205 extern void tui_set_term_height_to (int); 206 extern int tui_term_width (void); 207 extern void tui_set_term_width_to (int); 208 extern struct tui_win_info *tui_win_with_focus (void); 209 extern bool tui_win_resized (); 210 extern void tui_set_win_resized_to (bool); 211 212 extern struct tui_win_info *tui_next_win (struct tui_win_info *); 213 extern struct tui_win_info *tui_prev_win (struct tui_win_info *); 214 215 extern unsigned int tui_tab_width; 216 217 #endif /* TUI_TUI_DATA_H */ 218