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