gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / tui / tui-layout.h
CommitLineData
f377b406 1/* TUI layout window management.
080ce8c0 2
b811d2c2 3 Copyright (C) 1998-2020 Free Software Foundation, Inc.
080ce8c0 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_LAYOUT_H
23#define TUI_TUI_LAYOUT_H
c906108c 24
ee325b61
TT
25#include "ui-file.h"
26
080ce8c0
AC
27#include "tui/tui.h"
28#include "tui/tui-data.h"
29
6bc56648
TT
30/* Values that can be returned when handling a request to adjust a
31 window's size. */
32enum tui_adjust_result
33{
34 /* Requested window was not found here. */
35 NOT_FOUND,
36 /* Window was found but not handled. */
37 FOUND,
38 /* Window was found and handled. */
39 HANDLED
40};
41
389e7ddb
TT
42/* The basic object in a TUI layout. This represents a single piece
43 of screen real estate. Subclasses determine the exact
44 behavior. */
45class tui_layout_base
46{
47public:
48
49 DISABLE_COPY_AND_ASSIGN (tui_layout_base);
50
9b30da15
SM
51 virtual ~tui_layout_base () = default;
52
389e7ddb
TT
53 /* Clone this object. Ordinarily a layout is cloned before it is
54 used, so that any necessary modifications do not affect the
55 "skeleton" layout. */
56 virtual std::unique_ptr<tui_layout_base> clone () const = 0;
57
58 /* Change the size and location of this layout. */
59 virtual void apply (int x, int y, int width, int height) = 0;
60
7c043ba6
TT
61 /* Return the minimum and maximum height or width of this layout.
62 HEIGHT is true to fetch height, false to fetch width. */
63 virtual void get_sizes (bool height, int *min_value, int *max_value) = 0;
389e7ddb
TT
64
65 /* True if the topmost item in this layout is boxed. */
66 virtual bool top_boxed_p () const = 0;
67
68 /* True if the bottommost item in this layout is boxed. */
69 virtual bool bottom_boxed_p () const = 0;
70
71 /* Return the name of this layout's window, or nullptr if this
72 layout does not represent a single window. */
73 virtual const char *get_name () const
74 {
75 return nullptr;
76 }
77
78 /* Adjust the size of the window named NAME to NEW_HEIGHT, updating
79 the sizes of the other windows around it. */
6bc56648 80 virtual tui_adjust_result adjust_size (const char *name, int new_height) = 0;
389e7ddb 81
5afe342e
TT
82 /* Remove some windows from the layout, leaving the command window
83 and the window being passed in here. */
84 virtual void remove_windows (const char *name) = 0;
85
416eb92d
TT
86 /* Replace the window named NAME in the layout with the window named
87 NEW_WINDOW. */
88 virtual void replace_window (const char *name, const char *new_window) = 0;
89
c22fef7e
TT
90 /* Append the specification to this window to OUTPUT. DEPTH is the
91 depth of this layout in the hierarchy (zero-based). */
92 virtual void specification (ui_file *output, int depth) = 0;
ee325b61 93
389e7ddb
TT
94 /* The most recent space allocation. */
95 int x = 0;
96 int y = 0;
97 int width = 0;
98 int height = 0;
99
100protected:
101
102 tui_layout_base () = default;
103};
104
105/* A TUI layout object that displays a single window. The window is
106 given by name. */
107class tui_layout_window : public tui_layout_base
108{
109public:
110
111 explicit tui_layout_window (const char *name)
112 : m_contents (name)
113 {
114 }
115
116 DISABLE_COPY_AND_ASSIGN (tui_layout_window);
117
118 std::unique_ptr<tui_layout_base> clone () const override;
119
120 void apply (int x, int y, int width, int height) override;
121
122 const char *get_name () const override
123 {
124 return m_contents.c_str ();
125 }
126
6bc56648 127 tui_adjust_result adjust_size (const char *name, int new_height) override
389e7ddb 128 {
6bc56648 129 return m_contents == name ? FOUND : NOT_FOUND;
389e7ddb
TT
130 }
131
132 bool top_boxed_p () const override;
133
134 bool bottom_boxed_p () const override;
135
5afe342e
TT
136 void remove_windows (const char *name) override
137 {
138 }
139
416eb92d
TT
140 void replace_window (const char *name, const char *new_window) override;
141
c22fef7e 142 void specification (ui_file *output, int depth) override;
ee325b61 143
389e7ddb
TT
144protected:
145
7c043ba6 146 void get_sizes (bool height, int *min_value, int *max_value) override;
389e7ddb
TT
147
148private:
149
150 /* Type of content to display. */
151 std::string m_contents;
152
153 /* When a layout is applied, this is updated to point to the window
154 object. */
155 tui_gen_win_info *m_window = nullptr;
156};
157
158/* A TUI layout that holds other layouts. */
159class tui_layout_split : public tui_layout_base
160{
161public:
162
7c043ba6
TT
163 /* Create a new layout. If VERTICAL is true, then windows in this
164 layout will be arranged vertically. */
165 explicit tui_layout_split (bool vertical = true)
166 : m_vertical (vertical)
167 {
168 }
389e7ddb
TT
169
170 DISABLE_COPY_AND_ASSIGN (tui_layout_split);
171
172 /* Add a new split layout to this layout. WEIGHT is the desired
173 size, which is relative to the other weights given in this
174 layout. */
c22fef7e 175 void add_split (std::unique_ptr<tui_layout_split> &&layout, int weight);
389e7ddb
TT
176
177 /* Add a new window to this layout. NAME is the name of the window
178 to add. WEIGHT is the desired size, which is relative to the
179 other weights given in this layout. */
180 void add_window (const char *name, int weight);
181
182 std::unique_ptr<tui_layout_base> clone () const override;
183
184 void apply (int x, int y, int width, int height) override;
185
6bc56648 186 tui_adjust_result adjust_size (const char *name, int new_height) override;
389e7ddb
TT
187
188 bool top_boxed_p () const override;
189
190 bool bottom_boxed_p () const override;
191
5afe342e
TT
192 void remove_windows (const char *name) override;
193
416eb92d
TT
194 void replace_window (const char *name, const char *new_window) override;
195
c22fef7e 196 void specification (ui_file *output, int depth) override;
ee325b61 197
389e7ddb
TT
198protected:
199
7c043ba6 200 void get_sizes (bool height, int *min_value, int *max_value) override;
389e7ddb
TT
201
202private:
203
204 /* Set the weights from the current heights. */
205 void set_weights_from_heights ();
206
207 struct split
208 {
209 /* The requested weight. */
210 int weight;
211 /* The layout. */
212 std::unique_ptr<tui_layout_base> layout;
213 };
214
215 /* The splits. */
216 std::vector<split> m_splits;
217
7c043ba6
TT
218 /* True if the windows in this split are arranged vertically. */
219 bool m_vertical;
220
389e7ddb
TT
221 /* True if this layout has already been applied at least once. */
222 bool m_applied = false;
223};
224
59b8b5d2
TT
225/* Add the specified window to the layout in a logical way. This
226 means setting up the most logical layout given the window to be
227 added. Only the source or disassembly window can be added this
228 way. */
080ce8c0 229extern void tui_add_win_to_layout (enum tui_win_type);
59b8b5d2 230
416eb92d
TT
231/* Set the initial layout. */
232extern void tui_set_initial_layout ();
c906108c 233
427326a8
TT
234/* Switch to the next layout. */
235extern void tui_next_layout ();
236
0dbc2fc7
TT
237/* Show the register window. Like "layout regs". */
238extern void tui_regs_layout ();
239
5afe342e
TT
240/* Remove some windows from the layout, leaving only the focused
241 window and the command window; if no window has the focus, then
242 some other window is chosen to remain. */
243extern void tui_remove_some_windows ();
244
2192a9d3
TT
245/* Apply the current layout. */
246extern void tui_apply_current_layout ();
247
d4eeccfe
TT
248/* Adjust the window height of WIN to NEW_HEIGHT. */
249extern void tui_adjust_window_height (struct tui_win_info *win,
250 int new_height);
251
01b1af32
TT
252/* The type of a function that is used to create a TUI window. */
253
254typedef std::function<tui_gen_win_info * (const char *name)> window_factory;
255
256/* Register a new TUI window type. NAME is the name of the window
257 type. FACTORY is a function that can be called to instantiate the
258 window. */
259
260extern void tui_register_window (const char *name, window_factory &&factory);
261
1a5c2598 262#endif /* TUI_TUI_LAYOUT_H */
This page took 2.655651 seconds and 4 git commands to generate.