Change make_invisible_and_set_new_height to be a method
[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 28
ce38393b 29struct tui_cmd_window;
bfad4537 30struct tui_source_window;
ce38393b 31
6a83354a
AC
32/* This is a point definition. */
33struct tui_point
34{
35 int x, y;
36};
2a5127c4 37
1cc6d956 38/* Generic window information. */
2a8854a7
AC
39struct tui_gen_win_info
40{
fb54fa76
TT
41protected:
42
ab313b35
TT
43 explicit tui_gen_win_info (enum tui_win_type t)
44 : type (t)
45 {
46 }
47
fb54fa76
TT
48public:
49
f936bca2 50 virtual ~tui_gen_win_info ();
ab313b35 51
5b81daba
TT
52 /* Call to refresh this window. */
53 virtual void refresh_window ();
54
48a3bd16
TT
55 /* Make this window visible or invisible. */
56 virtual void make_visible (bool visible);
57
152f3f4b
TT
58 /* Return the name of this type of window. */
59 virtual const char *name () const
60 {
61 return "";
62 }
63
1e0c09ba
TT
64 /* Reset this window. The parameters are used to set the window's
65 size and position. */
66 virtual void reset (int height, int width,
098f9ed4 67 int origin_x, int origin_y);
d6ba6a11 68
ab313b35
TT
69 /* Window handle. */
70 WINDOW *handle = nullptr;
71 /* Type of window. */
72 enum tui_win_type type;
73 /* Window width. */
74 int width = 0;
75 /* Window height. */
76 int height = 0;
77 /* Origin of window. */
78 struct tui_point origin = {0, 0};
ab313b35
TT
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 ]"
6dce28e4
AB
102#define SRC_NAME "src"
103#define CMD_NAME "cmd"
104#define DATA_NAME "regs"
105#define DISASSEM_NAME "asm"
08ef48c5
MS
106#define HILITE TRUE
107#define NO_HILITE FALSE
08ef48c5
MS
108#define MIN_WIN_HEIGHT 3
109#define MIN_CMD_WIN_HEIGHT 3
c906108c 110
50265402 111/* Strings to display in the TUI status line. */
08ef48c5 112#define PROC_PREFIX "In: "
9f2850ba 113#define LINE_PREFIX "L"
08ef48c5
MS
114#define PC_PREFIX "PC: "
115#define SINGLE_KEY "(SingleKey)"
50265402 116
1cc6d956
MS
117/* Minimum/Maximum length of some fields displayed in the TUI status
118 line. */
119#define MIN_LINE_WIDTH 4 /* Use at least 4 digits for line
120 numbers. */
50265402
SC
121#define MIN_PROC_WIDTH 12
122#define MAX_TARGET_WIDTH 10
9f2850ba 123#define MAX_PID_WIDTH 19
c906108c 124
1cc6d956 125/* The kinds of layouts available. */
2a8854a7
AC
126enum tui_layout_type
127{
128 SRC_COMMAND,
129 DISASSEM_COMMAND,
130 SRC_DISASSEM_COMMAND,
131 SRC_DATA_COMMAND,
132 DISASSEM_DATA_COMMAND,
133 UNDEFINED_LAYOUT
134};
c906108c 135
52059ffd
TT
136enum tui_line_or_address_kind
137{
138 LOA_LINE,
139 LOA_ADDRESS
140};
141
1cc6d956 142/* Structure describing source line or line address. */
362c05fe 143struct tui_line_or_address
2a8854a7 144{
52059ffd 145 enum tui_line_or_address_kind loa;
362c05fe
AS
146 union
147 {
148 int line_no;
149 CORE_ADDR addr;
150 } u;
2a8854a7 151};
c906108c 152
1cc6d956 153/* Current Layout definition. */
2a8854a7
AC
154struct tui_layout_def
155{
6d012f14 156 enum tui_win_type display_mode;
2a8854a7 157};
c906108c 158
0598af48
TT
159/* Flags to tell what kind of breakpoint is at current line. */
160enum tui_bp_flag
161{
162 TUI_BP_ENABLED = 0x01,
163 TUI_BP_DISABLED = 0x02,
164 TUI_BP_HIT = 0x04,
165 TUI_BP_CONDITIONAL = 0x08,
166 TUI_BP_HARDWARE = 0x10
167};
168
169DEF_ENUM_FLAGS_TYPE (enum tui_bp_flag, tui_bp_flags);
170
1cc6d956 171/* Elements in the Source/Disassembly Window. */
2a8854a7
AC
172struct tui_source_element
173{
53e7cdba
TT
174 tui_source_element ()
175 {
176 line_or_addr.loa = LOA_LINE;
177 line_or_addr.u.line_no = 0;
178 }
179
180 ~tui_source_element ()
181 {
182 xfree (line);
183 }
184
185 char *line = nullptr;
362c05fe 186 struct tui_line_or_address line_or_addr;
53e7cdba 187 bool is_exec_point = false;
0598af48 188 tui_bp_flags break_mode = 0;
2a8854a7 189};
c906108c
SS
190
191
2d42f9a8
JB
192#ifdef PATH_MAX
193# define MAX_LOCATOR_ELEMENT_LEN PATH_MAX
194#else
195# define MAX_LOCATOR_ELEMENT_LEN 1024
196#endif
c906108c 197
00b2bad4
SC
198/* Position of breakpoint markers in the exec info string. */
199#define TUI_BP_HIT_POS 0
200#define TUI_BP_BREAK_POS 1
201#define TUI_EXEC_POS 2
202#define TUI_EXECINFO_SIZE 4
203
2a8854a7 204typedef char tui_exec_info_content[TUI_EXECINFO_SIZE];
c906108c 205
489e9d8b
TT
206/* Execution info window class. */
207
208struct tui_exec_info_window : public tui_gen_win_info
209{
210 tui_exec_info_window ()
211 : tui_gen_win_info (EXEC_INFO_WIN)
212 {
213 }
214
215 ~tui_exec_info_window () override
216 {
217 xfree (m_content);
218 }
219
220 /* Get or allocate contents. */
221 tui_exec_info_content *maybe_allocate_content (int n_elements);
222
223 /* Return the contents. */
224 const tui_exec_info_content *get_content () const
225 {
226 return m_content;
227 }
228
229private:
230
231 tui_exec_info_content *m_content = nullptr;
232};
233
3add462f
TT
234/* Locator window class. */
235
236struct tui_locator_window : public tui_gen_win_info
237{
238 tui_locator_window ()
239 : tui_gen_win_info (LOCATOR_WIN)
240 {
241 full_name[0] = 0;
242 proc_name[0] = 0;
243 }
244
245 char full_name[MAX_LOCATOR_ELEMENT_LEN];
246 char proc_name[MAX_LOCATOR_ELEMENT_LEN];
247 int line_no = 0;
248 CORE_ADDR addr = 0;
249 /* Architecture associated with code at this location. */
250 struct gdbarch *gdbarch = nullptr;
251};
252
1cc6d956 253/* This defines information about each logical window. */
cb2ce893 254struct tui_win_info : public tui_gen_win_info
2a8854a7 255{
33b906ab 256protected:
e7e11af4 257
33b906ab 258 explicit tui_win_info (enum tui_win_type type);
6792b55e
TT
259 DISABLE_COPY_AND_ASSIGN (tui_win_info);
260
13446e05
TT
261 /* Scroll the contents vertically. This is only called via
262 forward_scroll and backward_scroll. */
c3bd716f 263 virtual void do_scroll_vertical (int num_to_scroll) = 0;
13446e05
TT
264
265 /* Scroll the contents horizontally. This is only called via
266 left_scroll and right_scroll. */
c3bd716f 267 virtual void do_scroll_horizontal (int num_to_scroll) = 0;
13446e05 268
5fcee43a
TT
269 /* Called after make_visible_with_new_height sets the new height.
270 Should update the window. */
271 virtual void do_make_visible_with_new_height () = 0;
272
33b906ab
TT
273public:
274
f936bca2
TT
275 ~tui_win_info () override
276 {
277 }
33b906ab 278
8761a91b
TT
279 /* Clear the pertinent detail in the window. */
280 virtual void clear_detail () = 0;
281
1825f487
TT
282 /* Called after all the TUI windows are refreshed, to let this
283 window have a chance to update itself further. */
284 virtual void refresh_all ()
285 {
286 }
287
3f02ce1e
TT
288 /* Called after a TUI window is given a new height; this updates any
289 related auxiliary windows. */
290 virtual void set_new_height (int height)
291 {
292 }
293
8903bd8a
TT
294 /* Compute the maximum height of this window. */
295 virtual int max_height () const;
296
d83f1fe6
TT
297 /* Called after the tab width has been changed. */
298 virtual void update_tab_width ()
299 {
300 }
301
daa15dde
TT
302 /* Function make the target window (and auxiliary windows associated
303 with the target) invisible, and set the new height and
304 location. */
305 void make_invisible_and_set_new_height (int height);
306
5fcee43a
TT
307 /* Make the window visible after the height has been changed. */
308 void make_visible_with_new_height ();
309
214a5cbe
TT
310 /* Set whether this window is highglighted. */
311 void set_highlight (bool highlight)
312 {
313 is_highlighted = highlight;
314 }
315
13446e05
TT
316 /* Methods to scroll the contents of this window. Note that they
317 are named with "_scroll" coming at the end because the more
318 obvious "scroll_forward" is defined as a macro in term.h. */
319 void forward_scroll (int num_to_scroll);
320 void backward_scroll (int num_to_scroll);
321 void left_scroll (int num_to_scroll);
322 void right_scroll (int num_to_scroll);
323
06210ce4
TT
324 /* Return true if this window can be scrolled, false otherwise. */
325 virtual bool can_scroll () const
326 {
327 return true;
328 }
329
33b906ab 330 /* Can this window ever be highlighted? */
d6ba6a11 331 bool can_highlight = true;
33b906ab
TT
332
333 /* Is this window highlighted? */
214a5cbe 334 bool is_highlighted = false;
33b906ab
TT
335};
336
5cf82909
TT
337/* The base class for all source-like windows, namely the source and
338 disassembly windows. */
339
340struct tui_source_window_base : public tui_win_info
33b906ab 341{
5cf82909
TT
342protected:
343 explicit tui_source_window_base (enum tui_win_type type);
344 ~tui_source_window_base () override;
345 DISABLE_COPY_AND_ASSIGN (tui_source_window_base);
346
c3bd716f 347 void do_scroll_horizontal (int num_to_scroll) override;
5fcee43a 348 void do_make_visible_with_new_height () override;
13446e05 349
5cf82909 350public:
8761a91b
TT
351
352 void clear_detail () override;
44f0e208 353
56122977 354 void make_visible (bool visible) override;
fd6c75ee 355 void refresh_window () override;
1825f487 356 void refresh_all () override;
cda37efb 357
ad54d15b
TT
358 /* Refill the source window's source cache and update it. If this
359 is a disassembly window, then just update it. */
360 void refill ();
361
362 /* Set the location of the execution point. */
363 void set_is_exec_point_at (struct tui_line_or_address l);
364
3f02ce1e
TT
365 void set_new_height (int height) override;
366
d83f1fe6
TT
367 void update_tab_width () override;
368
c2cd8994
TT
369 /* Return true if the location LOC corresponds to the line number
370 LINE_NO in this source window; false otherwise. */
371 virtual bool location_matches_p (struct bp_location *loc, int line_no) = 0;
372
1e0c09ba 373 void reset (int height, int width,
098f9ed4
TT
374 int origin_x, int origin_y) override;
375
e6e41501
TT
376 /* Does the locator belong to this window? */
377 bool m_has_locator = false;
378 /* Execution information window. */
098f9ed4 379 struct tui_exec_info_window *execution_info;
e6e41501
TT
380 /* Used for horizontal scroll. */
381 int horizontal_offset = 0;
382 struct tui_line_or_address start_line_or_addr;
383
384 /* It is the resolved form as returned by symtab_to_fullname. */
385 char *fullname = nullptr;
386
387 /* Architecture associated with code at this location. */
388 struct gdbarch *gdbarch = nullptr;
53e7cdba
TT
389
390 std::vector<tui_source_element> content;
33b906ab
TT
391};
392
6658b1bf 393extern int tui_win_is_auxiliary (enum tui_win_type win_type);
c906108c
SS
394
395
1cc6d956 396/* Global Data. */
7fa29be9 397extern struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
c906108c 398
a38da35d 399#define TUI_SRC_WIN ((tui_source_window *) tui_win_list[SRC_WIN])
e6e41501 400#define TUI_DISASM_WIN ((tui_source_window_base *) tui_win_list[DISASSEM_WIN])
238eb706 401#define TUI_DATA_WIN ((tui_data_window *) tui_win_list[DATA_WIN])
81491aa0 402#define TUI_CMD_WIN ((tui_cmd_window *) tui_win_list[CMD_WIN])
c906108c 403
1ce3e844
TT
404/* An iterator that iterates over all windows. */
405
406class tui_window_iterator
407{
408public:
409
410 typedef tui_window_iterator self_type;
411 typedef struct tui_win_info *value_type;
412 typedef struct tui_win_info *&reference;
413 typedef struct tui_win_info **pointer;
414 typedef std::forward_iterator_tag iterator_category;
415 typedef int difference_type;
416
417 explicit tui_window_iterator (enum tui_win_type type)
418 : m_type (type)
419 {
420 advance ();
421 }
422
423 tui_window_iterator ()
424 : m_type (MAX_MAJOR_WINDOWS)
425 {
426 }
427
428 bool operator!= (const self_type &other) const
429 {
430 return m_type != other.m_type;
431 }
432
433 value_type operator* () const
434 {
435 gdb_assert (m_type < MAX_MAJOR_WINDOWS);
436 return tui_win_list[m_type];
437 }
438
439 self_type &operator++ ()
440 {
441 ++m_type;
442 advance ();
443 return *this;
444 }
445
446private:
447
448 void advance ()
449 {
450 while (m_type < MAX_MAJOR_WINDOWS && tui_win_list[m_type] == nullptr)
451 ++m_type;
452 }
453
454 int m_type;
455};
456
457/* A range adapter for iterating over TUI windows. */
458
459struct all_tui_windows
460{
461 tui_window_iterator begin () const
462 {
463 return tui_window_iterator (SRC_WIN);
464 }
465
466 tui_window_iterator end () const
467 {
468 return tui_window_iterator ();
469 }
470};
471
472
1cc6d956 473/* Data Manipulation Functions. */
dd1abb8c 474extern void tui_initialize_static_data (void);
a121b7c1 475extern struct tui_win_info *tui_partial_win_by_name (const char *);
2a8854a7
AC
476extern enum tui_layout_type tui_current_layout (void);
477extern void tui_set_current_layout_to (enum tui_layout_type);
dd1abb8c
AC
478extern int tui_term_height (void);
479extern void tui_set_term_height_to (int);
480extern int tui_term_width (void);
481extern void tui_set_term_width_to (int);
3add462f 482extern struct tui_locator_window *tui_locator_win_info_ptr (void);
ad54d15b 483extern std::vector<tui_source_window_base *> &tui_source_windows ();
dd1abb8c
AC
484extern void tui_clear_source_windows (void);
485extern void tui_clear_source_windows_detail (void);
ad54d15b 486extern void tui_add_to_source_windows (struct tui_source_window_base *);
dd1abb8c
AC
487extern struct tui_win_info *tui_win_with_focus (void);
488extern void tui_set_win_with_focus (struct tui_win_info *);
5b6fe301 489extern struct tui_layout_def *tui_layout_def (void);
dd1abb8c
AC
490extern int tui_win_resized (void);
491extern void tui_set_win_resized_to (int);
492
493extern struct tui_win_info *tui_next_win (struct tui_win_info *);
494extern struct tui_win_info *tui_prev_win (struct tui_win_info *);
495
7806cea7
TT
496extern unsigned int tui_tab_width;
497
1a5c2598 498#endif /* TUI_TUI_DATA_H */
This page took 2.032516 seconds and 4 git commands to generate.