Move TUI command window code
[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
TT
29struct tui_cmd_window;
30
6a83354a
AC
31/* This is a point definition. */
32struct tui_point
33{
34 int x, y;
35};
2a5127c4 36
1cc6d956 37/* Generic window information. */
2a8854a7
AC
38struct tui_gen_win_info
39{
fb54fa76
TT
40protected:
41
ab313b35
TT
42 explicit tui_gen_win_info (enum tui_win_type t)
43 : type (t)
44 {
45 }
46
fb54fa76
TT
47public:
48
f936bca2 49 virtual ~tui_gen_win_info ();
ab313b35 50
5b81daba
TT
51 /* Call to refresh this window. */
52 virtual void refresh_window ();
53
48a3bd16
TT
54 /* Make this window visible or invisible. */
55 virtual void make_visible (bool visible);
56
152f3f4b
TT
57 /* Return the name of this type of window. */
58 virtual const char *name () const
59 {
60 return "";
61 }
62
1e0c09ba
TT
63 /* Reset this window. The parameters are used to set the window's
64 size and position. */
65 virtual void reset (int height, int width,
098f9ed4 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
1825f487
TT
300 /* Called after all the TUI windows are refreshed, to let this
301 window have a chance to update itself further. */
302 virtual void refresh_all ()
303 {
304 }
305
3f02ce1e
TT
306 /* Called after a TUI window is given a new height; this updates any
307 related auxiliary windows. */
308 virtual void set_new_height (int height)
309 {
310 }
311
8903bd8a
TT
312 /* Compute the maximum height of this window. */
313 virtual int max_height () const;
314
d83f1fe6
TT
315 /* Called after the tab width has been changed. */
316 virtual void update_tab_width ()
317 {
318 }
319
5fcee43a
TT
320 /* Make the window visible after the height has been changed. */
321 void make_visible_with_new_height ();
322
214a5cbe
TT
323 /* Set whether this window is highglighted. */
324 void set_highlight (bool highlight)
325 {
326 is_highlighted = highlight;
327 }
328
13446e05
TT
329 /* Methods to scroll the contents of this window. Note that they
330 are named with "_scroll" coming at the end because the more
331 obvious "scroll_forward" is defined as a macro in term.h. */
332 void forward_scroll (int num_to_scroll);
333 void backward_scroll (int num_to_scroll);
334 void left_scroll (int num_to_scroll);
335 void right_scroll (int num_to_scroll);
336
06210ce4
TT
337 /* Return true if this window can be scrolled, false otherwise. */
338 virtual bool can_scroll () const
339 {
340 return true;
341 }
342
33b906ab 343 /* Can this window ever be highlighted? */
d6ba6a11 344 bool can_highlight = true;
33b906ab
TT
345
346 /* Is this window highlighted? */
214a5cbe 347 bool is_highlighted = false;
33b906ab
TT
348};
349
5cf82909
TT
350/* The base class for all source-like windows, namely the source and
351 disassembly windows. */
352
353struct tui_source_window_base : public tui_win_info
33b906ab 354{
5cf82909
TT
355protected:
356 explicit tui_source_window_base (enum tui_win_type type);
357 ~tui_source_window_base () override;
358 DISABLE_COPY_AND_ASSIGN (tui_source_window_base);
359
c3bd716f 360 void do_scroll_horizontal (int num_to_scroll) override;
5fcee43a 361 void do_make_visible_with_new_height () override;
13446e05 362
5cf82909 363public:
8761a91b
TT
364
365 void clear_detail () override;
44f0e208 366
56122977 367 void make_visible (bool visible) override;
fd6c75ee 368 void refresh_window () override;
1825f487 369 void refresh_all () override;
cda37efb 370
ad54d15b
TT
371 /* Refill the source window's source cache and update it. If this
372 is a disassembly window, then just update it. */
373 void refill ();
374
375 /* Set the location of the execution point. */
376 void set_is_exec_point_at (struct tui_line_or_address l);
377
3f02ce1e
TT
378 void set_new_height (int height) override;
379
d83f1fe6
TT
380 void update_tab_width () override;
381
c2cd8994
TT
382 /* Return true if the location LOC corresponds to the line number
383 LINE_NO in this source window; false otherwise. */
384 virtual bool location_matches_p (struct bp_location *loc, int line_no) = 0;
385
1e0c09ba 386 void reset (int height, int width,
098f9ed4
TT
387 int origin_x, int origin_y) override;
388
e6e41501
TT
389 /* Does the locator belong to this window? */
390 bool m_has_locator = false;
391 /* Execution information window. */
098f9ed4 392 struct tui_exec_info_window *execution_info;
e6e41501
TT
393 /* Used for horizontal scroll. */
394 int horizontal_offset = 0;
395 struct tui_line_or_address start_line_or_addr;
396
397 /* It is the resolved form as returned by symtab_to_fullname. */
398 char *fullname = nullptr;
399
400 /* Architecture associated with code at this location. */
401 struct gdbarch *gdbarch = nullptr;
53e7cdba
TT
402
403 std::vector<tui_source_element> content;
33b906ab
TT
404};
405
5cf82909
TT
406/* A TUI source window. */
407
408struct tui_source_window : public tui_source_window_base
409{
b73dd877
TT
410 tui_source_window ();
411 ~tui_source_window ();
5cf82909
TT
412
413 DISABLE_COPY_AND_ASSIGN (tui_source_window);
13446e05 414
152f3f4b
TT
415 const char *name () const override
416 {
417 return SRC_NAME;
418 }
419
c2cd8994
TT
420 bool location_matches_p (struct bp_location *loc, int line_no) override;
421
a38da35d
TT
422 bool showing_source_p (const char *filename) const;
423
13446e05
TT
424protected:
425
c3bd716f 426 void do_scroll_vertical (int num_to_scroll) override;
b73dd877
TT
427
428private:
429
430 void style_changed ();
431
432 /* A token used to register and unregister an observer. */
433 gdb::observers::token m_observable;
5cf82909
TT
434};
435
436/* A TUI disassembly window. */
437
438struct tui_disasm_window : public tui_source_window_base
439{
440 tui_disasm_window ()
441 : tui_source_window_base (DISASSEM_WIN)
442 {
443 }
444
445 DISABLE_COPY_AND_ASSIGN (tui_disasm_window);
13446e05 446
152f3f4b
TT
447 const char *name () const override
448 {
449 return DISASSEM_NAME;
450 }
451
c2cd8994
TT
452 bool location_matches_p (struct bp_location *loc, int line_no) override;
453
13446e05
TT
454protected:
455
c3bd716f 456 void do_scroll_vertical (int num_to_scroll) override;
5cf82909
TT
457};
458
6658b1bf 459extern int tui_win_is_auxiliary (enum tui_win_type win_type);
c906108c
SS
460
461
1cc6d956 462/* Global Data. */
7fa29be9 463extern struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
c906108c 464
a38da35d 465#define TUI_SRC_WIN ((tui_source_window *) tui_win_list[SRC_WIN])
e6e41501 466#define TUI_DISASM_WIN ((tui_source_window_base *) tui_win_list[DISASSEM_WIN])
238eb706 467#define TUI_DATA_WIN ((tui_data_window *) tui_win_list[DATA_WIN])
81491aa0 468#define TUI_CMD_WIN ((tui_cmd_window *) tui_win_list[CMD_WIN])
c906108c 469
1ce3e844
TT
470/* An iterator that iterates over all windows. */
471
472class tui_window_iterator
473{
474public:
475
476 typedef tui_window_iterator self_type;
477 typedef struct tui_win_info *value_type;
478 typedef struct tui_win_info *&reference;
479 typedef struct tui_win_info **pointer;
480 typedef std::forward_iterator_tag iterator_category;
481 typedef int difference_type;
482
483 explicit tui_window_iterator (enum tui_win_type type)
484 : m_type (type)
485 {
486 advance ();
487 }
488
489 tui_window_iterator ()
490 : m_type (MAX_MAJOR_WINDOWS)
491 {
492 }
493
494 bool operator!= (const self_type &other) const
495 {
496 return m_type != other.m_type;
497 }
498
499 value_type operator* () const
500 {
501 gdb_assert (m_type < MAX_MAJOR_WINDOWS);
502 return tui_win_list[m_type];
503 }
504
505 self_type &operator++ ()
506 {
507 ++m_type;
508 advance ();
509 return *this;
510 }
511
512private:
513
514 void advance ()
515 {
516 while (m_type < MAX_MAJOR_WINDOWS && tui_win_list[m_type] == nullptr)
517 ++m_type;
518 }
519
520 int m_type;
521};
522
523/* A range adapter for iterating over TUI windows. */
524
525struct all_tui_windows
526{
527 tui_window_iterator begin () const
528 {
529 return tui_window_iterator (SRC_WIN);
530 }
531
532 tui_window_iterator end () const
533 {
534 return tui_window_iterator ();
535 }
536};
537
538
1cc6d956 539/* Data Manipulation Functions. */
dd1abb8c 540extern void tui_initialize_static_data (void);
a121b7c1 541extern struct tui_win_info *tui_partial_win_by_name (const char *);
2a8854a7
AC
542extern enum tui_layout_type tui_current_layout (void);
543extern void tui_set_current_layout_to (enum tui_layout_type);
dd1abb8c
AC
544extern int tui_term_height (void);
545extern void tui_set_term_height_to (int);
546extern int tui_term_width (void);
547extern void tui_set_term_width_to (int);
3add462f 548extern struct tui_locator_window *tui_locator_win_info_ptr (void);
ad54d15b 549extern std::vector<tui_source_window_base *> &tui_source_windows ();
dd1abb8c
AC
550extern void tui_clear_source_windows (void);
551extern void tui_clear_source_windows_detail (void);
ad54d15b 552extern void tui_add_to_source_windows (struct tui_source_window_base *);
dd1abb8c
AC
553extern struct tui_win_info *tui_win_with_focus (void);
554extern void tui_set_win_with_focus (struct tui_win_info *);
5b6fe301 555extern struct tui_layout_def *tui_layout_def (void);
dd1abb8c
AC
556extern int tui_win_resized (void);
557extern void tui_set_win_resized_to (int);
558
559extern struct tui_win_info *tui_next_win (struct tui_win_info *);
560extern struct tui_win_info *tui_prev_win (struct tui_win_info *);
561
7806cea7
TT
562extern unsigned int tui_tab_width;
563
1a5c2598 564#endif /* TUI_TUI_DATA_H */
This page took 1.961983 seconds and 4 git commands to generate.