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