3 Copyright (C) 2018-2021 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
21 #include "cli/cli-cmds.h"
22 #include "cli/cli-setshow.h"
23 #include "cli/cli-style.h"
24 #include "source-cache.h"
25 #include "observable.h"
27 /* True if styling is enabled. */
29 #if defined (__MSDOS__)
30 bool cli_styling
= false;
32 bool cli_styling
= true;
35 /* True if source styling is enabled. Note that this is only
36 consulted when cli_styling is true. */
38 bool source_styling
= true;
40 /* Name of colors; must correspond to ui_file_style::basic_color. */
41 static const char * const cli_colors
[] = {
54 /* Names of intensities; must correspond to
55 ui_file_style::intensity. */
56 static const char * const cli_intensities
[] = {
63 /* See cli-style.h. */
65 cli_style_option
file_name_style ("filename", ui_file_style::GREEN
);
67 /* See cli-style.h. */
69 cli_style_option
function_name_style ("function", ui_file_style::YELLOW
);
71 /* See cli-style.h. */
73 cli_style_option
variable_name_style ("variable", ui_file_style::CYAN
);
75 /* See cli-style.h. */
77 cli_style_option
address_style ("address", ui_file_style::BLUE
);
79 /* See cli-style.h. */
81 cli_style_option
highlight_style ("highlight", ui_file_style::RED
);
83 /* See cli-style.h. */
85 cli_style_option
title_style ("title", ui_file_style::BOLD
);
87 /* See cli-style.h. */
89 cli_style_option
tui_border_style ("tui-border", ui_file_style::CYAN
);
91 /* See cli-style.h. */
93 cli_style_option
tui_active_border_style ("tui-active-border",
96 /* See cli-style.h. */
98 cli_style_option
metadata_style ("metadata", ui_file_style::DIM
);
100 /* See cli-style.h. */
102 cli_style_option
version_style ("version", ui_file_style::MAGENTA
,
103 ui_file_style::BOLD
);
105 /* See cli-style.h. */
107 cli_style_option::cli_style_option (const char *name
,
108 ui_file_style::basic_color fg
,
109 ui_file_style::intensity intensity
)
112 m_foreground (cli_colors
[fg
- ui_file_style::NONE
]),
113 m_background (cli_colors
[0]),
114 m_intensity (cli_intensities
[intensity
])
118 /* See cli-style.h. */
120 cli_style_option::cli_style_option (const char *name
,
121 ui_file_style::intensity i
)
124 m_foreground (cli_colors
[0]),
125 m_background (cli_colors
[0]),
126 m_intensity (cli_intensities
[i
])
130 /* Return the color number corresponding to COLOR. */
133 color_number (const char *color
)
135 for (int i
= 0; i
< ARRAY_SIZE (cli_colors
); ++i
)
137 if (color
== cli_colors
[i
])
140 gdb_assert_not_reached ("color not found");
143 /* See cli-style.h. */
146 cli_style_option::style () const
148 int fg
= color_number (m_foreground
);
149 int bg
= color_number (m_background
);
150 ui_file_style::intensity intensity
= ui_file_style::NORMAL
;
152 for (int i
= 0; i
< ARRAY_SIZE (cli_intensities
); ++i
)
154 if (m_intensity
== cli_intensities
[i
])
156 intensity
= (ui_file_style::intensity
) i
;
161 return ui_file_style (fg
, bg
, intensity
);
164 /* See cli-style.h. */
167 cli_style_option::do_set_value (const char *ignore
, int from_tty
,
168 struct cmd_list_element
*cmd
)
170 cli_style_option
*cso
= (cli_style_option
*) get_cmd_context (cmd
);
171 cso
->changed
.notify ();
174 /* Implements the cli_style_option::do_show_* functions.
175 WHAT and VALUE are the property and value to show.
176 The style for which WHAT is shown is retrieved from CMD context. */
179 do_show (const char *what
, struct ui_file
*file
,
180 struct cmd_list_element
*cmd
,
183 cli_style_option
*cso
= (cli_style_option
*) get_cmd_context (cmd
);
184 fputs_filtered (_("The "), file
);
185 fprintf_styled (file
, cso
->style (), _("\"%s\" style"), cso
->name ());
186 fprintf_filtered (file
, _(" %s is: %s\n"), what
, value
);
189 /* See cli-style.h. */
192 cli_style_option::do_show_foreground (struct ui_file
*file
, int from_tty
,
193 struct cmd_list_element
*cmd
,
196 do_show (_("foreground color"), file
, cmd
, value
);
199 /* See cli-style.h. */
202 cli_style_option::do_show_background (struct ui_file
*file
, int from_tty
,
203 struct cmd_list_element
*cmd
,
206 do_show (_("background color"), file
, cmd
, value
);
209 /* See cli-style.h. */
212 cli_style_option::do_show_intensity (struct ui_file
*file
, int from_tty
,
213 struct cmd_list_element
*cmd
,
216 do_show (_("display intensity"), file
, cmd
, value
);
219 /* See cli-style.h. */
222 cli_style_option::add_setshow_commands (enum command_class theclass
,
223 const char *prefix_doc
,
224 struct cmd_list_element
**set_list
,
225 struct cmd_list_element
**show_list
,
228 add_basic_prefix_cmd (m_name
, no_class
, prefix_doc
, &m_set_list
,
230 add_show_prefix_cmd (m_name
, no_class
, prefix_doc
, &m_show_list
,
233 add_setshow_enum_cmd ("foreground", theclass
, cli_colors
,
235 _("Set the foreground color for this property."),
236 _("Show the foreground color for this property."),
240 &m_set_list
, &m_show_list
, (void *) this);
241 add_setshow_enum_cmd ("background", theclass
, cli_colors
,
243 _("Set the background color for this property."),
244 _("Show the background color for this property."),
248 &m_set_list
, &m_show_list
, (void *) this);
250 add_setshow_enum_cmd ("intensity", theclass
, cli_intensities
,
252 _("Set the display intensity for this property."),
253 _("Show the display intensity for this property."),
257 &m_set_list
, &m_show_list
, (void *) this);
260 static cmd_list_element
*style_set_list
;
261 static cmd_list_element
*style_show_list
;
264 set_style_enabled (const char *args
, int from_tty
, struct cmd_list_element
*c
)
266 g_source_cache
.clear ();
267 gdb::observers::source_styling_changed
.notify ();
271 show_style_enabled (struct ui_file
*file
, int from_tty
,
272 struct cmd_list_element
*c
, const char *value
)
275 fprintf_filtered (file
, _("CLI output styling is enabled.\n"));
277 fprintf_filtered (file
, _("CLI output styling is disabled.\n"));
281 show_style_sources (struct ui_file
*file
, int from_tty
,
282 struct cmd_list_element
*c
, const char *value
)
285 fprintf_filtered (file
, _("Source code styling is enabled.\n"));
287 fprintf_filtered (file
, _("Source code styling is disabled.\n"));
290 void _initialize_cli_style ();
292 _initialize_cli_style ()
294 add_basic_prefix_cmd ("style", no_class
, _("\
295 Style-specific settings.\n\
296 Configure various style-related variables, such as colors"),
297 &style_set_list
, 0, &setlist
);
298 add_show_prefix_cmd ("style", no_class
, _("\
299 Style-specific settings.\n\
300 Configure various style-related variables, such as colors"),
301 &style_show_list
, 0, &showlist
);
303 add_setshow_boolean_cmd ("enabled", no_class
, &cli_styling
, _("\
304 Set whether CLI styling is enabled."), _("\
305 Show whether CLI is enabled."), _("\
306 If enabled, output to the terminal is styled."),
307 set_style_enabled
, show_style_enabled
,
308 &style_set_list
, &style_show_list
);
310 add_setshow_boolean_cmd ("sources", no_class
, &source_styling
, _("\
311 Set whether source code styling is enabled."), _("\
312 Show whether source code styling is enabled."), _("\
313 If enabled, source code is styled.\n"
314 #ifdef HAVE_SOURCE_HIGHLIGHT
315 "Note that source styling only works if styling in general is enabled,\n\
316 see \"show style enabled\"."
318 "Source highlighting may be disabled in this installation of gdb, because\n\
319 it was not linked against GNU Source Highlight. However, it might still be\n\
320 available if the appropriate extension is available at runtime."
322 ), set_style_enabled
, show_style_sources
,
323 &style_set_list
, &style_show_list
);
325 file_name_style
.add_setshow_commands (no_class
, _("\
326 Filename display styling.\n\
327 Configure filename colors and display intensity."),
328 &style_set_list
, &style_show_list
,
331 function_name_style
.add_setshow_commands (no_class
, _("\
332 Function name display styling.\n\
333 Configure function name colors and display intensity"),
334 &style_set_list
, &style_show_list
,
337 variable_name_style
.add_setshow_commands (no_class
, _("\
338 Variable name display styling.\n\
339 Configure variable name colors and display intensity"),
340 &style_set_list
, &style_show_list
,
343 address_style
.add_setshow_commands (no_class
, _("\
344 Address display styling.\n\
345 Configure address colors and display intensity"),
346 &style_set_list
, &style_show_list
,
349 title_style
.add_setshow_commands (no_class
, _("\
350 Title display styling.\n\
351 Configure title colors and display intensity\n\
352 Some commands (such as \"apropos -v REGEXP\") use the title style to improve\n\
354 &style_set_list
, &style_show_list
,
357 highlight_style
.add_setshow_commands (no_class
, _("\
358 Highlight display styling.\n\
359 Configure highlight colors and display intensity\n\
360 Some commands use the highlight style to draw the attention to a part\n\
362 &style_set_list
, &style_show_list
,
365 metadata_style
.add_setshow_commands (no_class
, _("\
366 Metadata display styling.\n\
367 Configure metadata colors and display intensity\n\
368 The \"metadata\" style is used when GDB displays information about\n\
369 your data, for example \"<unavailable>\""),
370 &style_set_list
, &style_show_list
,
373 tui_border_style
.add_setshow_commands (no_class
, _("\
374 TUI border display styling.\n\
375 Configure TUI border colors\n\
376 The \"tui-border\" style is used when GDB displays the border of a\n\
377 TUI window that does not have the focus."),
378 &style_set_list
, &style_show_list
,
381 tui_active_border_style
.add_setshow_commands (no_class
, _("\
382 TUI active border display styling.\n\
383 Configure TUI active border colors\n\
384 The \"tui-active-border\" style is used when GDB displays the border of a\n\
385 TUI window that does have the focus."),
390 version_style
.add_setshow_commands (no_class
, _("\
391 Version string display styling.\n\
392 Configure colors used to display the GDB version string."),
393 &style_set_list
, &style_show_list
,