]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/tui/tui-data.h
Fix comment typos
[thirdparty/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
1cc6d956 34/* Generic window information. */
2a8854a7
AC
35struct tui_gen_win_info
36{
fb54fa76
TT
37protected:
38
ab313b35
TT
39 explicit tui_gen_win_info (enum tui_win_type t)
40 : type (t)
41 {
42 }
43
fb54fa76
TT
44public:
45
f936bca2 46 virtual ~tui_gen_win_info ();
ab313b35 47
5b81daba
TT
48 /* Call to refresh this window. */
49 virtual void refresh_window ();
50
48a3bd16
TT
51 /* Make this window visible or invisible. */
52 virtual void make_visible (bool visible);
53
152f3f4b
TT
54 /* Return the name of this type of window. */
55 virtual const char *name () const
56 {
57 return "";
58 }
59
d6ba6a11
TT
60 /* Reset this window. WIN_TYPE must match the existing type of this
61 window (it is only passed for self-test purposes). The other
62 parameters are used to set the window's size and position. */
63 void reset (enum tui_win_type win_type,
64 int height, int width,
65 int origin_x, int origin_y);
66
ab313b35
TT
67 /* Window handle. */
68 WINDOW *handle = nullptr;
69 /* Type of window. */
70 enum tui_win_type type;
71 /* Window width. */
72 int width = 0;
73 /* Window height. */
74 int height = 0;
75 /* Origin of window. */
76 struct tui_point origin = {0, 0};
ab313b35
TT
77 /* Can it be used, or is it already used? */
78 int content_in_use = FALSE;
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;
2a8854a7 87};
2a5127c4 88
17374de4
TT
89/* Whether or not a window should be drawn with a box. */
90enum tui_box
91{
92 DONT_BOX_WINDOW = 0,
93 BOX_WINDOW
94};
95
1cc6d956 96/* Constant definitions. */
08ef48c5
MS
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 MAX_CONTENT_COUNT 100
6dce28e4
AB
103#define SRC_NAME "src"
104#define CMD_NAME "cmd"
105#define DATA_NAME "regs"
106#define DISASSEM_NAME "asm"
08ef48c5
MS
107#define TUI_NULL_STR ""
108#define DEFAULT_HISTORY_COUNT 25
08ef48c5
MS
109#define HILITE TRUE
110#define NO_HILITE FALSE
111#define WITH_LOCATOR TRUE
112#define NO_LOCATOR FALSE
113#define EMPTY_SOURCE_PROMPT TRUE
114#define NO_EMPTY_SOURCE_PROMPT FALSE
115#define UNDEFINED_ITEM -1
116#define MIN_WIN_HEIGHT 3
117#define MIN_CMD_WIN_HEIGHT 3
c906108c 118
50265402 119/* Strings to display in the TUI status line. */
08ef48c5 120#define PROC_PREFIX "In: "
9f2850ba 121#define LINE_PREFIX "L"
08ef48c5
MS
122#define PC_PREFIX "PC: "
123#define SINGLE_KEY "(SingleKey)"
50265402 124
1cc6d956
MS
125/* Minimum/Maximum length of some fields displayed in the TUI status
126 line. */
127#define MIN_LINE_WIDTH 4 /* Use at least 4 digits for line
128 numbers. */
50265402
SC
129#define MIN_PROC_WIDTH 12
130#define MAX_TARGET_WIDTH 10
9f2850ba 131#define MAX_PID_WIDTH 19
c906108c 132
1cc6d956 133/* The kinds of layouts available. */
2a8854a7
AC
134enum tui_layout_type
135{
136 SRC_COMMAND,
137 DISASSEM_COMMAND,
138 SRC_DISASSEM_COMMAND,
139 SRC_DATA_COMMAND,
140 DISASSEM_DATA_COMMAND,
141 UNDEFINED_LAYOUT
142};
c906108c 143
52059ffd
TT
144enum tui_line_or_address_kind
145{
146 LOA_LINE,
147 LOA_ADDRESS
148};
149
1cc6d956 150/* Structure describing source line or line address. */
362c05fe 151struct tui_line_or_address
2a8854a7 152{
52059ffd 153 enum tui_line_or_address_kind loa;
362c05fe
AS
154 union
155 {
156 int line_no;
157 CORE_ADDR addr;
158 } u;
2a8854a7 159};
c906108c 160
1cc6d956 161/* Current Layout definition. */
2a8854a7
AC
162struct tui_layout_def
163{
6d012f14 164 enum tui_win_type display_mode;
2a8854a7 165};
c906108c 166
0598af48
TT
167/* Flags to tell what kind of breakpoint is at current line. */
168enum tui_bp_flag
169{
170 TUI_BP_ENABLED = 0x01,
171 TUI_BP_DISABLED = 0x02,
172 TUI_BP_HIT = 0x04,
173 TUI_BP_CONDITIONAL = 0x08,
174 TUI_BP_HARDWARE = 0x10
175};
176
177DEF_ENUM_FLAGS_TYPE (enum tui_bp_flag, tui_bp_flags);
178
1cc6d956 179/* Elements in the Source/Disassembly Window. */
2a8854a7
AC
180struct tui_source_element
181{
53e7cdba
TT
182 tui_source_element ()
183 {
184 line_or_addr.loa = LOA_LINE;
185 line_or_addr.u.line_no = 0;
186 }
187
188 ~tui_source_element ()
189 {
190 xfree (line);
191 }
192
193 char *line = nullptr;
362c05fe 194 struct tui_line_or_address line_or_addr;
53e7cdba 195 bool is_exec_point = false;
0598af48 196 tui_bp_flags break_mode = 0;
2a8854a7 197};
c906108c
SS
198
199
2d42f9a8
JB
200#ifdef PATH_MAX
201# define MAX_LOCATOR_ELEMENT_LEN PATH_MAX
202#else
203# define MAX_LOCATOR_ELEMENT_LEN 1024
204#endif
c906108c 205
00b2bad4
SC
206/* Position of breakpoint markers in the exec info string. */
207#define TUI_BP_HIT_POS 0
208#define TUI_BP_BREAK_POS 1
209#define TUI_EXEC_POS 2
210#define TUI_EXECINFO_SIZE 4
211
2a8854a7 212typedef char tui_exec_info_content[TUI_EXECINFO_SIZE];
c906108c 213
489e9d8b
TT
214/* Execution info window class. */
215
216struct tui_exec_info_window : public tui_gen_win_info
217{
218 tui_exec_info_window ()
219 : tui_gen_win_info (EXEC_INFO_WIN)
220 {
221 }
222
223 ~tui_exec_info_window () override
224 {
225 xfree (m_content);
226 }
227
228 /* Get or allocate contents. */
229 tui_exec_info_content *maybe_allocate_content (int n_elements);
230
231 /* Return the contents. */
232 const tui_exec_info_content *get_content () const
233 {
234 return m_content;
235 }
236
237private:
238
239 tui_exec_info_content *m_content = nullptr;
240};
241
3add462f
TT
242/* Locator window class. */
243
244struct tui_locator_window : public tui_gen_win_info
245{
246 tui_locator_window ()
247 : tui_gen_win_info (LOCATOR_WIN)
248 {
249 full_name[0] = 0;
250 proc_name[0] = 0;
251 }
252
253 char full_name[MAX_LOCATOR_ELEMENT_LEN];
254 char proc_name[MAX_LOCATOR_ELEMENT_LEN];
255 int line_no = 0;
256 CORE_ADDR addr = 0;
257 /* Architecture associated with code at this location. */
258 struct gdbarch *gdbarch = nullptr;
259};
260
41bcff7f
TT
261/* A data item window. */
262
263struct tui_data_item_window : public tui_gen_win_info
264{
265 tui_data_item_window ()
266 : tui_gen_win_info (DATA_ITEM_WIN)
267 {
268 }
269
270 ~tui_data_item_window () override;
271
272 const char *name = nullptr;
273 /* The register number, or data display number. */
274 int item_no = UNDEFINED_ITEM;
41bcff7f
TT
275 void *value = nullptr;
276 bool highlight = false;
277 char *content = nullptr;
278};
279
1cc6d956 280/* This defines information about each logical window. */
cb2ce893 281struct tui_win_info : public tui_gen_win_info
2a8854a7 282{
33b906ab 283protected:
e7e11af4 284
33b906ab 285 explicit tui_win_info (enum tui_win_type type);
6792b55e
TT
286 DISABLE_COPY_AND_ASSIGN (tui_win_info);
287
13446e05
TT
288 /* Scroll the contents vertically. This is only called via
289 forward_scroll and backward_scroll. */
c3bd716f 290 virtual void do_scroll_vertical (int num_to_scroll) = 0;
13446e05
TT
291
292 /* Scroll the contents horizontally. This is only called via
293 left_scroll and right_scroll. */
c3bd716f 294 virtual void do_scroll_horizontal (int num_to_scroll) = 0;
13446e05 295
5fcee43a
TT
296 /* Called after make_visible_with_new_height sets the new height.
297 Should update the window. */
298 virtual void do_make_visible_with_new_height () = 0;
299
33b906ab
TT
300public:
301
f936bca2
TT
302 ~tui_win_info () override
303 {
304 }
33b906ab 305
8761a91b
TT
306 /* Clear the pertinent detail in the window. */
307 virtual void clear_detail () = 0;
308
44f0e208
TT
309 /* Return true if this window has the locator. */
310 virtual bool has_locator () const
311 {
312 return false;
313 }
314
2042b506
TT
315 /* Refresh this window and any associated windows. */
316 virtual void refresh ();
317
1825f487
TT
318 /* Called after all the TUI windows are refreshed, to let this
319 window have a chance to update itself further. */
320 virtual void refresh_all ()
321 {
322 }
323
3f02ce1e
TT
324 /* Called after a TUI window is given a new height; this updates any
325 related auxiliary windows. */
326 virtual void set_new_height (int height)
327 {
328 }
329
8903bd8a
TT
330 /* Compute the maximum height of this window. */
331 virtual int max_height () const;
332
d83f1fe6
TT
333 /* Called after the tab width has been changed. */
334 virtual void update_tab_width ()
335 {
336 }
337
5fcee43a
TT
338 /* Make the window visible after the height has been changed. */
339 void make_visible_with_new_height ();
340
214a5cbe
TT
341 /* Set whether this window is highglighted. */
342 void set_highlight (bool highlight)
343 {
344 is_highlighted = highlight;
345 }
346
13446e05
TT
347 /* Methods to scroll the contents of this window. Note that they
348 are named with "_scroll" coming at the end because the more
349 obvious "scroll_forward" is defined as a macro in term.h. */
350 void forward_scroll (int num_to_scroll);
351 void backward_scroll (int num_to_scroll);
352 void left_scroll (int num_to_scroll);
353 void right_scroll (int num_to_scroll);
354
06210ce4
TT
355 /* Return true if this window can be scrolled, false otherwise. */
356 virtual bool can_scroll () const
357 {
358 return true;
359 }
360
33b906ab 361 /* Can this window ever be highlighted? */
d6ba6a11 362 bool can_highlight = true;
33b906ab
TT
363
364 /* Is this window highlighted? */
214a5cbe 365 bool is_highlighted = false;
33b906ab
TT
366};
367
5cf82909
TT
368/* The base class for all source-like windows, namely the source and
369 disassembly windows. */
370
371struct tui_source_window_base : public tui_win_info
33b906ab 372{
5cf82909
TT
373protected:
374 explicit tui_source_window_base (enum tui_win_type type);
375 ~tui_source_window_base () override;
376 DISABLE_COPY_AND_ASSIGN (tui_source_window_base);
377
c3bd716f 378 void do_scroll_horizontal (int num_to_scroll) override;
5fcee43a 379 void do_make_visible_with_new_height () override;
13446e05 380
5cf82909 381public:
8761a91b
TT
382
383 void clear_detail () override;
44f0e208
TT
384
385 /* Return true if this window has the locator. */
e6e41501
TT
386 bool has_locator () const override
387 {
388 return m_has_locator;
389 }
390
56122977 391 void make_visible (bool visible) override;
2042b506 392 void refresh () override;
1825f487 393 void refresh_all () override;
cda37efb 394
ad54d15b
TT
395 /* Refill the source window's source cache and update it. If this
396 is a disassembly window, then just update it. */
397 void refill ();
398
399 /* Set the location of the execution point. */
400 void set_is_exec_point_at (struct tui_line_or_address l);
401
3f02ce1e
TT
402 void set_new_height (int height) override;
403
d83f1fe6
TT
404 void update_tab_width () override;
405
e6e41501
TT
406 /* Does the locator belong to this window? */
407 bool m_has_locator = false;
408 /* Execution information window. */
489e9d8b 409 struct tui_exec_info_window *execution_info = nullptr;
e6e41501
TT
410 /* Used for horizontal scroll. */
411 int horizontal_offset = 0;
412 struct tui_line_or_address start_line_or_addr;
413
414 /* It is the resolved form as returned by symtab_to_fullname. */
415 char *fullname = nullptr;
416
417 /* Architecture associated with code at this location. */
418 struct gdbarch *gdbarch = nullptr;
53e7cdba
TT
419
420 std::vector<tui_source_element> content;
33b906ab
TT
421};
422
5cf82909
TT
423/* A TUI source window. */
424
425struct tui_source_window : public tui_source_window_base
426{
427 tui_source_window ()
428 : tui_source_window_base (SRC_WIN)
429 {
430 }
431
432 DISABLE_COPY_AND_ASSIGN (tui_source_window);
13446e05 433
152f3f4b
TT
434 const char *name () const override
435 {
436 return SRC_NAME;
437 }
438
13446e05
TT
439protected:
440
c3bd716f 441 void do_scroll_vertical (int num_to_scroll) override;
5cf82909
TT
442};
443
444/* A TUI disassembly window. */
445
446struct tui_disasm_window : public tui_source_window_base
447{
448 tui_disasm_window ()
449 : tui_source_window_base (DISASSEM_WIN)
450 {
451 }
452
453 DISABLE_COPY_AND_ASSIGN (tui_disasm_window);
13446e05 454
152f3f4b
TT
455 const char *name () const override
456 {
457 return DISASSEM_NAME;
458 }
459
13446e05
TT
460protected:
461
c3bd716f 462 void do_scroll_vertical (int num_to_scroll) override;
5cf82909
TT
463};
464
33b906ab
TT
465struct tui_data_window : public tui_win_info
466{
63901aec
TT
467 tui_data_window ()
468 : tui_win_info (DATA_WIN)
469 {
470 }
471
33b906ab 472 DISABLE_COPY_AND_ASSIGN (tui_data_window);
8761a91b
TT
473
474 void clear_detail () override;
1825f487 475 void refresh_all () override;
13446e05 476
3f02ce1e
TT
477 void set_new_height (int height) override;
478
5b81daba
TT
479 void refresh_window () override;
480
152f3f4b
TT
481 const char *name () const override
482 {
483 return DATA_NAME;
484 }
485
21e1c91e
TT
486 /* Windows that are used to display registers. */
487 std::vector<std::unique_ptr<tui_data_item_window>> regs_content;
63901aec
TT
488 int regs_column_count = 0;
489 /* Should regs be displayed at all? */
490 bool display_regs = false;
491 struct reggroup *current_group = nullptr;
238eb706 492
0b5ec218
TT
493 /* Answer the number of the last line in the regs display. If there
494 are no registers (-1) is returned. */
495 int last_regs_line_no () const;
496
3b23c5f2
TT
497 /* Answer the line number that the register element at element_no is
498 on. If element_no is greater than the number of register
499 elements there are, -1 is returned. */
500 int line_from_reg_element_no (int element_no) const;
501
baff0c28
TT
502 /* Answer the index of the first element in line_no. If line_no is
503 past the register area (-1) is returned. */
504 int first_reg_element_no_inline (int line_no) const;
505
50daf268
TT
506 /* Displays the data that is in the data window's content. It does
507 not set the content. */
508 void display_all_data ();
509
b4094625
TT
510 /* Delete all the item windows in the data window. This is usually
511 done when the data window is scrolled. */
512 void delete_data_content_windows ();
513
f76d8b19
TT
514 void erase_data_content (const char *prompt);
515
517e9505
TT
516 /* Display the registers in the content from 'start_element_no'
517 until the end of the register content or the end of the display
518 height. No checking for displaying past the end of the registers
519 is done here. */
520 void display_registers_from (int start_element_no);
521
522 /* Display the registers starting at line line_no in the data
523 window. Answers the line number that the display actually
524 started from. If nothing is displayed (-1) is returned. */
525 int display_registers_from_line (int line_no);
526
13446e05
TT
527protected:
528
c3bd716f
TT
529 void do_scroll_vertical (int num_to_scroll) override;
530 void do_scroll_horizontal (int num_to_scroll) override
13446e05
TT
531 {
532 }
5fcee43a 533 void do_make_visible_with_new_height () override;
eaf9738b
TT
534
535 /* Return the index of the first element displayed. If none are
536 displayed, then return -1. */
537 int first_data_item_displayed ();
aca2dd16
TT
538
539 /* Display the registers in the content from 'start_element_no' on
540 'start_line_no' until the end of the register content or the end
541 of the display height. This function checks that we won't
542 display off the end of the register display. */
543 void display_reg_element_at_line (int start_element_no, int start_line_no);
33b906ab
TT
544};
545
546struct tui_cmd_window : public tui_win_info
547{
63901aec
TT
548 tui_cmd_window ()
549 : tui_win_info (CMD_WIN)
550 {
d6ba6a11 551 can_highlight = false;
63901aec
TT
552 }
553
33b906ab 554 DISABLE_COPY_AND_ASSIGN (tui_cmd_window);
8761a91b
TT
555
556 void clear_detail () override;
13446e05 557
56122977 558 void make_visible (bool visible) override
cda37efb
TT
559 {
560 }
561
8903bd8a
TT
562 int max_height () const override;
563
5b81daba
TT
564 void refresh_window () override
565 {
566 }
567
152f3f4b
TT
568 const char *name () const override
569 {
570 return CMD_NAME;
571 }
572
06210ce4
TT
573 bool can_scroll () const override
574 {
575 return false;
576 }
577
63901aec 578 int start_line = 0;
81491aa0 579
13446e05
TT
580protected:
581
c3bd716f 582 void do_scroll_vertical (int num_to_scroll) override
13446e05
TT
583 {
584 }
585
c3bd716f 586 void do_scroll_horizontal (int num_to_scroll) override
13446e05
TT
587 {
588 }
5fcee43a
TT
589
590 void do_make_visible_with_new_height () override;
2a8854a7 591};
c906108c 592
6658b1bf 593extern int tui_win_is_auxiliary (enum tui_win_type win_type);
c906108c
SS
594
595
1cc6d956 596/* Global Data. */
7fa29be9 597extern struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
c906108c 598
e6e41501
TT
599#define TUI_SRC_WIN ((tui_source_window_base *) tui_win_list[SRC_WIN])
600#define TUI_DISASM_WIN ((tui_source_window_base *) tui_win_list[DISASSEM_WIN])
238eb706 601#define TUI_DATA_WIN ((tui_data_window *) tui_win_list[DATA_WIN])
81491aa0 602#define TUI_CMD_WIN ((tui_cmd_window *) tui_win_list[CMD_WIN])
c906108c 603
1ce3e844
TT
604/* An iterator that iterates over all windows. */
605
606class tui_window_iterator
607{
608public:
609
610 typedef tui_window_iterator self_type;
611 typedef struct tui_win_info *value_type;
612 typedef struct tui_win_info *&reference;
613 typedef struct tui_win_info **pointer;
614 typedef std::forward_iterator_tag iterator_category;
615 typedef int difference_type;
616
617 explicit tui_window_iterator (enum tui_win_type type)
618 : m_type (type)
619 {
620 advance ();
621 }
622
623 tui_window_iterator ()
624 : m_type (MAX_MAJOR_WINDOWS)
625 {
626 }
627
628 bool operator!= (const self_type &other) const
629 {
630 return m_type != other.m_type;
631 }
632
633 value_type operator* () const
634 {
635 gdb_assert (m_type < MAX_MAJOR_WINDOWS);
636 return tui_win_list[m_type];
637 }
638
639 self_type &operator++ ()
640 {
641 ++m_type;
642 advance ();
643 return *this;
644 }
645
646private:
647
648 void advance ()
649 {
650 while (m_type < MAX_MAJOR_WINDOWS && tui_win_list[m_type] == nullptr)
651 ++m_type;
652 }
653
654 int m_type;
655};
656
657/* A range adapter for iterating over TUI windows. */
658
659struct all_tui_windows
660{
661 tui_window_iterator begin () const
662 {
663 return tui_window_iterator (SRC_WIN);
664 }
665
666 tui_window_iterator end () const
667 {
668 return tui_window_iterator ();
669 }
670};
671
672
1cc6d956 673/* Data Manipulation Functions. */
dd1abb8c 674extern void tui_initialize_static_data (void);
a121b7c1 675extern struct tui_win_info *tui_partial_win_by_name (const char *);
2a8854a7
AC
676extern enum tui_layout_type tui_current_layout (void);
677extern void tui_set_current_layout_to (enum tui_layout_type);
dd1abb8c
AC
678extern int tui_term_height (void);
679extern void tui_set_term_height_to (int);
680extern int tui_term_width (void);
681extern void tui_set_term_width_to (int);
3add462f 682extern struct tui_locator_window *tui_locator_win_info_ptr (void);
ad54d15b 683extern std::vector<tui_source_window_base *> &tui_source_windows ();
dd1abb8c
AC
684extern void tui_clear_source_windows (void);
685extern void tui_clear_source_windows_detail (void);
ad54d15b 686extern void tui_add_to_source_windows (struct tui_source_window_base *);
dd1abb8c
AC
687extern struct tui_win_info *tui_win_with_focus (void);
688extern void tui_set_win_with_focus (struct tui_win_info *);
5b6fe301 689extern struct tui_layout_def *tui_layout_def (void);
dd1abb8c
AC
690extern int tui_win_resized (void);
691extern void tui_set_win_resized_to (int);
692
693extern struct tui_win_info *tui_next_win (struct tui_win_info *);
694extern struct tui_win_info *tui_prev_win (struct tui_win_info *);
695
7806cea7
TT
696extern unsigned int tui_tab_width;
697
1a5c2598 698#endif /* TUI_TUI_DATA_H */