Remove separate visibility flag
[platform/upstream/binutils.git] / gdb / tui / tui-data.h
1 /* TUI data manipulation routines.
2
3    Copyright (C) 1998-2019 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"    /* For enum tui_win_type.  */
26 #include "gdb_curses.h" /* For WINDOW.  */
27 #include "observable.h"
28
29 struct tui_cmd_window;
30 struct tui_source_window_base;
31 struct tui_source_window;
32
33 /* This is a point definition.  */
34 struct tui_point
35 {
36   int x, y;
37 };
38
39 /* Generic window information.  */
40 struct tui_gen_win_info
41 {
42 protected:
43
44   explicit tui_gen_win_info (enum tui_win_type t)
45     : type (t)
46   {
47   }
48
49   /* This is called after the window is resized, and should update the
50      window's contents.  */
51   virtual void rerender ()
52   {
53   }
54
55 public:
56
57   virtual ~tui_gen_win_info ();
58
59   /* Call to refresh this window.  */
60   virtual void refresh_window ();
61
62   /* Make this window visible or invisible.  */
63   virtual void make_visible (bool visible);
64
65   /* Return the name of this type of window.  */
66   virtual const char *name () const
67   {
68     return "";
69   }
70
71   /* Resize this window.  The parameters are used to set the window's
72      size and position.  */
73   virtual void resize (int height, int width,
74                        int origin_x, int origin_y);
75
76   /* Return true if this can be boxed.  */
77   virtual bool can_box () const
78   {
79     return false;
80   }
81
82   /* Return true if this window is visible.  */
83   bool is_visible () const
84   {
85     return handle != nullptr;
86   }
87
88   /* Window handle.  */
89   WINDOW *handle = nullptr;
90   /* Type of window.  */
91   enum tui_win_type type;
92   /* Window width.  */
93   int width = 0;
94   /* Window height.  */
95   int height = 0;
96   /* Origin of window.  */
97   struct tui_point origin = {0, 0};
98   /* Viewport height.  */
99   int viewport_height = 0;
100   /* Window title to display.  */
101   char *title = nullptr;
102 };
103
104 /* Constant definitions.  */
105 #define DEFAULT_TAB_LEN         8
106 #define NO_SRC_STRING           "[ No Source Available ]"
107 #define NO_DISASSEM_STRING      "[ No Assembly Available ]"
108 #define NO_REGS_STRING          "[ Register Values Unavailable ]"
109 #define NO_DATA_STRING          "[ No Data Values Displayed ]"
110 #define SRC_NAME                "src"
111 #define CMD_NAME                "cmd"
112 #define DATA_NAME               "regs"
113 #define DISASSEM_NAME           "asm"
114 #define HILITE                  TRUE
115 #define NO_HILITE               FALSE
116 #define MIN_WIN_HEIGHT          3
117 #define MIN_CMD_WIN_HEIGHT      3
118
119 /* Strings to display in the TUI status line.  */
120 #define PROC_PREFIX             "In: "
121 #define LINE_PREFIX             "L"
122 #define PC_PREFIX               "PC: "
123 #define SINGLE_KEY              "(SingleKey)"
124
125 /* Minimum/Maximum length of some fields displayed in the TUI status
126    line.  */
127 #define MIN_LINE_WIDTH     4    /* Use at least 4 digits for line
128                                    numbers.  */
129 #define MIN_PROC_WIDTH    12
130 #define MAX_TARGET_WIDTH  10
131 #define MAX_PID_WIDTH     19
132
133 /* The kinds of layouts available.  */
134 enum tui_layout_type
135 {
136   SRC_COMMAND,
137   DISASSEM_COMMAND,
138   SRC_DISASSEM_COMMAND,
139   SRC_DATA_COMMAND,
140   DISASSEM_DATA_COMMAND,
141   UNDEFINED_LAYOUT
142 };
143
144 enum tui_line_or_address_kind
145 {
146   LOA_LINE,
147   LOA_ADDRESS
148 };
149
150 /* Structure describing source line or line address.  */
151 struct tui_line_or_address
152 {
153   enum tui_line_or_address_kind loa;
154   union
155     {
156       int line_no;
157       CORE_ADDR addr;
158     } u;
159 };
160
161 /* This defines information about each logical window.  */
162 struct tui_win_info : public tui_gen_win_info
163 {
164 protected:
165
166   explicit tui_win_info (enum tui_win_type type);
167   DISABLE_COPY_AND_ASSIGN (tui_win_info);
168
169   /* Scroll the contents vertically.  This is only called via
170      forward_scroll and backward_scroll.  */
171   virtual void do_scroll_vertical (int num_to_scroll) = 0;
172
173   /* Scroll the contents horizontally.  This is only called via
174      left_scroll and right_scroll.  */
175   virtual void do_scroll_horizontal (int num_to_scroll) = 0;
176
177   void rerender () override;
178
179 public:
180
181   ~tui_win_info () override
182   {
183   }
184
185   /* Called after all the TUI windows are refreshed, to let this
186      window have a chance to update itself further.  */
187   virtual void refresh_all ()
188   {
189   }
190
191   /* Compute the maximum height of this window.  */
192   virtual int max_height () const;
193
194   /* Called after the tab width has been changed.  */
195   virtual void update_tab_width ()
196   {
197   }
198
199   /* Set whether this window is highglighted.  */
200   void set_highlight (bool highlight)
201   {
202     is_highlighted = highlight;
203   }
204
205   /* Methods to scroll the contents of this window.  Note that they
206      are named with "_scroll" coming at the end because the more
207      obvious "scroll_forward" is defined as a macro in term.h.  */
208   void forward_scroll (int num_to_scroll);
209   void backward_scroll (int num_to_scroll);
210   void left_scroll (int num_to_scroll);
211   void right_scroll (int num_to_scroll);
212
213   /* Return true if this window can be scrolled, false otherwise.  */
214   virtual bool can_scroll () const
215   {
216     return true;
217   }
218
219   bool can_box () const override
220   {
221     return true;
222   }
223
224   void check_and_display_highlight_if_needed ();
225
226   /* Can this window ever be highlighted?  */
227   bool can_highlight = true;
228
229   /* Is this window highlighted?  */
230   bool is_highlighted = false;
231 };
232
233 extern int tui_win_is_auxiliary (enum tui_win_type win_type);
234
235
236 /* Global Data.  */
237 extern struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
238
239 #define TUI_SRC_WIN     ((tui_source_window *) tui_win_list[SRC_WIN])
240 #define TUI_DISASM_WIN  ((tui_source_window_base *) tui_win_list[DISASSEM_WIN])
241 #define TUI_DATA_WIN    ((tui_data_window *) tui_win_list[DATA_WIN])
242 #define TUI_CMD_WIN     ((tui_cmd_window *) tui_win_list[CMD_WIN])
243
244 /* An iterator that iterates over all windows.  */
245
246 class tui_window_iterator
247 {
248 public:
249
250   typedef tui_window_iterator self_type;
251   typedef struct tui_win_info *value_type;
252   typedef struct tui_win_info *&reference;
253   typedef struct tui_win_info **pointer;
254   typedef std::forward_iterator_tag iterator_category;
255   typedef int difference_type;
256
257   explicit tui_window_iterator (enum tui_win_type type)
258     : m_type (type)
259   {
260     advance ();
261   }
262
263   tui_window_iterator ()
264     : m_type (MAX_MAJOR_WINDOWS)
265   {
266   }
267
268   bool operator!= (const self_type &other) const
269   {
270     return m_type != other.m_type;
271   }
272
273   value_type operator* () const
274   {
275     gdb_assert (m_type < MAX_MAJOR_WINDOWS);
276     return tui_win_list[m_type];
277   }
278
279   self_type &operator++ ()
280   {
281     ++m_type;
282     advance ();
283     return *this;
284   }
285
286 private:
287
288   void advance ()
289   {
290     while (m_type < MAX_MAJOR_WINDOWS && tui_win_list[m_type] == nullptr)
291       ++m_type;
292   }
293
294   int m_type;
295 };
296
297 /* A range adapter for iterating over TUI windows.  */
298
299 struct all_tui_windows
300 {
301   tui_window_iterator begin () const
302   {
303     return tui_window_iterator (SRC_WIN);
304   }
305
306   tui_window_iterator end () const
307   {
308     return tui_window_iterator ();
309   }
310 };
311
312
313 /* Data Manipulation Functions.  */
314 extern struct tui_win_info *tui_partial_win_by_name (const char *);
315 extern enum tui_layout_type tui_current_layout (void);
316 extern int tui_term_height (void);
317 extern void tui_set_term_height_to (int);
318 extern int tui_term_width (void);
319 extern void tui_set_term_width_to (int);
320 extern struct tui_locator_window *tui_locator_win_info_ptr (void);
321 extern void tui_clear_source_windows_detail (void);
322 extern struct tui_win_info *tui_win_with_focus (void);
323 extern void tui_set_win_with_focus (struct tui_win_info *);
324 extern int tui_win_resized (void);
325 extern void tui_set_win_resized_to (int);
326
327 extern struct tui_win_info *tui_next_win (struct tui_win_info *);
328 extern struct tui_win_info *tui_prev_win (struct tui_win_info *);
329
330 /* Delete all the invisible windows.  Note that it is an error to call
331    this when the command window is invisible -- we don't allow the
332    command window to be removed from the layout.  */
333 extern void tui_delete_invisible_windows ();
334
335 extern unsigned int tui_tab_width;
336
337 #endif /* TUI_TUI_DATA_H */