constify to_open
[deliverable/binutils-gdb.git] / gdb / tui / tui-interp.c
CommitLineData
021e7609
AC
1/* TUI Interpreter definitions for GDB, the GNU debugger.
2
ecd75fc8 3 Copyright (C) 2003-2014 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"
21#include "interps.h"
22#include "top.h"
23#include "event-top.h"
24#include "event-loop.h"
25#include "ui-out.h"
95cd630e 26#include "cli-out.h"
d7b2e967 27#include "tui/tui-data.h"
021e7609 28#include "readline/readline.h"
d7b2e967 29#include "tui/tui-win.h"
021e7609 30#include "tui/tui.h"
d7b2e967 31#include "tui/tui-io.h"
60250e8b 32#include "exceptions.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
fd664c91
PA
42/* The TUI interpreter. */
43static struct interp *tui_interp;
44
021e7609
AC
45/* Cleanup the tui before exiting. */
46
47static void
48tui_exit (void)
49{
1cc6d956
MS
50 /* Disable the tui. Curses mode is left leaving the screen in a
51 clean state (see endwin()). */
021e7609
AC
52 tui_disable ();
53}
54
956c2c8b
PA
55/* True if TUI is the top-level interpreter. */
56static int tui_is_toplevel = 0;
57
fd664c91
PA
58/* Observers for several run control events. If the interpreter is
59 quiet (i.e., another interpreter is being run with
60 interpreter-exec), print nothing. */
61
62/* Observer for the signal_received notification. */
63
64static void
65tui_on_signal_received (enum gdb_signal siggnal)
66{
67 if (!interp_quiet_p (tui_interp))
68 print_signal_received_reason (tui_ui_out (tui_interp), siggnal);
69}
70
71/* Observer for the end_stepping_range notification. */
72
73static void
74tui_on_end_stepping_range (void)
75{
76 if (!interp_quiet_p (tui_interp))
77 print_end_stepping_range_reason (tui_ui_out (tui_interp));
78}
79
80/* Observer for the signal_exited notification. */
81
82static void
83tui_on_signal_exited (enum gdb_signal siggnal)
84{
85 if (!interp_quiet_p (tui_interp))
86 print_signal_exited_reason (tui_ui_out (tui_interp), siggnal);
87}
88
89/* Observer for the exited notification. */
90
91static void
92tui_on_exited (int exitstatus)
93{
94 if (!interp_quiet_p (tui_interp))
95 print_exited_reason (tui_ui_out (tui_interp), exitstatus);
96}
97
98/* Observer for the no_history notification. */
99
100static void
101tui_on_no_history (void)
102{
103 if (!interp_quiet_p (tui_interp))
104 print_no_history_reason (tui_ui_out (tui_interp));
105}
106
92bcb5f9
PA
107/* Observer for the sync_execution_done notification. */
108
109static void
110tui_on_sync_execution_done (void)
111{
112 if (!interp_quiet_p (tui_interp))
113 display_gdb_prompt (NULL);
114}
115
116/* Observer for the command_error notification. */
117
118static void
119tui_on_command_error (void)
120{
121 if (!interp_quiet_p (tui_interp))
122 display_gdb_prompt (NULL);
123}
124
021e7609
AC
125/* These implement the TUI interpreter. */
126
127static void *
4801a9a3 128tui_init (struct interp *self, int top_level)
021e7609 129{
956c2c8b
PA
130 tui_is_toplevel = top_level;
131
021e7609
AC
132 /* Install exit handler to leave the screen in a good shape. */
133 atexit (tui_exit);
134
dd1abb8c 135 tui_initialize_static_data ();
021e7609
AC
136
137 tui_initialize_io ();
9612b5ec 138 tui_initialize_win ();
1180b2c8
L
139 if (ui_file_isatty (gdb_stdout))
140 tui_initialize_readline ();
021e7609 141
fd664c91
PA
142 /* If changing this, remember to update cli-interp.c as well. */
143 observer_attach_signal_received (tui_on_signal_received);
144 observer_attach_end_stepping_range (tui_on_end_stepping_range);
145 observer_attach_signal_exited (tui_on_signal_exited);
146 observer_attach_exited (tui_on_exited);
147 observer_attach_no_history (tui_on_no_history);
92bcb5f9
PA
148 observer_attach_sync_execution_done (tui_on_sync_execution_done);
149 observer_attach_command_error (tui_on_command_error);
fd664c91 150
021e7609
AC
151 return NULL;
152}
153
956c2c8b
PA
154/* True if enabling the TUI is allowed. Example, if the top level
155 interpreter is MI, enabling curses will certainly lose. */
156
157int
158tui_allowed_p (void)
159{
160 /* Only if TUI is the top level interpreter. Also don't try to
161 setup curses (and print funny control characters) if we're not
162 outputting to a terminal. */
163 return tui_is_toplevel && ui_file_isatty (gdb_stdout);
164}
165
021e7609
AC
166static int
167tui_resume (void *data)
168{
95cd630e
DJ
169 struct ui_file *stream;
170
1cc6d956
MS
171 /* gdb_setup_readline will change gdb_stdout. If the TUI was
172 previously writing to gdb_stdout, then set it to the new
173 gdb_stdout afterwards. */
95cd630e
DJ
174
175 stream = cli_out_set_stream (tui_old_uiout, gdb_stdout);
176 if (stream != gdb_stdout)
177 {
178 cli_out_set_stream (tui_old_uiout, stream);
179 stream = NULL;
180 }
181
021e7609 182 gdb_setup_readline ();
95cd630e
DJ
183
184 if (stream != NULL)
185 cli_out_set_stream (tui_old_uiout, gdb_stdout);
186
63858210
SC
187 if (tui_start_enabled)
188 tui_enable ();
021e7609
AC
189 return 1;
190}
191
192static int
193tui_suspend (void *data)
194{
63858210 195 tui_start_enabled = tui_active;
021e7609
AC
196 tui_disable ();
197 return 1;
198}
199
4801a9a3
PA
200static struct ui_out *
201tui_ui_out (struct interp *self)
202{
203 if (tui_active)
204 return tui_out;
205 else
206 return tui_old_uiout;
207}
208
71fff37b 209static struct gdb_exception
021e7609
AC
210tui_exec (void *data, const char *command_str)
211{
e2e0b3e5 212 internal_error (__FILE__, __LINE__, _("tui_exec called"));
021e7609
AC
213}
214
2c0b251b
PA
215/* Provide a prototype to silence -Wmissing-prototypes. */
216extern initialize_file_ftype _initialize_tui_interp;
217
021e7609
AC
218void
219_initialize_tui_interp (void)
220{
221 static const struct interp_procs procs = {
222 tui_init,
223 tui_resume,
224 tui_suspend,
225 tui_exec,
4801a9a3 226 tui_ui_out,
4d09c5b4
AB
227 NULL,
228 cli_command_loop
021e7609 229 };
021e7609 230
1cc6d956 231 /* Create a default uiout builder for the TUI. */
4801a9a3
PA
232 tui_interp = interp_new (INTERP_TUI, &procs);
233 interp_add (tui_interp);
cc4349ed 234 if (interpreter_p && strcmp (interpreter_p, INTERP_TUI) == 0)
63858210
SC
235 tui_start_enabled = 1;
236
237 if (interpreter_p && strcmp (interpreter_p, INTERP_CONSOLE) == 0)
238 {
239 xfree (interpreter_p);
cc4349ed 240 interpreter_p = xstrdup (INTERP_TUI);
63858210 241 }
021e7609 242}
This page took 1.23171 seconds and 4 git commands to generate.