Change tui_set_layout to return void
[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. */
b73dd877 27#include "observable.h"
6a83354a
AC
28
29/* This is a point definition. */
30struct tui_point
31{
32 int x, y;
33};
2a5127c4 34
1cc6d956 35/* Generic window information. */
2a8854a7
AC
36struct tui_gen_win_info
37{
fb54fa76
TT
38protected:
39
ab313b35
TT
40 explicit tui_gen_win_info (enum tui_win_type t)
41 : type (t)
42 {
43 }
44
fb54fa76
TT
45public:
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
1e0c09ba
TT
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,
098f9ed4 64 int origin_x, int origin_y);
d6ba6a11 65
ab313b35
TT
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};
ab313b35
TT
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;
2a8854a7 84};
2a5127c4 85
17374de4
TT
86/* Whether or not a window should be drawn with a box. */
87enum tui_box
88{
89 DONT_BOX_WINDOW = 0,
90 BOX_WINDOW
91};
92
1cc6d956 93/* Constant definitions. */
08ef48c5
MS
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 ]"
6dce28e4
AB
99#define SRC_NAME "src"
100#define CMD_NAME "cmd"
101#define DATA_NAME "regs"
102#define DISASSEM_NAME "asm"
08ef48c5
MS
103#define HILITE TRUE
104#define NO_HILITE FALSE
08ef48c5
MS
105#define MIN_WIN_HEIGHT 3
106#define MIN_CMD_WIN_HEIGHT 3
c906108c 107
50265402 108/* Strings to display in the TUI status line. */
08ef48c5 109#define PROC_PREFIX "In: "
9f2850ba 110#define LINE_PREFIX "L"
08ef48c5
MS
111#define PC_PREFIX "PC: "
112#define SINGLE_KEY "(SingleKey)"
50265402 113
1cc6d956
MS
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. */
50265402
SC
118#define MIN_PROC_WIDTH 12
119#define MAX_TARGET_WIDTH 10
9f2850ba 120#define MAX_PID_WIDTH 19
c906108c 121
1cc6d956 122/* The kinds of layouts available. */
2a8854a7
AC
123enum 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};
c906108c 132
52059ffd
TT
133enum tui_line_or_address_kind
134{
135 LOA_LINE,
136 LOA_ADDRESS
137};
138
1cc6d956 139/* Structure describing source line or line address. */
362c05fe 140struct tui_line_or_address
2a8854a7 141{
52059ffd 142 enum tui_line_or_address_kind loa;
362c05fe
AS
143 union
144 {
145 int line_no;
146 CORE_ADDR addr;
147 } u;
2a8854a7 148};
c906108c 149
1cc6d956 150/* Current Layout definition. */
2a8854a7
AC
151struct tui_layout_def
152{
6d012f14 153 enum tui_win_type display_mode;
2a8854a7 154};
c906108c 155
0598af48
TT
156/* Flags to tell what kind of breakpoint is at current line. */
157enum 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
166DEF_ENUM_FLAGS_TYPE (enum tui_bp_flag, tui_bp_flags);
167
1cc6d956 168/* Elements in the Source/Disassembly Window. */
2a8854a7
AC
169struct tui_source_element
170{
53e7cdba
TT
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;
362c05fe 183 struct tui_line_or_address line_or_addr;
53e7cdba 184 bool is_exec_point = false;
0598af48 185 tui_bp_flags break_mode = 0;
2a8854a7 186};
c906108c
SS
187
188
2d42f9a8
JB
189#ifdef PATH_MAX
190# define MAX_LOCATOR_ELEMENT_LEN PATH_MAX
191#else
192# define MAX_LOCATOR_ELEMENT_LEN 1024
193#endif
c906108c 194
00b2bad4
SC
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
2a8854a7 201typedef char tui_exec_info_content[TUI_EXECINFO_SIZE];
c906108c 202
489e9d8b
TT
203/* Execution info window class. */
204
205struct 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
226private:
227
228 tui_exec_info_content *m_content = nullptr;
229};
230
3add462f
TT
231/* Locator window class. */
232
233struct 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
41bcff7f
TT
250/* A data item window. */
251
252struct 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. */
d1b6f1e5 263 int item_no = -1;
41bcff7f
TT
264 void *value = nullptr;
265 bool highlight = false;
266 char *content = nullptr;
267};
268
1cc6d956 269/* This defines information about each logical window. */
cb2ce893 270struct tui_win_info : public tui_gen_win_info
2a8854a7 271{
33b906ab 272protected:
e7e11af4 273
33b906ab 274 explicit tui_win_info (enum tui_win_type type);
6792b55e
TT
275 DISABLE_COPY_AND_ASSIGN (tui_win_info);
276
13446e05
TT
277 /* Scroll the contents vertically. This is only called via
278 forward_scroll and backward_scroll. */
c3bd716f 279 virtual void do_scroll_vertical (int num_to_scroll) = 0;
13446e05
TT
280
281 /* Scroll the contents horizontally. This is only called via
282 left_scroll and right_scroll. */
c3bd716f 283 virtual void do_scroll_horizontal (int num_to_scroll) = 0;
13446e05 284
5fcee43a
TT
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
33b906ab
TT
289public:
290
f936bca2
TT
291 ~tui_win_info () override
292 {
293 }
33b906ab 294
8761a91b
TT
295 /* Clear the pertinent detail in the window. */
296 virtual void clear_detail () = 0;
297
44f0e208
TT
298 /* Return true if this window has the locator. */
299 virtual bool has_locator () const
300 {
301 return false;
302 }
303
1825f487
TT
304 /* Called after all the TUI windows are refreshed, to let this
305 window have a chance to update itself further. */
306 virtual void refresh_all ()
307 {
308 }
309
3f02ce1e
TT
310 /* Called after a TUI window is given a new height; this updates any
311 related auxiliary windows. */
312 virtual void set_new_height (int height)
313 {
314 }
315
8903bd8a
TT
316 /* Compute the maximum height of this window. */
317 virtual int max_height () const;
318
d83f1fe6
TT
319 /* Called after the tab width has been changed. */
320 virtual void update_tab_width ()
321 {
322 }
323
5fcee43a
TT
324 /* Make the window visible after the height has been changed. */
325 void make_visible_with_new_height ();
326
214a5cbe
TT
327 /* Set whether this window is highglighted. */
328 void set_highlight (bool highlight)
329 {
330 is_highlighted = highlight;
331 }
332
13446e05
TT
333 /* Methods to scroll the contents of this window. Note that they
334 are named with "_scroll" coming at the end because the more
335 obvious "scroll_forward" is defined as a macro in term.h. */
336 void forward_scroll (int num_to_scroll);
337 void backward_scroll (int num_to_scroll);
338 void left_scroll (int num_to_scroll);
339 void right_scroll (int num_to_scroll);
340
06210ce4
TT
341 /* Return true if this window can be scrolled, false otherwise. */
342 virtual bool can_scroll () const
343 {
344 return true;
345 }
346
33b906ab 347 /* Can this window ever be highlighted? */
d6ba6a11 348 bool can_highlight = true;
33b906ab
TT
349
350 /* Is this window highlighted? */
214a5cbe 351 bool is_highlighted = false;
33b906ab
TT
352};
353
5cf82909
TT
354/* The base class for all source-like windows, namely the source and
355 disassembly windows. */
356
357struct tui_source_window_base : public tui_win_info
33b906ab 358{
5cf82909
TT
359protected:
360 explicit tui_source_window_base (enum tui_win_type type);
361 ~tui_source_window_base () override;
362 DISABLE_COPY_AND_ASSIGN (tui_source_window_base);
363
c3bd716f 364 void do_scroll_horizontal (int num_to_scroll) override;
5fcee43a 365 void do_make_visible_with_new_height () override;
13446e05 366
5cf82909 367public:
8761a91b
TT
368
369 void clear_detail () override;
44f0e208
TT
370
371 /* Return true if this window has the locator. */
e6e41501
TT
372 bool has_locator () const override
373 {
374 return m_has_locator;
375 }
376
56122977 377 void make_visible (bool visible) override;
fd6c75ee 378 void refresh_window () override;
1825f487 379 void refresh_all () override;
cda37efb 380
ad54d15b
TT
381 /* Refill the source window's source cache and update it. If this
382 is a disassembly window, then just update it. */
383 void refill ();
384
385 /* Set the location of the execution point. */
386 void set_is_exec_point_at (struct tui_line_or_address l);
387
3f02ce1e
TT
388 void set_new_height (int height) override;
389
d83f1fe6
TT
390 void update_tab_width () override;
391
c2cd8994
TT
392 /* Return true if the location LOC corresponds to the line number
393 LINE_NO in this source window; false otherwise. */
394 virtual bool location_matches_p (struct bp_location *loc, int line_no) = 0;
395
1e0c09ba 396 void reset (int height, int width,
098f9ed4
TT
397 int origin_x, int origin_y) override;
398
e6e41501
TT
399 /* Does the locator belong to this window? */
400 bool m_has_locator = false;
401 /* Execution information window. */
098f9ed4 402 struct tui_exec_info_window *execution_info;
e6e41501
TT
403 /* Used for horizontal scroll. */
404 int horizontal_offset = 0;
405 struct tui_line_or_address start_line_or_addr;
406
407 /* It is the resolved form as returned by symtab_to_fullname. */
408 char *fullname = nullptr;
409
410 /* Architecture associated with code at this location. */
411 struct gdbarch *gdbarch = nullptr;
53e7cdba
TT
412
413 std::vector<tui_source_element> content;
33b906ab
TT
414};
415
5cf82909
TT
416/* A TUI source window. */
417
418struct tui_source_window : public tui_source_window_base
419{
b73dd877
TT
420 tui_source_window ();
421 ~tui_source_window ();
5cf82909
TT
422
423 DISABLE_COPY_AND_ASSIGN (tui_source_window);
13446e05 424
152f3f4b
TT
425 const char *name () const override
426 {
427 return SRC_NAME;
428 }
429
c2cd8994
TT
430 bool location_matches_p (struct bp_location *loc, int line_no) override;
431
a38da35d
TT
432 bool showing_source_p (const char *filename) const;
433
13446e05
TT
434protected:
435
c3bd716f 436 void do_scroll_vertical (int num_to_scroll) override;
b73dd877
TT
437
438private:
439
440 void style_changed ();
441
442 /* A token used to register and unregister an observer. */
443 gdb::observers::token m_observable;
5cf82909
TT
444};
445
446/* A TUI disassembly window. */
447
448struct tui_disasm_window : public tui_source_window_base
449{
450 tui_disasm_window ()
451 : tui_source_window_base (DISASSEM_WIN)
452 {
453 }
454
455 DISABLE_COPY_AND_ASSIGN (tui_disasm_window);
13446e05 456
152f3f4b
TT
457 const char *name () const override
458 {
459 return DISASSEM_NAME;
460 }
461
c2cd8994
TT
462 bool location_matches_p (struct bp_location *loc, int line_no) override;
463
13446e05
TT
464protected:
465
c3bd716f 466 void do_scroll_vertical (int num_to_scroll) override;
5cf82909
TT
467};
468
33b906ab
TT
469struct tui_data_window : public tui_win_info
470{
63901aec
TT
471 tui_data_window ()
472 : tui_win_info (DATA_WIN)
473 {
474 }
475
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
21e1c91e
TT
490 /* Windows that are used to display registers. */
491 std::vector<std::unique_ptr<tui_data_item_window>> regs_content;
63901aec
TT
492 int regs_column_count = 0;
493 /* Should regs be displayed at all? */
494 bool display_regs = false;
495 struct reggroup *current_group = nullptr;
238eb706 496
0b5ec218
TT
497 /* Answer the number of the last line in the regs display. If there
498 are no registers (-1) is returned. */
499 int last_regs_line_no () const;
500
3b23c5f2
TT
501 /* Answer the line number that the register element at element_no is
502 on. If element_no is greater than the number of register
503 elements there are, -1 is returned. */
504 int line_from_reg_element_no (int element_no) const;
505
baff0c28
TT
506 /* Answer the index of the first element in line_no. If line_no is
507 past the register area (-1) is returned. */
508 int first_reg_element_no_inline (int line_no) const;
509
50daf268
TT
510 /* Displays the data that is in the data window's content. It does
511 not set the content. */
512 void display_all_data ();
513
b4094625
TT
514 /* Delete all the item windows in the data window. This is usually
515 done when the data window is scrolled. */
516 void delete_data_content_windows ();
517
f76d8b19
TT
518 void erase_data_content (const char *prompt);
519
517e9505
TT
520 /* Display the registers in the content from 'start_element_no'
521 until the end of the register content or the end of the display
522 height. No checking for displaying past the end of the registers
523 is done here. */
524 void display_registers_from (int start_element_no);
525
526 /* Display the registers starting at line line_no in the data
527 window. Answers the line number that the display actually
528 started from. If nothing is displayed (-1) is returned. */
529 int display_registers_from_line (int line_no);
530
13446e05
TT
531protected:
532
c3bd716f
TT
533 void do_scroll_vertical (int num_to_scroll) override;
534 void do_scroll_horizontal (int num_to_scroll) override
13446e05
TT
535 {
536 }
5fcee43a 537 void do_make_visible_with_new_height () override;
eaf9738b
TT
538
539 /* Return the index of the first element displayed. If none are
540 displayed, then return -1. */
541 int first_data_item_displayed ();
aca2dd16
TT
542
543 /* Display the registers in the content from 'start_element_no' on
544 'start_line_no' until the end of the register content or the end
545 of the display height. This function checks that we won't
546 display off the end of the register display. */
547 void display_reg_element_at_line (int start_element_no, int start_line_no);
33b906ab
TT
548};
549
550struct tui_cmd_window : public tui_win_info
551{
63901aec
TT
552 tui_cmd_window ()
553 : tui_win_info (CMD_WIN)
554 {
d6ba6a11 555 can_highlight = false;
63901aec
TT
556 }
557
33b906ab 558 DISABLE_COPY_AND_ASSIGN (tui_cmd_window);
8761a91b
TT
559
560 void clear_detail () override;
13446e05 561
56122977 562 void make_visible (bool visible) override
cda37efb
TT
563 {
564 }
565
8903bd8a
TT
566 int max_height () const override;
567
5b81daba
TT
568 void refresh_window () override
569 {
570 }
571
152f3f4b
TT
572 const char *name () const override
573 {
574 return CMD_NAME;
575 }
576
06210ce4
TT
577 bool can_scroll () const override
578 {
579 return false;
580 }
581
63901aec 582 int start_line = 0;
81491aa0 583
13446e05
TT
584protected:
585
c3bd716f 586 void do_scroll_vertical (int num_to_scroll) override
13446e05
TT
587 {
588 }
589
c3bd716f 590 void do_scroll_horizontal (int num_to_scroll) override
13446e05
TT
591 {
592 }
5fcee43a
TT
593
594 void do_make_visible_with_new_height () override;
2a8854a7 595};
c906108c 596
6658b1bf 597extern int tui_win_is_auxiliary (enum tui_win_type win_type);
c906108c
SS
598
599
1cc6d956 600/* Global Data. */
7fa29be9 601extern struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
c906108c 602
a38da35d 603#define TUI_SRC_WIN ((tui_source_window *) tui_win_list[SRC_WIN])
e6e41501 604#define TUI_DISASM_WIN ((tui_source_window_base *) tui_win_list[DISASSEM_WIN])
238eb706 605#define TUI_DATA_WIN ((tui_data_window *) tui_win_list[DATA_WIN])
81491aa0 606#define TUI_CMD_WIN ((tui_cmd_window *) tui_win_list[CMD_WIN])
c906108c 607
1ce3e844
TT
608/* An iterator that iterates over all windows. */
609
610class tui_window_iterator
611{
612public:
613
614 typedef tui_window_iterator self_type;
615 typedef struct tui_win_info *value_type;
616 typedef struct tui_win_info *&reference;
617 typedef struct tui_win_info **pointer;
618 typedef std::forward_iterator_tag iterator_category;
619 typedef int difference_type;
620
621 explicit tui_window_iterator (enum tui_win_type type)
622 : m_type (type)
623 {
624 advance ();
625 }
626
627 tui_window_iterator ()
628 : m_type (MAX_MAJOR_WINDOWS)
629 {
630 }
631
632 bool operator!= (const self_type &other) const
633 {
634 return m_type != other.m_type;
635 }
636
637 value_type operator* () const
638 {
639 gdb_assert (m_type < MAX_MAJOR_WINDOWS);
640 return tui_win_list[m_type];
641 }
642
643 self_type &operator++ ()
644 {
645 ++m_type;
646 advance ();
647 return *this;
648 }
649
650private:
651
652 void advance ()
653 {
654 while (m_type < MAX_MAJOR_WINDOWS && tui_win_list[m_type] == nullptr)
655 ++m_type;
656 }
657
658 int m_type;
659};
660
661/* A range adapter for iterating over TUI windows. */
662
663struct all_tui_windows
664{
665 tui_window_iterator begin () const
666 {
667 return tui_window_iterator (SRC_WIN);
668 }
669
670 tui_window_iterator end () const
671 {
672 return tui_window_iterator ();
673 }
674};
675
676
1cc6d956 677/* Data Manipulation Functions. */
dd1abb8c 678extern void tui_initialize_static_data (void);
a121b7c1 679extern struct tui_win_info *tui_partial_win_by_name (const char *);
2a8854a7
AC
680extern enum tui_layout_type tui_current_layout (void);
681extern void tui_set_current_layout_to (enum tui_layout_type);
dd1abb8c
AC
682extern int tui_term_height (void);
683extern void tui_set_term_height_to (int);
684extern int tui_term_width (void);
685extern void tui_set_term_width_to (int);
3add462f 686extern struct tui_locator_window *tui_locator_win_info_ptr (void);
ad54d15b 687extern std::vector<tui_source_window_base *> &tui_source_windows ();
dd1abb8c
AC
688extern void tui_clear_source_windows (void);
689extern void tui_clear_source_windows_detail (void);
ad54d15b 690extern void tui_add_to_source_windows (struct tui_source_window_base *);
dd1abb8c
AC
691extern struct tui_win_info *tui_win_with_focus (void);
692extern void tui_set_win_with_focus (struct tui_win_info *);
5b6fe301 693extern struct tui_layout_def *tui_layout_def (void);
dd1abb8c
AC
694extern int tui_win_resized (void);
695extern void tui_set_win_resized_to (int);
696
697extern struct tui_win_info *tui_next_win (struct tui_win_info *);
698extern struct tui_win_info *tui_prev_win (struct tui_win_info *);
699
7806cea7
TT
700extern unsigned int tui_tab_width;
701
1a5c2598 702#endif /* TUI_TUI_DATA_H */
This page took 2.680655 seconds and 4 git commands to generate.