Make command line editing (use of readline) be per UI
[deliverable/binutils-gdb.git] / gdb / tui / tui-interp.c
CommitLineData
021e7609
AC
1/* TUI Interpreter definitions for GDB, the GNU debugger.
2
618f726f 3 Copyright (C) 2003-2016 Free Software Foundation, Inc.
021e7609
AC
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
021e7609
AC
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
021e7609
AC
19
20#include "defs.h"
3c216924 21#include "cli/cli-interp.h"
021e7609
AC
22#include "interps.h"
23#include "top.h"
24#include "event-top.h"
25#include "event-loop.h"
26#include "ui-out.h"
95cd630e 27#include "cli-out.h"
d7b2e967 28#include "tui/tui-data.h"
021e7609 29#include "readline/readline.h"
d7b2e967 30#include "tui/tui-win.h"
021e7609 31#include "tui/tui.h"
d7b2e967 32#include "tui/tui-io.h"
fd664c91
PA
33#include "infrun.h"
34#include "observer.h"
35
36static struct ui_out *tui_ui_out (struct interp *self);
021e7609 37
1cc6d956
MS
38/* Set to 1 when the TUI mode must be activated when we first start
39 gdb. */
63858210
SC
40static int tui_start_enabled = 0;
41
73ab01a0
PA
42/* Returns the INTERP if the INTERP is a TUI, and returns NULL
43 otherwise. */
44
45static struct interp *
46as_tui_interp (struct interp *interp)
47{
48 if (strcmp (interp_name (interp), INTERP_TUI) == 0)
49 return interp;
50 return NULL;
51}
fd664c91 52
021e7609
AC
53/* Cleanup the tui before exiting. */
54
55static void
56tui_exit (void)
57{
1cc6d956
MS
58 /* Disable the tui. Curses mode is left leaving the screen in a
59 clean state (see endwin()). */
021e7609
AC
60 tui_disable ();
61}
62
fd664c91
PA
63/* Observers for several run control events. If the interpreter is
64 quiet (i.e., another interpreter is being run with
65 interpreter-exec), print nothing. */
66
243a9253
PA
67/* Observer for the normal_stop notification. */
68
69static void
70tui_on_normal_stop (struct bpstats *bs, int print_frame)
71{
73ab01a0
PA
72 struct switch_thru_all_uis state;
73
74 SWITCH_THRU_ALL_UIS (state)
243a9253 75 {
73ab01a0
PA
76 struct interp *tui = as_tui_interp (top_level_interpreter ());
77
78 if (tui == NULL)
79 continue;
80
243a9253 81 if (print_frame)
73ab01a0 82 print_stop_event (tui_ui_out (tui));
243a9253
PA
83 }
84}
85
fd664c91
PA
86/* Observer for the signal_received notification. */
87
88static void
89tui_on_signal_received (enum gdb_signal siggnal)
90{
73ab01a0
PA
91 struct switch_thru_all_uis state;
92
93 SWITCH_THRU_ALL_UIS (state)
94 {
95 struct interp *tui = as_tui_interp (top_level_interpreter ());
96
97 if (tui == NULL)
98 continue;
99
100 print_signal_received_reason (tui_ui_out (tui), siggnal);
101 }
fd664c91
PA
102}
103
104/* Observer for the end_stepping_range notification. */
105
106static void
107tui_on_end_stepping_range (void)
108{
73ab01a0
PA
109 struct switch_thru_all_uis state;
110
111 SWITCH_THRU_ALL_UIS (state)
112 {
113 struct interp *tui = as_tui_interp (top_level_interpreter ());
114
115 if (tui == NULL)
116 continue;
117
118 print_end_stepping_range_reason (tui_ui_out (tui));
119 }
fd664c91
PA
120}
121
122/* Observer for the signal_exited notification. */
123
124static void
125tui_on_signal_exited (enum gdb_signal siggnal)
126{
73ab01a0
PA
127 struct switch_thru_all_uis state;
128
129 SWITCH_THRU_ALL_UIS (state)
130 {
131 struct interp *tui = as_tui_interp (top_level_interpreter ());
132
133 if (tui == NULL)
134 continue;
135
136 print_signal_exited_reason (tui_ui_out (tui), siggnal);
137 }
fd664c91
PA
138}
139
140/* Observer for the exited notification. */
141
142static void
143tui_on_exited (int exitstatus)
144{
73ab01a0
PA
145 struct switch_thru_all_uis state;
146
147 SWITCH_THRU_ALL_UIS (state)
148 {
149 struct interp *tui = as_tui_interp (top_level_interpreter ());
150
151 if (tui == NULL)
152 continue;
153
154 print_exited_reason (tui_ui_out (tui), exitstatus);
155 }
fd664c91
PA
156}
157
158/* Observer for the no_history notification. */
159
160static void
161tui_on_no_history (void)
162{
73ab01a0
PA
163 struct switch_thru_all_uis state;
164
165 SWITCH_THRU_ALL_UIS (state)
166 {
167 struct interp *tui = as_tui_interp (top_level_interpreter ());
168
169 if (tui == NULL)
170 continue;
171
172 print_no_history_reason (tui_ui_out (tui));
173 }
fd664c91
PA
174}
175
92bcb5f9
PA
176/* Observer for the sync_execution_done notification. */
177
178static void
179tui_on_sync_execution_done (void)
180{
73ab01a0
PA
181 struct interp *tui = as_tui_interp (top_level_interpreter ());
182
183 if (tui == NULL)
184 return;
185
186 display_gdb_prompt (NULL);
92bcb5f9
PA
187}
188
189/* Observer for the command_error notification. */
190
191static void
192tui_on_command_error (void)
193{
73ab01a0
PA
194 struct interp *tui = as_tui_interp (top_level_interpreter ());
195
196 if (tui == NULL)
197 return;
198
199 display_gdb_prompt (NULL);
92bcb5f9
PA
200}
201
021e7609
AC
202/* These implement the TUI interpreter. */
203
204static void *
4801a9a3 205tui_init (struct interp *self, int top_level)
021e7609
AC
206{
207 /* Install exit handler to leave the screen in a good shape. */
208 atexit (tui_exit);
209
dd1abb8c 210 tui_initialize_static_data ();
021e7609
AC
211
212 tui_initialize_io ();
9612b5ec 213 tui_initialize_win ();
1180b2c8
L
214 if (ui_file_isatty (gdb_stdout))
215 tui_initialize_readline ();
021e7609
AC
216
217 return NULL;
218}
219
220static int
221tui_resume (void *data)
222{
3c216924 223 struct ui *ui = current_ui;
95cd630e
DJ
224 struct ui_file *stream;
225
1cc6d956
MS
226 /* gdb_setup_readline will change gdb_stdout. If the TUI was
227 previously writing to gdb_stdout, then set it to the new
228 gdb_stdout afterwards. */
95cd630e
DJ
229
230 stream = cli_out_set_stream (tui_old_uiout, gdb_stdout);
231 if (stream != gdb_stdout)
232 {
233 cli_out_set_stream (tui_old_uiout, stream);
234 stream = NULL;
235 }
236
3c216924
PA
237 gdb_setup_readline (1);
238
239 ui->input_handler = command_line_handler;
95cd630e
DJ
240
241 if (stream != NULL)
242 cli_out_set_stream (tui_old_uiout, gdb_stdout);
243
63858210
SC
244 if (tui_start_enabled)
245 tui_enable ();
021e7609
AC
246 return 1;
247}
248
249static int
250tui_suspend (void *data)
251{
63858210 252 tui_start_enabled = tui_active;
021e7609
AC
253 tui_disable ();
254 return 1;
255}
256
4801a9a3
PA
257static struct ui_out *
258tui_ui_out (struct interp *self)
259{
260 if (tui_active)
261 return tui_out;
262 else
263 return tui_old_uiout;
264}
265
71fff37b 266static struct gdb_exception
021e7609
AC
267tui_exec (void *data, const char *command_str)
268{
e2e0b3e5 269 internal_error (__FILE__, __LINE__, _("tui_exec called"));
021e7609
AC
270}
271
8322445e
PA
272/* The TUI interpreter's vtable. */
273
274static const struct interp_procs tui_interp_procs = {
275 tui_init,
276 tui_resume,
277 tui_suspend,
278 tui_exec,
279 tui_ui_out,
280 NULL,
3c216924
PA
281 cli_command_loop,
282 cli_interpreter_supports_command_editing,
8322445e
PA
283};
284
285/* Factory for TUI interpreters. */
286
287static struct interp *
288tui_interp_factory (const char *name)
289{
290 return interp_new (name, &tui_interp_procs, NULL);
291}
292
2c0b251b
PA
293/* Provide a prototype to silence -Wmissing-prototypes. */
294extern initialize_file_ftype _initialize_tui_interp;
295
021e7609
AC
296void
297_initialize_tui_interp (void)
298{
8322445e
PA
299 interp_factory_register (INTERP_TUI, tui_interp_factory);
300
cc4349ed 301 if (interpreter_p && strcmp (interpreter_p, INTERP_TUI) == 0)
63858210
SC
302 tui_start_enabled = 1;
303
304 if (interpreter_p && strcmp (interpreter_p, INTERP_CONSOLE) == 0)
305 {
306 xfree (interpreter_p);
cc4349ed 307 interpreter_p = xstrdup (INTERP_TUI);
63858210 308 }
73ab01a0
PA
309
310 /* If changing this, remember to update cli-interp.c as well. */
311 observer_attach_normal_stop (tui_on_normal_stop);
312 observer_attach_signal_received (tui_on_signal_received);
313 observer_attach_end_stepping_range (tui_on_end_stepping_range);
314 observer_attach_signal_exited (tui_on_signal_exited);
315 observer_attach_exited (tui_on_exited);
316 observer_attach_no_history (tui_on_no_history);
317 observer_attach_sync_execution_done (tui_on_sync_execution_done);
318 observer_attach_command_error (tui_on_command_error);
021e7609 319}
This page took 1.350181 seconds and 4 git commands to generate.