]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/tui/tui-data.h
Simplify TUI boxing
[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. */
b73dd877 27#include "observable.h"
6a83354a 28
ce38393b 29struct tui_cmd_window;
5104fe36 30struct tui_source_window_base;
bfad4537 31struct tui_source_window;
ce38393b 32
6a83354a
AC
33/* This is a point definition. */
34struct tui_point
35{
36 int x, y;
37};
2a5127c4 38
1cc6d956 39/* Generic window information. */
2a8854a7
AC
40struct tui_gen_win_info
41{
fb54fa76
TT
42protected:
43
ab313b35
TT
44 explicit tui_gen_win_info (enum tui_win_type t)
45 : type (t)
46 {
47 }
48
fb54fa76
TT
49public:
50
f936bca2 51 virtual ~tui_gen_win_info ();
ab313b35 52
5b81daba
TT
53 /* Call to refresh this window. */
54 virtual void refresh_window ();
55
48a3bd16
TT
56 /* Make this window visible or invisible. */
57 virtual void make_visible (bool visible);
58
152f3f4b
TT
59 /* Return the name of this type of window. */
60 virtual const char *name () const
61 {
62 return "";
63 }
64
1e0c09ba
TT
65 /* Reset this window. The parameters are used to set the window's
66 size and position. */
67 virtual void reset (int height, int width,
098f9ed4 68 int origin_x, int origin_y);
d6ba6a11 69
65962b20
TT
70 /* Return true if this can be boxed. */
71 virtual bool can_box () const
72 {
73 return false;
74 }
75
ab313b35
TT
76 /* Window handle. */
77 WINDOW *handle = nullptr;
78 /* Type of window. */
79 enum tui_win_type type;
80 /* Window width. */
81 int width = 0;
82 /* Window height. */
83 int height = 0;
84 /* Origin of window. */
85 struct tui_point origin = {0, 0};
ab313b35
TT
86 /* Viewport height. */
87 int viewport_height = 0;
ab313b35
TT
88 /* Whether the window is visible or not. */
89 bool is_visible = false;
90 /* Window title to display. */
91 char *title = nullptr;
2a8854a7 92};
2a5127c4 93
1cc6d956 94/* Constant definitions. */
08ef48c5
MS
95#define DEFAULT_TAB_LEN 8
96#define NO_SRC_STRING "[ No Source Available ]"
97#define NO_DISASSEM_STRING "[ No Assembly Available ]"
98#define NO_REGS_STRING "[ Register Values Unavailable ]"
99#define NO_DATA_STRING "[ No Data Values Displayed ]"
6dce28e4
AB
100#define SRC_NAME "src"
101#define CMD_NAME "cmd"
102#define DATA_NAME "regs"
103#define DISASSEM_NAME "asm"
08ef48c5
MS
104#define HILITE TRUE
105#define NO_HILITE FALSE
08ef48c5
MS
106#define MIN_WIN_HEIGHT 3
107#define MIN_CMD_WIN_HEIGHT 3
c906108c 108
50265402 109/* Strings to display in the TUI status line. */
08ef48c5 110#define PROC_PREFIX "In: "
9f2850ba 111#define LINE_PREFIX "L"
08ef48c5
MS
112#define PC_PREFIX "PC: "
113#define SINGLE_KEY "(SingleKey)"
50265402 114
1cc6d956
MS
115/* Minimum/Maximum length of some fields displayed in the TUI status
116 line. */
117#define MIN_LINE_WIDTH 4 /* Use at least 4 digits for line
118 numbers. */
50265402
SC
119#define MIN_PROC_WIDTH 12
120#define MAX_TARGET_WIDTH 10
9f2850ba 121#define MAX_PID_WIDTH 19
c906108c 122
1cc6d956 123/* The kinds of layouts available. */
2a8854a7
AC
124enum tui_layout_type
125{
126 SRC_COMMAND,
127 DISASSEM_COMMAND,
128 SRC_DISASSEM_COMMAND,
129 SRC_DATA_COMMAND,
130 DISASSEM_DATA_COMMAND,
131 UNDEFINED_LAYOUT
132};
c906108c 133
52059ffd
TT
134enum tui_line_or_address_kind
135{
136 LOA_LINE,
137 LOA_ADDRESS
138};
139
1cc6d956 140/* Structure describing source line or line address. */
362c05fe 141struct tui_line_or_address
2a8854a7 142{
52059ffd 143 enum tui_line_or_address_kind loa;
362c05fe
AS
144 union
145 {
146 int line_no;
147 CORE_ADDR addr;
148 } u;
2a8854a7 149};
c906108c 150
2d42f9a8
JB
151#ifdef PATH_MAX
152# define MAX_LOCATOR_ELEMENT_LEN PATH_MAX
153#else
154# define MAX_LOCATOR_ELEMENT_LEN 1024
155#endif
c906108c 156
3add462f
TT
157/* Locator window class. */
158
159struct tui_locator_window : public tui_gen_win_info
160{
161 tui_locator_window ()
162 : tui_gen_win_info (LOCATOR_WIN)
163 {
164 full_name[0] = 0;
165 proc_name[0] = 0;
166 }
167
168 char full_name[MAX_LOCATOR_ELEMENT_LEN];
169 char proc_name[MAX_LOCATOR_ELEMENT_LEN];
170 int line_no = 0;
171 CORE_ADDR addr = 0;
172 /* Architecture associated with code at this location. */
173 struct gdbarch *gdbarch = nullptr;
174};
175
1cc6d956 176/* This defines information about each logical window. */
cb2ce893 177struct tui_win_info : public tui_gen_win_info
2a8854a7 178{
33b906ab 179protected:
e7e11af4 180
33b906ab 181 explicit tui_win_info (enum tui_win_type type);
6792b55e
TT
182 DISABLE_COPY_AND_ASSIGN (tui_win_info);
183
13446e05
TT
184 /* Scroll the contents vertically. This is only called via
185 forward_scroll and backward_scroll. */
c3bd716f 186 virtual void do_scroll_vertical (int num_to_scroll) = 0;
13446e05
TT
187
188 /* Scroll the contents horizontally. This is only called via
189 left_scroll and right_scroll. */
c3bd716f 190 virtual void do_scroll_horizontal (int num_to_scroll) = 0;
13446e05 191
5fcee43a
TT
192 /* Called after make_visible_with_new_height sets the new height.
193 Should update the window. */
194 virtual void do_make_visible_with_new_height () = 0;
195
33b906ab
TT
196public:
197
f936bca2
TT
198 ~tui_win_info () override
199 {
200 }
33b906ab 201
1825f487
TT
202 /* Called after all the TUI windows are refreshed, to let this
203 window have a chance to update itself further. */
204 virtual void refresh_all ()
205 {
206 }
207
3f02ce1e
TT
208 /* Called after a TUI window is given a new height; this updates any
209 related auxiliary windows. */
210 virtual void set_new_height (int height)
211 {
212 }
213
8903bd8a
TT
214 /* Compute the maximum height of this window. */
215 virtual int max_height () const;
216
d83f1fe6
TT
217 /* Called after the tab width has been changed. */
218 virtual void update_tab_width ()
219 {
220 }
221
daa15dde
TT
222 /* Function make the target window (and auxiliary windows associated
223 with the target) invisible, and set the new height and
224 location. */
225 void make_invisible_and_set_new_height (int height);
226
5fcee43a
TT
227 /* Make the window visible after the height has been changed. */
228 void make_visible_with_new_height ();
229
214a5cbe
TT
230 /* Set whether this window is highglighted. */
231 void set_highlight (bool highlight)
232 {
233 is_highlighted = highlight;
234 }
235
13446e05
TT
236 /* Methods to scroll the contents of this window. Note that they
237 are named with "_scroll" coming at the end because the more
238 obvious "scroll_forward" is defined as a macro in term.h. */
239 void forward_scroll (int num_to_scroll);
240 void backward_scroll (int num_to_scroll);
241 void left_scroll (int num_to_scroll);
242 void right_scroll (int num_to_scroll);
243
06210ce4
TT
244 /* Return true if this window can be scrolled, false otherwise. */
245 virtual bool can_scroll () const
246 {
247 return true;
248 }
249
65962b20
TT
250 bool can_box () const override
251 {
252 return true;
253 }
254
b4ef5aeb
TT
255 void check_and_display_highlight_if_needed ();
256
33b906ab 257 /* Can this window ever be highlighted? */
d6ba6a11 258 bool can_highlight = true;
33b906ab
TT
259
260 /* Is this window highlighted? */
214a5cbe 261 bool is_highlighted = false;
33b906ab
TT
262};
263
6658b1bf 264extern int tui_win_is_auxiliary (enum tui_win_type win_type);
c906108c
SS
265
266
1cc6d956 267/* Global Data. */
7fa29be9 268extern struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
c906108c 269
a38da35d 270#define TUI_SRC_WIN ((tui_source_window *) tui_win_list[SRC_WIN])
e6e41501 271#define TUI_DISASM_WIN ((tui_source_window_base *) tui_win_list[DISASSEM_WIN])
238eb706 272#define TUI_DATA_WIN ((tui_data_window *) tui_win_list[DATA_WIN])
81491aa0 273#define TUI_CMD_WIN ((tui_cmd_window *) tui_win_list[CMD_WIN])
c906108c 274
1ce3e844
TT
275/* An iterator that iterates over all windows. */
276
277class tui_window_iterator
278{
279public:
280
281 typedef tui_window_iterator self_type;
282 typedef struct tui_win_info *value_type;
283 typedef struct tui_win_info *&reference;
284 typedef struct tui_win_info **pointer;
285 typedef std::forward_iterator_tag iterator_category;
286 typedef int difference_type;
287
288 explicit tui_window_iterator (enum tui_win_type type)
289 : m_type (type)
290 {
291 advance ();
292 }
293
294 tui_window_iterator ()
295 : m_type (MAX_MAJOR_WINDOWS)
296 {
297 }
298
299 bool operator!= (const self_type &other) const
300 {
301 return m_type != other.m_type;
302 }
303
304 value_type operator* () const
305 {
306 gdb_assert (m_type < MAX_MAJOR_WINDOWS);
307 return tui_win_list[m_type];
308 }
309
310 self_type &operator++ ()
311 {
312 ++m_type;
313 advance ();
314 return *this;
315 }
316
317private:
318
319 void advance ()
320 {
321 while (m_type < MAX_MAJOR_WINDOWS && tui_win_list[m_type] == nullptr)
322 ++m_type;
323 }
324
325 int m_type;
326};
327
328/* A range adapter for iterating over TUI windows. */
329
330struct all_tui_windows
331{
332 tui_window_iterator begin () const
333 {
334 return tui_window_iterator (SRC_WIN);
335 }
336
337 tui_window_iterator end () const
338 {
339 return tui_window_iterator ();
340 }
341};
342
343
1cc6d956 344/* Data Manipulation Functions. */
dd1abb8c 345extern void tui_initialize_static_data (void);
a121b7c1 346extern struct tui_win_info *tui_partial_win_by_name (const char *);
2a8854a7 347extern enum tui_layout_type tui_current_layout (void);
dd1abb8c
AC
348extern int tui_term_height (void);
349extern void tui_set_term_height_to (int);
350extern int tui_term_width (void);
351extern void tui_set_term_width_to (int);
3add462f 352extern struct tui_locator_window *tui_locator_win_info_ptr (void);
ad54d15b 353extern std::vector<tui_source_window_base *> &tui_source_windows ();
dd1abb8c
AC
354extern void tui_clear_source_windows (void);
355extern void tui_clear_source_windows_detail (void);
ad54d15b 356extern void tui_add_to_source_windows (struct tui_source_window_base *);
dd1abb8c
AC
357extern struct tui_win_info *tui_win_with_focus (void);
358extern void tui_set_win_with_focus (struct tui_win_info *);
dd1abb8c
AC
359extern int tui_win_resized (void);
360extern void tui_set_win_resized_to (int);
361
362extern struct tui_win_info *tui_next_win (struct tui_win_info *);
363extern struct tui_win_info *tui_prev_win (struct tui_win_info *);
364
fede5273
TT
365/* Delete all the invisible windows. Note that it is an error to call
366 this when the command window is invisible -- we don't allow the
367 command window to be removed from the layout. */
368extern void tui_delete_invisible_windows ();
369
7806cea7
TT
370extern unsigned int tui_tab_width;
371
1a5c2598 372#endif /* TUI_TUI_DATA_H */