Move tui_source_window to tui-source.h
[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;
31
32 /* This is a point definition.  */
33 struct tui_point
34 {
35   int x, y;
36 };
37
38 /* Generic window information.  */
39 struct tui_gen_win_info
40 {
41 protected:
42
43   explicit tui_gen_win_info (enum tui_win_type t)
44     : type (t)
45   {
46   }
47
48 public:
49
50   virtual ~tui_gen_win_info ();
51
52   /* Call to refresh this window.  */
53   virtual void refresh_window ();
54
55   /* Make this window visible or invisible.  */
56   virtual void make_visible (bool visible);
57
58   /* Return the name of this type of window.  */
59   virtual const char *name () const
60   {
61     return "";
62   }
63
64   /* Reset this window.  The parameters are used to set the window's
65      size and position.  */
66   virtual void reset (int height, int width,
67                       int origin_x, int origin_y);
68
69   /* Window handle.  */
70   WINDOW *handle = nullptr;
71   /* Type of window.  */
72   enum tui_win_type type;
73   /* Window width.  */
74   int width = 0;
75   /* Window height.  */
76   int height = 0;
77   /* Origin of window.  */
78   struct tui_point origin = {0, 0};
79   /* Viewport height.  */
80   int viewport_height = 0;
81   /* Index of last visible line.  */
82   int last_visible_line = 0;
83   /* Whether the window is visible or not.  */
84   bool is_visible = false;
85   /* Window title to display.  */
86   char *title = nullptr;
87 };
88
89 /* Whether or not a window should be drawn with a box.  */
90 enum tui_box
91 {
92   DONT_BOX_WINDOW = 0,
93   BOX_WINDOW
94 };
95
96 /* Constant definitions.  */
97 #define DEFAULT_TAB_LEN         8
98 #define NO_SRC_STRING           "[ No Source Available ]"
99 #define NO_DISASSEM_STRING      "[ No Assembly Available ]"
100 #define NO_REGS_STRING          "[ Register Values Unavailable ]"
101 #define NO_DATA_STRING          "[ No Data Values Displayed ]"
102 #define SRC_NAME                "src"
103 #define CMD_NAME                "cmd"
104 #define DATA_NAME               "regs"
105 #define DISASSEM_NAME           "asm"
106 #define HILITE                  TRUE
107 #define NO_HILITE               FALSE
108 #define MIN_WIN_HEIGHT          3
109 #define MIN_CMD_WIN_HEIGHT      3
110
111 /* Strings to display in the TUI status line.  */
112 #define PROC_PREFIX             "In: "
113 #define LINE_PREFIX             "L"
114 #define PC_PREFIX               "PC: "
115 #define SINGLE_KEY              "(SingleKey)"
116
117 /* Minimum/Maximum length of some fields displayed in the TUI status
118    line.  */
119 #define MIN_LINE_WIDTH     4    /* Use at least 4 digits for line
120                                    numbers.  */
121 #define MIN_PROC_WIDTH    12
122 #define MAX_TARGET_WIDTH  10
123 #define MAX_PID_WIDTH     19
124
125 /* The kinds of layouts available.  */
126 enum tui_layout_type
127 {
128   SRC_COMMAND,
129   DISASSEM_COMMAND,
130   SRC_DISASSEM_COMMAND,
131   SRC_DATA_COMMAND,
132   DISASSEM_DATA_COMMAND,
133   UNDEFINED_LAYOUT
134 };
135
136 enum tui_line_or_address_kind
137 {
138   LOA_LINE,
139   LOA_ADDRESS
140 };
141
142 /* Structure describing source line or line address.  */
143 struct tui_line_or_address
144 {
145   enum tui_line_or_address_kind loa;
146   union
147     {
148       int line_no;
149       CORE_ADDR addr;
150     } u;
151 };
152
153 /* Current Layout definition.  */
154 struct tui_layout_def
155 {
156   enum tui_win_type display_mode;
157 };
158
159 /* Flags to tell what kind of breakpoint is at current line.  */
160 enum tui_bp_flag
161 {
162   TUI_BP_ENABLED = 0x01,
163   TUI_BP_DISABLED = 0x02,
164   TUI_BP_HIT = 0x04,
165   TUI_BP_CONDITIONAL = 0x08,
166   TUI_BP_HARDWARE = 0x10
167 };
168
169 DEF_ENUM_FLAGS_TYPE (enum tui_bp_flag, tui_bp_flags);
170
171 /* Elements in the Source/Disassembly Window.  */
172 struct tui_source_element
173 {
174   tui_source_element ()
175   {
176     line_or_addr.loa = LOA_LINE;
177     line_or_addr.u.line_no = 0;
178   }
179
180   ~tui_source_element ()
181   {
182     xfree (line);
183   }
184
185   char *line = nullptr;
186   struct tui_line_or_address line_or_addr;
187   bool is_exec_point = false;
188   tui_bp_flags break_mode = 0;
189 };
190
191
192 #ifdef PATH_MAX
193 # define MAX_LOCATOR_ELEMENT_LEN        PATH_MAX
194 #else
195 # define MAX_LOCATOR_ELEMENT_LEN        1024
196 #endif
197
198 /* Position of breakpoint markers in the exec info string.  */
199 #define TUI_BP_HIT_POS      0
200 #define TUI_BP_BREAK_POS    1
201 #define TUI_EXEC_POS        2
202 #define TUI_EXECINFO_SIZE   4
203
204 typedef char tui_exec_info_content[TUI_EXECINFO_SIZE];
205
206 /* Execution info window class.  */
207
208 struct tui_exec_info_window : public tui_gen_win_info
209 {
210   tui_exec_info_window ()
211     : tui_gen_win_info (EXEC_INFO_WIN)
212   {
213   }
214
215   ~tui_exec_info_window () override
216   {
217     xfree (m_content);
218   }
219
220   /* Get or allocate contents.  */
221   tui_exec_info_content *maybe_allocate_content (int n_elements);
222
223   /* Return the contents.  */
224   const tui_exec_info_content *get_content () const
225   {
226     return m_content;
227   }
228
229 private:
230
231   tui_exec_info_content *m_content = nullptr;
232 };
233
234 /* Locator window class.  */
235
236 struct tui_locator_window : public tui_gen_win_info
237 {
238   tui_locator_window ()
239     : tui_gen_win_info (LOCATOR_WIN)
240   {
241     full_name[0] = 0;
242     proc_name[0] = 0;
243   }
244
245   char full_name[MAX_LOCATOR_ELEMENT_LEN];
246   char proc_name[MAX_LOCATOR_ELEMENT_LEN];
247   int line_no = 0;
248   CORE_ADDR addr = 0;
249   /* Architecture associated with code at this location.  */
250   struct gdbarch *gdbarch = nullptr;
251 };
252
253 /* This defines information about each logical window.  */
254 struct tui_win_info : public tui_gen_win_info
255 {
256 protected:
257
258   explicit tui_win_info (enum tui_win_type type);
259   DISABLE_COPY_AND_ASSIGN (tui_win_info);
260
261   /* Scroll the contents vertically.  This is only called via
262      forward_scroll and backward_scroll.  */
263   virtual void do_scroll_vertical (int num_to_scroll) = 0;
264
265   /* Scroll the contents horizontally.  This is only called via
266      left_scroll and right_scroll.  */
267   virtual void do_scroll_horizontal (int num_to_scroll) = 0;
268
269   /* Called after make_visible_with_new_height sets the new height.
270      Should update the window.  */
271   virtual void do_make_visible_with_new_height () = 0;
272
273 public:
274
275   ~tui_win_info () override
276   {
277   }
278
279   /* Clear the pertinent detail in the window.  */
280   virtual void clear_detail () = 0;
281
282   /* Called after all the TUI windows are refreshed, to let this
283      window have a chance to update itself further.  */
284   virtual void refresh_all ()
285   {
286   }
287
288   /* Called after a TUI window is given a new height; this updates any
289      related auxiliary windows.  */
290   virtual void set_new_height (int height)
291   {
292   }
293
294   /* Compute the maximum height of this window.  */
295   virtual int max_height () const;
296
297   /* Called after the tab width has been changed.  */
298   virtual void update_tab_width ()
299   {
300   }
301
302   /* Make the window visible after the height has been changed.  */
303   void make_visible_with_new_height ();
304
305   /* Set whether this window is highglighted.  */
306   void set_highlight (bool highlight)
307   {
308     is_highlighted = highlight;
309   }
310
311   /* Methods to scroll the contents of this window.  Note that they
312      are named with "_scroll" coming at the end because the more
313      obvious "scroll_forward" is defined as a macro in term.h.  */
314   void forward_scroll (int num_to_scroll);
315   void backward_scroll (int num_to_scroll);
316   void left_scroll (int num_to_scroll);
317   void right_scroll (int num_to_scroll);
318
319   /* Return true if this window can be scrolled, false otherwise.  */
320   virtual bool can_scroll () const
321   {
322     return true;
323   }
324
325   /* Can this window ever be highlighted?  */
326   bool can_highlight = true;
327
328   /* Is this window highlighted?  */
329   bool is_highlighted = false;
330 };
331
332 /* The base class for all source-like windows, namely the source and
333    disassembly windows.  */
334
335 struct tui_source_window_base : public tui_win_info
336 {
337 protected:
338   explicit tui_source_window_base (enum tui_win_type type);
339   ~tui_source_window_base () override;
340   DISABLE_COPY_AND_ASSIGN (tui_source_window_base);
341
342   void do_scroll_horizontal (int num_to_scroll) override;
343   void do_make_visible_with_new_height () override;
344
345 public:
346
347   void clear_detail () override;
348
349   void make_visible (bool visible) override;
350   void refresh_window () override;
351   void refresh_all () override;
352
353   /* Refill the source window's source cache and update it.  If this
354      is a disassembly window, then just update it.  */
355   void refill ();
356
357   /* Set the location of the execution point.  */
358   void set_is_exec_point_at (struct tui_line_or_address l);
359
360   void set_new_height (int height) override;
361
362   void update_tab_width () override;
363
364   /* Return true if the location LOC corresponds to the line number
365      LINE_NO in this source window; false otherwise.  */
366   virtual bool location_matches_p (struct bp_location *loc, int line_no) = 0;
367
368   void reset (int height, int width,
369               int origin_x, int origin_y) override;
370
371   /* Does the locator belong to this window?  */
372   bool m_has_locator = false;
373   /* Execution information window.  */
374   struct tui_exec_info_window *execution_info;
375   /* Used for horizontal scroll.  */
376   int horizontal_offset = 0;
377   struct tui_line_or_address start_line_or_addr;
378
379   /* It is the resolved form as returned by symtab_to_fullname.  */
380   char *fullname = nullptr;
381
382   /* Architecture associated with code at this location.  */
383   struct gdbarch *gdbarch = nullptr;
384
385   std::vector<tui_source_element> content;
386 };
387
388 extern int tui_win_is_auxiliary (enum tui_win_type win_type);
389
390
391 /* Global Data.  */
392 extern struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
393
394 #define TUI_SRC_WIN     ((tui_source_window *) tui_win_list[SRC_WIN])
395 #define TUI_DISASM_WIN  ((tui_source_window_base *) tui_win_list[DISASSEM_WIN])
396 #define TUI_DATA_WIN    ((tui_data_window *) tui_win_list[DATA_WIN])
397 #define TUI_CMD_WIN     ((tui_cmd_window *) tui_win_list[CMD_WIN])
398
399 /* An iterator that iterates over all windows.  */
400
401 class tui_window_iterator
402 {
403 public:
404
405   typedef tui_window_iterator self_type;
406   typedef struct tui_win_info *value_type;
407   typedef struct tui_win_info *&reference;
408   typedef struct tui_win_info **pointer;
409   typedef std::forward_iterator_tag iterator_category;
410   typedef int difference_type;
411
412   explicit tui_window_iterator (enum tui_win_type type)
413     : m_type (type)
414   {
415     advance ();
416   }
417
418   tui_window_iterator ()
419     : m_type (MAX_MAJOR_WINDOWS)
420   {
421   }
422
423   bool operator!= (const self_type &other) const
424   {
425     return m_type != other.m_type;
426   }
427
428   value_type operator* () const
429   {
430     gdb_assert (m_type < MAX_MAJOR_WINDOWS);
431     return tui_win_list[m_type];
432   }
433
434   self_type &operator++ ()
435   {
436     ++m_type;
437     advance ();
438     return *this;
439   }
440
441 private:
442
443   void advance ()
444   {
445     while (m_type < MAX_MAJOR_WINDOWS && tui_win_list[m_type] == nullptr)
446       ++m_type;
447   }
448
449   int m_type;
450 };
451
452 /* A range adapter for iterating over TUI windows.  */
453
454 struct all_tui_windows
455 {
456   tui_window_iterator begin () const
457   {
458     return tui_window_iterator (SRC_WIN);
459   }
460
461   tui_window_iterator end () const
462   {
463     return tui_window_iterator ();
464   }
465 };
466
467
468 /* Data Manipulation Functions.  */
469 extern void tui_initialize_static_data (void);
470 extern struct tui_win_info *tui_partial_win_by_name (const char *);
471 extern enum tui_layout_type tui_current_layout (void);
472 extern void tui_set_current_layout_to (enum tui_layout_type);
473 extern int tui_term_height (void);
474 extern void tui_set_term_height_to (int);
475 extern int tui_term_width (void);
476 extern void tui_set_term_width_to (int);
477 extern struct tui_locator_window *tui_locator_win_info_ptr (void);
478 extern std::vector<tui_source_window_base *> &tui_source_windows ();
479 extern void tui_clear_source_windows (void);
480 extern void tui_clear_source_windows_detail (void);
481 extern void tui_add_to_source_windows (struct tui_source_window_base *);
482 extern struct tui_win_info *tui_win_with_focus (void);
483 extern void tui_set_win_with_focus (struct tui_win_info *);
484 extern struct tui_layout_def *tui_layout_def (void);
485 extern int tui_win_resized (void);
486 extern void tui_set_win_resized_to (int);
487
488 extern struct tui_win_info *tui_next_win (struct tui_win_info *);
489 extern struct tui_win_info *tui_prev_win (struct tui_win_info *);
490
491 extern unsigned int tui_tab_width;
492
493 #endif /* TUI_TUI_DATA_H */