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