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