GDB (xrefs)
tui-interp.c
Go to the documentation of this file.
1 /* TUI Interpreter definitions for GDB, the GNU debugger.
2 
3  Copyright (C) 2003-2015 Free Software Foundation, Inc.
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
9  the Free Software Foundation; either version 3 of the License, or
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
18  along with this program. If not, see <http://www.gnu.org/licenses/>. */
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"
26 #include "cli-out.h"
27 #include "tui/tui-data.h"
28 #include "readline/readline.h"
29 #include "tui/tui-win.h"
30 #include "tui/tui.h"
31 #include "tui/tui-io.h"
32 #include "infrun.h"
33 #include "observer.h"
34 
35 static struct ui_out *tui_ui_out (struct interp *self);
36 
37 /* Set to 1 when the TUI mode must be activated when we first start
38  gdb. */
39 static int tui_start_enabled = 0;
40 
41 /* The TUI interpreter. */
42 static struct interp *tui_interp;
43 
44 /* Cleanup the tui before exiting. */
45 
46 static void
47 tui_exit (void)
48 {
49  /* Disable the tui. Curses mode is left leaving the screen in a
50  clean state (see endwin()). */
51  tui_disable ();
52 }
53 
54 /* Observers for several run control events. If the interpreter is
55  quiet (i.e., another interpreter is being run with
56  interpreter-exec), print nothing. */
57 
58 /* Observer for the signal_received notification. */
59 
60 static void
61 tui_on_signal_received (enum gdb_signal siggnal)
62 {
63  if (!interp_quiet_p (tui_interp))
64  print_signal_received_reason (tui_ui_out (tui_interp), siggnal);
65 }
66 
67 /* Observer for the end_stepping_range notification. */
68 
69 static void
71 {
72  if (!interp_quiet_p (tui_interp))
74 }
75 
76 /* Observer for the signal_exited notification. */
77 
78 static void
79 tui_on_signal_exited (enum gdb_signal siggnal)
80 {
81  if (!interp_quiet_p (tui_interp))
82  print_signal_exited_reason (tui_ui_out (tui_interp), siggnal);
83 }
84 
85 /* Observer for the exited notification. */
86 
87 static void
88 tui_on_exited (int exitstatus)
89 {
90  if (!interp_quiet_p (tui_interp))
91  print_exited_reason (tui_ui_out (tui_interp), exitstatus);
92 }
93 
94 /* Observer for the no_history notification. */
95 
96 static void
98 {
99  if (!interp_quiet_p (tui_interp))
100  print_no_history_reason (tui_ui_out (tui_interp));
101 }
102 
103 /* Observer for the sync_execution_done notification. */
104 
105 static void
107 {
108  if (!interp_quiet_p (tui_interp))
109  display_gdb_prompt (NULL);
110 }
111 
112 /* Observer for the command_error notification. */
113 
114 static void
116 {
117  if (!interp_quiet_p (tui_interp))
118  display_gdb_prompt (NULL);
119 }
120 
121 /* These implement the TUI interpreter. */
122 
123 static void *
124 tui_init (struct interp *self, int top_level)
125 {
126  /* Install exit handler to leave the screen in a good shape. */
127  atexit (tui_exit);
128 
130 
135 
136  /* If changing this, remember to update cli-interp.c as well. */
144 
145  return NULL;
146 }
147 
148 static int
149 tui_resume (void *data)
150 {
151  struct ui_file *stream;
152 
153  /* gdb_setup_readline will change gdb_stdout. If the TUI was
154  previously writing to gdb_stdout, then set it to the new
155  gdb_stdout afterwards. */
156 
158  if (stream != gdb_stdout)
159  {
161  stream = NULL;
162  }
163 
165 
166  if (stream != NULL)
168 
169  if (tui_start_enabled)
170  tui_enable ();
171  return 1;
172 }
173 
174 static int
175 tui_suspend (void *data)
176 {
178  tui_disable ();
179  return 1;
180 }
181 
182 static struct ui_out *
183 tui_ui_out (struct interp *self)
184 {
185  if (tui_active)
186  return tui_out;
187  else
188  return tui_old_uiout;
189 }
190 
191 static struct gdb_exception
192 tui_exec (void *data, const char *command_str)
193 {
194  internal_error (__FILE__, __LINE__, _("tui_exec called"));
195 }
196 
197 /* Provide a prototype to silence -Wmissing-prototypes. */
199 
200 void
202 {
203  static const struct interp_procs procs = {
204  tui_init,
205  tui_resume,
206  tui_suspend,
207  tui_exec,
208  tui_ui_out,
209  NULL,
211  };
212 
213  /* Create a default uiout builder for the TUI. */
214  tui_interp = interp_new (INTERP_TUI, &procs);
215  interp_add (tui_interp);
216  if (interpreter_p && strcmp (interpreter_p, INTERP_TUI) == 0)
217  tui_start_enabled = 1;
218 
219  if (interpreter_p && strcmp (interpreter_p, INTERP_CONSOLE) == 0)
220  {
222  interpreter_p = xstrdup (INTERP_TUI);
223  }
224 }
static int tui_suspend(void *data)
Definition: tui-interp.c:175
Definition: interps.c:48
static void tui_on_command_error(void)
Definition: tui-interp.c:115
struct ui_file * cli_out_set_stream(struct ui_out *uiout, struct ui_file *stream)
Definition: cli-out.c:410
void print_signal_received_reason(struct ui_out *uiout, enum gdb_signal siggnal)
Definition: infrun.c:6441
int interp_quiet_p(struct interp *interp)
Definition: interps.c:321
void xfree(void *)
Definition: common-utils.c:97
int tui_active
Definition: tui.c:59
void print_no_history_reason(struct ui_out *uiout)
Definition: infrun.c:6475
int ui_file_isatty(struct ui_file *file)
Definition: ui-file.c:198
void tui_initialize_static_data(void)
Definition: tui-data.c:432
#define INTERP_TUI
Definition: interps.h:113
struct ui_file * gdb_stdout
Definition: main.c:71
static void tui_exit(void)
Definition: tui-interp.c:47
void internal_error(const char *file, int line, const char *fmt,...)
Definition: errors.c:50
static struct ui_out * tui_ui_out(struct interp *self)
Definition: tui-interp.c:183
struct observer * observer_attach_signal_exited(observer_signal_exited_ftype *f)
void print_exited_reason(struct ui_out *uiout, int exitstatus)
Definition: infrun.c:6408
void gdb_setup_readline(void)
Definition: event-top.c:1036
#define INTERP_CONSOLE
Definition: interps.h:108
#define _(String)
Definition: gdb_locale.h:40
void interp_add(struct interp *interp)
Definition: interps.c:105
struct observer * observer_attach_signal_received(observer_signal_received_ftype *f)
Definition: ui-out.c:99
static struct interp * tui_interp
Definition: tui-interp.c:42
static int tui_resume(void *data)
Definition: tui-interp.c:149
char * interpreter_p
Definition: main.c:51
static void tui_on_exited(int exitstatus)
Definition: tui-interp.c:88
struct observer * observer_attach_no_history(observer_no_history_ftype *f)
void print_signal_exited_reason(struct ui_out *uiout, enum gdb_signal siggnal)
Definition: infrun.c:6387
static void tui_on_no_history(void)
Definition: tui-interp.c:97
void initialize_file_ftype(void)
Definition: defs.h:281
struct ui_out * tui_old_uiout
Definition: tui-io.c:117
void tui_initialize_readline(void)
Definition: tui.c:325
void tui_disable(void)
Definition: tui.c:516
struct observer * observer_attach_command_error(observer_command_error_ftype *f)
initialize_file_ftype _initialize_tui_interp
struct observer * observer_attach_exited(observer_exited_ftype *f)
struct interp * interp_new(const char *name, const struct interp_procs *procs)
Definition: interps.c:84
void tui_initialize_win(void)
Definition: tui-win.c:941
void tui_initialize_io(void)
Definition: tui-io.c:536
static int tui_start_enabled
Definition: tui-interp.c:39
void cli_command_loop(void *data)
Definition: event-top.c:181
static struct gdb_exception tui_exec(void *data, const char *command_str)
Definition: tui-interp.c:192
void print_end_stepping_range_reason(struct ui_out *uiout)
Definition: infrun.c:6375
static void tui_on_end_stepping_range(void)
Definition: tui-interp.c:70
static void * tui_init(struct interp *self, int top_level)
Definition: tui-interp.c:124
struct ui_out * tui_out
Definition: tui-io.c:112
void display_gdb_prompt(const char *new_prompt)
Definition: event-top.c:291
static void tui_on_signal_received(enum gdb_signal siggnal)
Definition: tui-interp.c:61
static void tui_on_sync_execution_done(void)
Definition: tui-interp.c:106
void tui_enable(void)
Definition: tui.c:397
static void tui_on_signal_exited(enum gdb_signal siggnal)
Definition: tui-interp.c:79
struct observer * observer_attach_sync_execution_done(observer_sync_execution_done_ftype *f)
struct observer * observer_attach_end_stepping_range(observer_end_stepping_range_ftype *f)