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