Handle ambiguity in tui_partial_win_by_name
[deliverable/binutils-gdb.git] / gdb / tui / tui-win.c
CommitLineData
f377b406 1/* TUI window generic functions.
f33c6cbf 2
b811d2c2 3 Copyright (C) 1998-2020 Free Software Foundation, Inc.
f33c6cbf 4
f377b406 5 Contributed by Hewlett-Packard Company.
c906108c 6
f377b406
SC
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
SC
21
22/* This module contains procedures for handling tui window functions
23 like resize, scrolling, scrolling, changing focus, etc.
24
25 Author: Susan B. Macchia */
c906108c 26
c906108c
SS
27#include "defs.h"
28#include "command.h"
29#include "symtab.h"
30#include "breakpoint.h"
31#include "frame.h"
41783295 32#include "cli/cli-cmds.h"
a2a7af0c 33#include "cli/cli-style.h"
3e752b04 34#include "top.h"
52575520 35#include "source.h"
c4ef48c6 36#include "event-loop.h"
45e42163 37#include "gdbcmd.h"
c906108c 38
d7b2e967 39#include "tui/tui.h"
c4ef48c6 40#include "tui/tui-io.h"
ce38393b 41#include "tui/tui-command.h"
d7b2e967 42#include "tui/tui-data.h"
3df505f6 43#include "tui/tui-layout.h"
d7b2e967
AC
44#include "tui/tui-wingeneral.h"
45#include "tui/tui-stack.h"
46#include "tui/tui-regs.h"
47#include "tui/tui-disasm.h"
48#include "tui/tui-source.h"
49#include "tui/tui-winsource.h"
2c0b251b 50#include "tui/tui-win.h"
c906108c 51
6a83354a 52#include "gdb_curses.h"
96ec9981 53#include <ctype.h>
dbda9972 54#include "readline/readline.h"
9f6ad286 55#include "gdbsupport/gdb_string_view.h"
96ec9981 56
9612b5ec
UW
57#include <signal.h>
58
0b39b52e
TT
59static void tui_set_tab_width_command (const char *, int);
60static void tui_refresh_all_command (const char *, int);
1d12d88f 61static void tui_all_windows_info (const char *, int);
0b39b52e
TT
62static void tui_scroll_forward_command (const char *, int);
63static void tui_scroll_backward_command (const char *, int);
64static void tui_scroll_left_command (const char *, int);
65static void tui_scroll_right_command (const char *, int);
66static void parse_scrolling_args (const char *,
08ef48c5
MS
67 struct tui_win_info **,
68 int *);
c906108c
SS
69
70
57dbb3af 71#define WIN_HEIGHT_USAGE "Usage: winheight WINDOW-NAME [+ | -] NUM-LINES\n"
bf212be1 72#define FOCUS_USAGE "Usage: focus [WINDOW-NAME | next | prev]\n"
c906108c 73
17aae570
SC
74#ifndef ACS_LRCORNER
75# define ACS_LRCORNER '+'
76#endif
77#ifndef ACS_LLCORNER
78# define ACS_LLCORNER '+'
79#endif
80#ifndef ACS_ULCORNER
81# define ACS_ULCORNER '+'
82#endif
83#ifndef ACS_URCORNER
84# define ACS_URCORNER '+'
85#endif
86#ifndef ACS_HLINE
87# define ACS_HLINE '-'
88#endif
89#ifndef ACS_VLINE
90# define ACS_VLINE '|'
91#endif
92
af101512 93/* Possible values for tui-border-kind variable. */
40478521 94static const char *const tui_border_kind_enums[] = {
af101512
SC
95 "space",
96 "ascii",
97 "acs",
98 NULL
99};
100
101/* Possible values for tui-border-mode and tui-active-border-mode. */
40478521 102static const char *const tui_border_mode_enums[] = {
af101512
SC
103 "normal",
104 "standout",
105 "reverse",
106 "half",
107 "half-standout",
108 "bold",
109 "bold-standout",
110 NULL
111};
112
113struct tui_translate
114{
115 const char *name;
116 int value;
117};
118
119/* Translation table for border-mode variables.
120 The list of values must be terminated by a NULL.
121 After the NULL value, an entry defines the default. */
3d34df0a 122static struct tui_translate tui_border_mode_translate[] = {
af101512
SC
123 { "normal", A_NORMAL },
124 { "standout", A_STANDOUT },
125 { "reverse", A_REVERSE },
126 { "half", A_DIM },
127 { "half-standout", A_DIM | A_STANDOUT },
128 { "bold", A_BOLD },
129 { "bold-standout", A_BOLD | A_STANDOUT },
130 { 0, 0 },
131 { "normal", A_NORMAL }
132};
133
134/* Translation tables for border-kind, one for each border
135 character (see wborder, border curses operations).
136 -1 is used to indicate the ACS because ACS characters
137 are determined at run time by curses (depends on terminal). */
3d34df0a 138static struct tui_translate tui_border_kind_translate_vline[] = {
af101512
SC
139 { "space", ' ' },
140 { "ascii", '|' },
141 { "acs", -1 },
142 { 0, 0 },
143 { "ascii", '|' }
144};
145
3d34df0a 146static struct tui_translate tui_border_kind_translate_hline[] = {
af101512
SC
147 { "space", ' ' },
148 { "ascii", '-' },
149 { "acs", -1 },
150 { 0, 0 },
151 { "ascii", '-' }
152};
153
3d34df0a 154static struct tui_translate tui_border_kind_translate_ulcorner[] = {
af101512
SC
155 { "space", ' ' },
156 { "ascii", '+' },
157 { "acs", -1 },
158 { 0, 0 },
159 { "ascii", '+' }
160};
161
3d34df0a 162static struct tui_translate tui_border_kind_translate_urcorner[] = {
af101512
SC
163 { "space", ' ' },
164 { "ascii", '+' },
165 { "acs", -1 },
166 { 0, 0 },
167 { "ascii", '+' }
168};
169
3d34df0a 170static struct tui_translate tui_border_kind_translate_llcorner[] = {
af101512
SC
171 { "space", ' ' },
172 { "ascii", '+' },
173 { "acs", -1 },
174 { 0, 0 },
175 { "ascii", '+' }
176};
177
3d34df0a 178static struct tui_translate tui_border_kind_translate_lrcorner[] = {
af101512
SC
179 { "space", ' ' },
180 { "ascii", '+' },
181 { "acs", -1 },
182 { 0, 0 },
183 { "ascii", '+' }
184};
185
186
187/* Tui configuration variables controlled with set/show command. */
3d34df0a 188static const char *tui_active_border_mode = "bold-standout";
920d2a44 189static void
08ef48c5
MS
190show_tui_active_border_mode (struct ui_file *file,
191 int from_tty,
192 struct cmd_list_element *c,
193 const char *value)
920d2a44
AC
194{
195 fprintf_filtered (file, _("\
196The attribute mode to use for the active TUI window border is \"%s\".\n"),
197 value);
198}
199
3d34df0a 200static const char *tui_border_mode = "normal";
920d2a44 201static void
08ef48c5
MS
202show_tui_border_mode (struct ui_file *file,
203 int from_tty,
204 struct cmd_list_element *c,
205 const char *value)
920d2a44
AC
206{
207 fprintf_filtered (file, _("\
208The attribute mode to use for the TUI window borders is \"%s\".\n"),
209 value);
210}
211
3d34df0a 212static const char *tui_border_kind = "acs";
920d2a44 213static void
08ef48c5
MS
214show_tui_border_kind (struct ui_file *file,
215 int from_tty,
216 struct cmd_list_element *c,
217 const char *value)
920d2a44
AC
218{
219 fprintf_filtered (file, _("The kind of border for TUI windows is \"%s\".\n"),
220 value);
221}
222
af101512 223
1cc6d956
MS
224/* Tui internal configuration variables. These variables are updated
225 by tui_update_variables to reflect the tui configuration
af101512
SC
226 variables. */
227chtype tui_border_vline;
228chtype tui_border_hline;
229chtype tui_border_ulcorner;
230chtype tui_border_urcorner;
231chtype tui_border_llcorner;
232chtype tui_border_lrcorner;
233
234int tui_border_attrs;
235int tui_active_border_attrs;
236
237/* Identify the item in the translation table.
238 When the item is not recognized, use the default entry. */
239static struct tui_translate *
240translate (const char *name, struct tui_translate *table)
241{
242 while (table->name)
243 {
244 if (name && strcmp (table->name, name) == 0)
245 return table;
246 table++;
247 }
248
249 /* Not found, return default entry. */
250 table++;
251 return table;
252}
253
254/* Update the tui internal configuration according to gdb settings.
255 Returns 1 if the configuration has changed and the screen should
256 be redrawn. */
87d557ae
TT
257bool
258tui_update_variables ()
af101512 259{
87d557ae 260 bool need_redraw = false;
af101512
SC
261 struct tui_translate *entry;
262
263 entry = translate (tui_border_mode, tui_border_mode_translate);
264 if (tui_border_attrs != entry->value)
265 {
266 tui_border_attrs = entry->value;
87d557ae 267 need_redraw = true;
af101512
SC
268 }
269 entry = translate (tui_active_border_mode, tui_border_mode_translate);
270 if (tui_active_border_attrs != entry->value)
271 {
272 tui_active_border_attrs = entry->value;
87d557ae 273 need_redraw = true;
af101512
SC
274 }
275
276 /* If one corner changes, all characters are changed.
277 Only check the first one. The ACS characters are determined at
278 run time by curses terminal management. */
279 entry = translate (tui_border_kind, tui_border_kind_translate_lrcorner);
280 if (tui_border_lrcorner != (chtype) entry->value)
281 {
282 tui_border_lrcorner = (entry->value < 0) ? ACS_LRCORNER : entry->value;
87d557ae 283 need_redraw = true;
af101512
SC
284 }
285 entry = translate (tui_border_kind, tui_border_kind_translate_llcorner);
286 tui_border_llcorner = (entry->value < 0) ? ACS_LLCORNER : entry->value;
287
288 entry = translate (tui_border_kind, tui_border_kind_translate_ulcorner);
289 tui_border_ulcorner = (entry->value < 0) ? ACS_ULCORNER : entry->value;
290
291 entry = translate (tui_border_kind, tui_border_kind_translate_urcorner);
292 tui_border_urcorner = (entry->value < 0) ? ACS_URCORNER : entry->value;
293
294 entry = translate (tui_border_kind, tui_border_kind_translate_hline);
295 tui_border_hline = (entry->value < 0) ? ACS_HLINE : entry->value;
296
297 entry = translate (tui_border_kind, tui_border_kind_translate_vline);
298 tui_border_vline = (entry->value < 0) ? ACS_VLINE : entry->value;
299
300 return need_redraw;
301}
302
c9684879 303static void
981a3fb3 304set_tui_cmd (const char *args, int from_tty)
c9684879
SC
305{
306}
307
308static void
981a3fb3 309show_tui_cmd (const char *args, int from_tty)
c9684879
SC
310{
311}
af101512 312
10f59415
SC
313static struct cmd_list_element *tuilist;
314
315static void
981a3fb3 316tui_command (const char *args, int from_tty)
10f59415 317{
a3f17187
AC
318 printf_unfiltered (_("\"tui\" must be followed by the name of a "
319 "tui command.\n"));
635c7e8a 320 help_list (tuilist, "tui ", all_commands, gdb_stdout);
10f59415
SC
321}
322
323struct cmd_list_element **
da745b36 324tui_get_cmd_list (void)
10f59415
SC
325{
326 if (tuilist == 0)
327 add_prefix_cmd ("tui", class_tui, tui_command,
1bedd215 328 _("Text User Interface commands."),
10f59415
SC
329 &tuilist, "tui ", 0, &cmdlist);
330 return &tuilist;
331}
332
6cdb25f4
EZ
333/* The set_func hook of "set tui ..." commands that affect the window
334 borders on the TUI display. */
3b5c1d49
SM
335
336static void
eb4c3f4a
TT
337tui_set_var_cmd (const char *null_args,
338 int from_tty, struct cmd_list_element *c)
6cdb25f4
EZ
339{
340 if (tui_update_variables () && tui_active)
341 tui_rehighlight_all ();
342}
343
45e42163
TT
344\f
345
346/* True if TUI resizes should print a message. This is used by the
347 test suite. */
348
349static bool resize_message;
350
351static void
352show_tui_resize_message (struct ui_file *file, int from_tty,
353 struct cmd_list_element *c, const char *value)
354{
355 fprintf_filtered (file, _("TUI resize messaging is %s.\n"), value);
356}
357
358\f
359
97605e61
AB
360/* Generic window name completion function. Complete window name pointed
361 to by TEXT and WORD. If INCLUDE_NEXT_PREV_P is true then the special
362 window names 'next' and 'prev' will also be considered as possible
363 completions of the window name. */
2e52ae68 364
eb3ff9a5
PA
365static void
366window_name_completer (completion_tracker &tracker,
367 int include_next_prev_p,
97605e61 368 const char *text, const char *word)
2e52ae68 369{
625ad440 370 std::vector<const char *> completion_name_vec;
2e52ae68 371
1ce3e844 372 for (tui_win_info *win_info : all_tui_windows ())
2e52ae68
PP
373 {
374 const char *completion_name = NULL;
375
376 /* We can't focus on an invisible window. */
2d83e710 377 if (!win_info->is_visible ())
2e52ae68
PP
378 continue;
379
1ce3e844 380 completion_name = win_info->name ();
150375dc 381 gdb_assert (completion_name != NULL);
625ad440 382 completion_name_vec.push_back (completion_name);
2e52ae68
PP
383 }
384
385 /* If no windows are considered visible then the TUI has not yet been
386 initialized. But still "focus src" and "focus cmd" will work because
387 invoking the focus command will entail initializing the TUI which sets the
416eb92d 388 default layout to "src". */
625ad440 389 if (completion_name_vec.empty ())
2e52ae68 390 {
625ad440
SM
391 completion_name_vec.push_back (SRC_NAME);
392 completion_name_vec.push_back (CMD_NAME);
2e52ae68
PP
393 }
394
97605e61
AB
395 if (include_next_prev_p)
396 {
625ad440
SM
397 completion_name_vec.push_back ("next");
398 completion_name_vec.push_back ("prev");
97605e61 399 }
2e52ae68 400
2e52ae68 401
625ad440
SM
402 completion_name_vec.push_back (NULL);
403 complete_on_enum (tracker, completion_name_vec.data (), text, word);
2e52ae68
PP
404}
405
97605e61
AB
406/* Complete possible window names to focus on. TEXT is the complete text
407 entered so far, WORD is the word currently being completed. */
408
eb3ff9a5 409static void
97605e61 410focus_completer (struct cmd_list_element *ignore,
eb3ff9a5
PA
411 completion_tracker &tracker,
412 const char *text, const char *word)
97605e61 413{
eb3ff9a5 414 window_name_completer (tracker, 1, text, word);
97605e61
AB
415}
416
417/* Complete possible window names for winheight command. TEXT is the
418 complete text entered so far, WORD is the word currently being
419 completed. */
420
eb3ff9a5 421static void
97605e61 422winheight_completer (struct cmd_list_element *ignore,
eb3ff9a5 423 completion_tracker &tracker,
97605e61
AB
424 const char *text, const char *word)
425{
426 /* The first word is the window name. That we can complete. Subsequent
427 words can't be completed. */
428 if (word != text)
eb3ff9a5 429 return;
97605e61 430
eb3ff9a5 431 window_name_completer (tracker, 0, text, word);
97605e61
AB
432}
433
3e752b04
SC
434/* Update gdb's knowledge of the terminal size. */
435void
d02c80cd 436tui_update_gdb_sizes (void)
3e752b04 437{
d6e5e7f7
PP
438 int width, height;
439
440 if (tui_active)
441 {
cb2ce893
TT
442 width = TUI_CMD_WIN->width;
443 height = TUI_CMD_WIN->height;
d6e5e7f7
PP
444 }
445 else
446 {
447 width = tui_term_width ();
448 height = tui_term_height ();
449 }
450
451 set_screen_width_and_height (width, height);
3e752b04
SC
452}
453
c906108c 454
1cc6d956 455/* Set the logical focus to win_info. */
c906108c 456void
5b6fe301 457tui_set_win_focus_to (struct tui_win_info *win_info)
c906108c 458{
6d012f14 459 if (win_info != NULL)
c906108c 460 {
5b6fe301 461 struct tui_win_info *win_with_focus = tui_win_with_focus ();
c906108c 462
bbc228ee 463 tui_unhighlight_win (win_with_focus);
6d012f14 464 tui_set_win_with_focus (win_info);
bbc228ee 465 tui_highlight_win (win_info);
c906108c 466 }
6ba8e26f 467}
c906108c
SS
468
469
c906108c 470void
13446e05 471tui_win_info::forward_scroll (int num_to_scroll)
c906108c 472{
13446e05 473 if (num_to_scroll == 0)
cb2ce893 474 num_to_scroll = height - 3;
c906108c 475
c3bd716f 476 do_scroll_vertical (num_to_scroll);
a21fcd8f 477}
c906108c 478
c906108c 479void
13446e05 480tui_win_info::backward_scroll (int num_to_scroll)
c906108c 481{
13446e05 482 if (num_to_scroll == 0)
cb2ce893 483 num_to_scroll = height - 3;
13446e05 484
c3bd716f 485 do_scroll_vertical (-num_to_scroll);
a21fcd8f 486}
c906108c
SS
487
488
c906108c 489void
13446e05 490tui_win_info::left_scroll (int num_to_scroll)
c906108c 491{
13446e05
TT
492 if (num_to_scroll == 0)
493 num_to_scroll = 1;
494
c3bd716f 495 do_scroll_horizontal (num_to_scroll);
a21fcd8f 496}
c906108c
SS
497
498
c906108c 499void
13446e05 500tui_win_info::right_scroll (int num_to_scroll)
c906108c 501{
13446e05
TT
502 if (num_to_scroll == 0)
503 num_to_scroll = 1;
504
c3bd716f 505 do_scroll_horizontal (-num_to_scroll);
e8b915dc 506}
c906108c
SS
507
508
c906108c 509void
a21fcd8f 510tui_refresh_all_win (void)
c906108c 511{
3e266828 512 clearok (curscr, TRUE);
1ce3e844 513 tui_refresh_all ();
bc712bbf 514}
c906108c 515
6cdb25f4
EZ
516void
517tui_rehighlight_all (void)
518{
1ce3e844 519 for (tui_win_info *win_info : all_tui_windows ())
b4ef5aeb 520 win_info->check_and_display_highlight_if_needed ();
6cdb25f4 521}
c906108c 522
b021a221 523/* Resize all the windows based on the terminal size. This function
ae2b5380 524 gets called from within the readline SIGWINCH handler. */
c906108c 525void
6ba8e26f 526tui_resize_all (void)
c906108c 527{
6ba8e26f 528 int height_diff, width_diff;
9255ee31 529 int screenheight, screenwidth;
c906108c 530
9255ee31 531 rl_get_screen_size (&screenheight, &screenwidth);
6ba8e26f
AC
532 width_diff = screenwidth - tui_term_width ();
533 height_diff = screenheight - tui_term_height ();
534 if (height_diff || width_diff)
c906108c 535 {
5b6fe301 536 struct tui_win_info *win_with_focus = tui_win_with_focus ();
c906108c 537
10f59415
SC
538#ifdef HAVE_RESIZE_TERM
539 resize_term (screenheight, screenwidth);
540#endif
1cc6d956 541 /* Turn keypad off while we resize. */
6ba8e26f 542 if (win_with_focus != TUI_CMD_WIN)
7523da63 543 keypad (TUI_CMD_WIN->handle.get (), FALSE);
3e752b04 544 tui_update_gdb_sizes ();
dd1abb8c
AC
545 tui_set_term_height_to (screenheight);
546 tui_set_term_width_to (screenwidth);
3d979945 547
c366c1f0
TT
548 /* erase + clearok are used instead of a straightforward clear as
549 AIX 5.3 does not define clear. */
550 erase ();
551 clearok (curscr, TRUE);
3d979945 552 tui_apply_current_layout ();
fede5273 553 tui_delete_invisible_windows ();
1cc6d956
MS
554 /* Turn keypad back on, unless focus is in the command
555 window. */
6ba8e26f 556 if (win_with_focus != TUI_CMD_WIN)
7523da63 557 keypad (TUI_CMD_WIN->handle.get (), TRUE);
c906108c 558 }
6ba8e26f 559}
c906108c 560
2c0b251b 561#ifdef SIGWINCH
c4ef48c6
PP
562/* Token for use by TUI's asynchronous SIGWINCH handler. */
563static struct async_signal_handler *tui_sigwinch_token;
564
565/* TUI's SIGWINCH signal handler. */
2c0b251b 566static void
6ba8e26f 567tui_sigwinch_handler (int signal)
c906108c 568{
c4ef48c6 569 mark_async_signal_handler (tui_sigwinch_token);
9abd8a65 570 tui_set_win_resized_to (true);
6ba8e26f 571}
c4ef48c6
PP
572
573/* Callback for asynchronously resizing TUI following a SIGWINCH signal. */
574static void
575tui_async_resize_screen (gdb_client_data arg)
576{
a88d0bb3
PP
577 rl_resize_terminal ();
578
c4ef48c6 579 if (!tui_active)
a88d0bb3
PP
580 {
581 int screen_height, screen_width;
c4ef48c6 582
a88d0bb3
PP
583 rl_get_screen_size (&screen_height, &screen_width);
584 set_screen_width_and_height (screen_width, screen_height);
585
586 /* win_resized is left set so that the next call to tui_enable()
587 resizes the TUI windows. */
588 }
589 else
590 {
9abd8a65 591 tui_set_win_resized_to (false);
a88d0bb3
PP
592 tui_resize_all ();
593 tui_refresh_all_win ();
594 tui_update_gdb_sizes ();
45e42163
TT
595 if (resize_message)
596 {
597 static int count;
598 printf_unfiltered ("@@ resize done %d, size = %dx%d\n", count,
599 tui_term_width (), tui_term_height ());
600 ++count;
601 }
a88d0bb3
PP
602 tui_redisplay_readline ();
603 }
c4ef48c6 604}
2c0b251b 605#endif
c906108c 606
c4ef48c6
PP
607/* Initialize TUI's SIGWINCH signal handler. Note that the handler is not
608 uninstalled when we exit TUI, so the handler should not assume that TUI is
609 always active. */
9612b5ec
UW
610void
611tui_initialize_win (void)
612{
613#ifdef SIGWINCH
c4ef48c6
PP
614 tui_sigwinch_token
615 = create_async_signal_handler (tui_async_resize_screen, NULL);
616
617 {
9612b5ec 618#ifdef HAVE_SIGACTION
c4ef48c6 619 struct sigaction old_winch;
1c5313c5 620
c4ef48c6
PP
621 memset (&old_winch, 0, sizeof (old_winch));
622 old_winch.sa_handler = &tui_sigwinch_handler;
a344fc09 623#ifdef SA_RESTART
c4ef48c6 624 old_winch.sa_flags = SA_RESTART;
a344fc09 625#endif
c4ef48c6 626 sigaction (SIGWINCH, &old_winch, NULL);
9612b5ec 627#else
c4ef48c6 628 signal (SIGWINCH, &tui_sigwinch_handler);
9612b5ec 629#endif
c4ef48c6 630 }
9612b5ec
UW
631#endif
632}
c906108c
SS
633
634
c906108c 635static void
0b39b52e 636tui_scroll_forward_command (const char *arg, int from_tty)
c906108c 637{
6ba8e26f 638 int num_to_scroll = 1;
5b6fe301 639 struct tui_win_info *win_to_scroll;
c906108c 640
1854bb21
SC
641 /* Make sure the curses mode is enabled. */
642 tui_enable ();
63a33118 643 if (arg == NULL)
cafb3438 644 parse_scrolling_args (arg, &win_to_scroll, NULL);
c906108c 645 else
6ba8e26f 646 parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);
13446e05 647 win_to_scroll->forward_scroll (num_to_scroll);
e8b915dc 648}
c906108c
SS
649
650
c906108c 651static void
0b39b52e 652tui_scroll_backward_command (const char *arg, int from_tty)
c906108c 653{
6ba8e26f 654 int num_to_scroll = 1;
5b6fe301 655 struct tui_win_info *win_to_scroll;
c906108c 656
1854bb21
SC
657 /* Make sure the curses mode is enabled. */
658 tui_enable ();
63a33118 659 if (arg == NULL)
cafb3438 660 parse_scrolling_args (arg, &win_to_scroll, NULL);
c906108c 661 else
6ba8e26f 662 parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);
13446e05 663 win_to_scroll->backward_scroll (num_to_scroll);
e8b915dc 664}
c906108c
SS
665
666
c906108c 667static void
0b39b52e 668tui_scroll_left_command (const char *arg, int from_tty)
c906108c 669{
6ba8e26f 670 int num_to_scroll;
5b6fe301 671 struct tui_win_info *win_to_scroll;
c906108c 672
1854bb21
SC
673 /* Make sure the curses mode is enabled. */
674 tui_enable ();
6ba8e26f 675 parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);
13446e05 676 win_to_scroll->left_scroll (num_to_scroll);
e8b915dc 677}
c906108c
SS
678
679
c906108c 680static void
0b39b52e 681tui_scroll_right_command (const char *arg, int from_tty)
c906108c 682{
6ba8e26f 683 int num_to_scroll;
5b6fe301 684 struct tui_win_info *win_to_scroll;
c906108c 685
1854bb21
SC
686 /* Make sure the curses mode is enabled. */
687 tui_enable ();
6ba8e26f 688 parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);
13446e05 689 win_to_scroll->right_scroll (num_to_scroll);
e8b915dc 690}
c906108c
SS
691
692
9f6ad286
TT
693/* Answer the window represented by name. */
694static struct tui_win_info *
695tui_partial_win_by_name (gdb::string_view name)
696{
e098d18c
TT
697 struct tui_win_info *best = nullptr;
698
9f6ad286
TT
699 if (name != NULL)
700 {
701 for (tui_win_info *item : all_tui_windows ())
702 {
703 const char *cur_name = item->name ();
704
e098d18c 705 if (name == cur_name)
9f6ad286 706 return item;
e098d18c
TT
707 if (startswith (cur_name, name))
708 {
709 if (best != nullptr)
710 error (_("Window name \"%*s\" is ambiguous"),
711 (int) name.size (), name.data ());
712 best = item;
713 }
9f6ad286
TT
714 }
715 }
716
e098d18c 717 return best;
9f6ad286
TT
718}
719
6ba8e26f 720/* Set focus to the window named by 'arg'. */
c906108c 721static void
01aeb396 722tui_set_focus_command (const char *arg, int from_tty)
c906108c 723{
01aeb396
TT
724 tui_enable ();
725
63a33118 726 if (arg != NULL)
c906108c 727 {
e65b5245 728 struct tui_win_info *win_info = NULL;
c906108c 729
78e8cb91 730 if (subset_compare (arg, "next"))
6d012f14 731 win_info = tui_next_win (tui_win_with_focus ());
78e8cb91 732 else if (subset_compare (arg, "prev"))
6d012f14 733 win_info = tui_prev_win (tui_win_with_focus ());
c906108c 734 else
78e8cb91 735 win_info = tui_partial_win_by_name (arg);
c906108c 736
78e8cb91
TT
737 if (win_info == NULL)
738 error (_("Unrecognized window name \"%s\""), arg);
739 if (!win_info->is_visible ())
740 error (_("Window \"%s\" is not visible"), arg);
c906108c 741
78e8cb91 742 tui_set_win_focus_to (win_info);
7523da63 743 keypad (TUI_CMD_WIN->handle.get (), win_info != TUI_CMD_WIN);
a3f17187 744 printf_filtered (_("Focus set to %s window.\n"),
152f3f4b 745 tui_win_with_focus ()->name ());
c906108c
SS
746 }
747 else
78e8cb91 748 error (_("Incorrect Number of Arguments.\n%s"), FOCUS_USAGE);
6ba8e26f 749}
c906108c 750
c906108c 751static void
1d12d88f 752tui_all_windows_info (const char *arg, int from_tty)
c906108c 753{
82e3b564
TT
754 if (!tui_active)
755 {
756 printf_filtered (_("The TUI is not active.\n"));
757 return;
758 }
759
5b6fe301 760 struct tui_win_info *win_with_focus = tui_win_with_focus ();
25a2915e
TT
761 struct ui_out *uiout = current_uiout;
762
763 ui_out_emit_table table_emitter (uiout, 3, -1, "tui-windows");
764 uiout->table_header (10, ui_left, "name", "Name");
765 uiout->table_header (5, ui_right, "lines", "Lines");
766 uiout->table_header (10, ui_left, "focus", "Focus");
767 uiout->table_body ();
c906108c 768
1ce3e844 769 for (tui_win_info *win_info : all_tui_windows ())
2d83e710 770 if (win_info->is_visible ())
c906108c 771 {
25a2915e
TT
772 ui_out_emit_tuple tuple_emitter (uiout, nullptr);
773
774 uiout->field_string ("name", win_info->name ());
775 uiout->field_signed ("lines", win_info->height);
1ce3e844 776 if (win_with_focus == win_info)
25a2915e 777 uiout->field_string ("focus", _("(has focus)"));
c906108c 778 else
25a2915e
TT
779 uiout->field_skip ("focus");
780 uiout->text ("\n");
c906108c 781 }
6ba8e26f 782}
c906108c
SS
783
784
c906108c 785static void
0b39b52e 786tui_refresh_all_command (const char *arg, int from_tty)
c906108c 787{
1854bb21
SC
788 /* Make sure the curses mode is enabled. */
789 tui_enable ();
790
a21fcd8f 791 tui_refresh_all_win ();
c906108c
SS
792}
793
7806cea7
TT
794/* The tab width that should be used by the TUI. */
795
796unsigned int tui_tab_width = DEFAULT_TAB_LEN;
797
798/* The tab width as set by the user. */
799
800static unsigned int internal_tab_width = DEFAULT_TAB_LEN;
801
d83f1fe6
TT
802/* After the tab width is set, call this to update the relevant
803 windows. */
804
805static void
806update_tab_width ()
807{
1ce3e844 808 for (tui_win_info *win_info : all_tui_windows ())
7806cea7 809 {
2d83e710 810 if (win_info->is_visible ())
1ce3e844 811 win_info->update_tab_width ();
7806cea7
TT
812 }
813}
814
815/* Callback for "set tui tab-width". */
816
817static void
818tui_set_tab_width (const char *ignore,
819 int from_tty, struct cmd_list_element *c)
820{
821 if (internal_tab_width == 0)
822 {
823 internal_tab_width = tui_tab_width;
824 error (_("Tab width must not be 0"));
825 }
826
827 tui_tab_width = internal_tab_width;
828 update_tab_width ();
829}
830
831/* Callback for "show tui tab-width". */
832
833static void
834tui_show_tab_width (struct ui_file *file, int from_tty,
835 struct cmd_list_element *c, const char *value)
836{
837 fprintf_filtered (gdb_stdout, _("TUI tab width is %s spaces.\n"), value);
838
839}
c906108c 840
d1da6b01
TT
841/* See tui-win.h. */
842
843bool compact_source = false;
844
845/* Callback for "set tui compact-source". */
846
847static void
848tui_set_compact_source (const char *ignore, int from_tty,
849 struct cmd_list_element *c)
850{
851 if (TUI_SRC_WIN != nullptr)
852 TUI_SRC_WIN->refill ();
853}
854
855/* Callback for "show tui compact-source". */
856
857static void
858tui_show_compact_source (struct ui_file *file, int from_tty,
859 struct cmd_list_element *c, const char *value)
860{
861 printf_filtered (_("TUI source window compactness is %s.\n"), value);
862}
863
c54da50d 864/* Set the tab width of the specified window. */
c906108c 865static void
0b39b52e 866tui_set_tab_width_command (const char *arg, int from_tty)
c906108c 867{
1854bb21
SC
868 /* Make sure the curses mode is enabled. */
869 tui_enable ();
63a33118 870 if (arg != NULL)
c906108c
SS
871 {
872 int ts;
873
874 ts = atoi (arg);
7806cea7
TT
875 if (ts <= 0)
876 warning (_("Tab widths greater than 0 must be specified."));
877 else
cb86fcc1 878 {
7806cea7
TT
879 internal_tab_width = ts;
880 tui_tab_width = ts;
881
882 update_tab_width ();
cb86fcc1 883 }
c906108c 884 }
6ba8e26f 885}
c906108c
SS
886
887
1cc6d956 888/* Set the height of the specified window. */
c906108c 889static void
4dde7b34 890tui_set_win_height_command (const char *arg, int from_tty)
c906108c 891{
1854bb21
SC
892 /* Make sure the curses mode is enabled. */
893 tui_enable ();
63a33118 894 if (arg != NULL)
c906108c 895 {
9f6ad286
TT
896 const char *buf = arg;
897 const char *buf_ptr = buf;
78e8cb91 898 int new_height;
5b6fe301 899 struct tui_win_info *win_info;
c906108c 900
6ba8e26f 901 buf_ptr = strchr (buf_ptr, ' ');
63a33118 902 if (buf_ptr != NULL)
c906108c 903 {
ef5eab5a 904 /* Validate the window name. */
9f6ad286 905 gdb::string_view wname (buf, buf_ptr - buf);
6d012f14 906 win_info = tui_partial_win_by_name (wname);
c906108c 907
78e8cb91
TT
908 if (win_info == NULL)
909 error (_("Unrecognized window name \"%s\""), arg);
910 if (!win_info->is_visible ())
911 error (_("Window \"%s\" is not visible"), arg);
912
913 /* Process the size. */
914 buf_ptr = skip_spaces (buf_ptr);
915
916 if (*buf_ptr != '\0')
c906108c 917 {
78e8cb91
TT
918 bool negate = false;
919 bool fixed_size = true;
920 int input_no;;
c906108c 921
78e8cb91 922 if (*buf_ptr == '+' || *buf_ptr == '-')
c906108c 923 {
78e8cb91
TT
924 if (*buf_ptr == '-')
925 negate = true;
926 fixed_size = false;
927 buf_ptr++;
928 }
929 input_no = atoi (buf_ptr);
930 if (input_no > 0)
931 {
932 if (negate)
933 input_no *= (-1);
934 if (fixed_size)
935 new_height = input_no;
c906108c 936 else
78e8cb91
TT
937 new_height = win_info->height + input_no;
938
939 /* Now change the window's height, and adjust
940 all other windows around it. */
d4eeccfe
TT
941 tui_adjust_window_height (win_info, new_height);
942 tui_update_gdb_sizes ();
c906108c 943 }
78e8cb91
TT
944 else
945 warning (_("Invalid window height specified.\n%s"),
946 WIN_HEIGHT_USAGE);
c906108c
SS
947 }
948 }
949 else
950 printf_filtered (WIN_HEIGHT_USAGE);
c906108c
SS
951 }
952 else
953 printf_filtered (WIN_HEIGHT_USAGE);
6ba8e26f 954}
c906108c 955
5fcee43a 956/* See tui-data.h. */
c906108c 957
8903bd8a
TT
958int
959tui_win_info::max_height () const
960{
961 return tui_term_height () - 2;
962}
963
7c043ba6
TT
964/* See tui-data.h. */
965
966int
967tui_gen_win_info::max_width () const
968{
969 return tui_term_width () - 2;
970}
971
c906108c 972static void
0b39b52e 973parse_scrolling_args (const char *arg,
08ef48c5 974 struct tui_win_info **win_to_scroll,
6ba8e26f 975 int *num_to_scroll)
c906108c 976{
6ba8e26f
AC
977 if (num_to_scroll)
978 *num_to_scroll = 0;
979 *win_to_scroll = tui_win_with_focus ();
c906108c 980
ef5eab5a
MS
981 /* First set up the default window to scroll, in case there is no
982 window name arg. */
63a33118 983 if (arg != NULL)
c906108c 984 {
f71c8822 985 char *buf_ptr;
c906108c 986
1cc6d956 987 /* Process the number of lines to scroll. */
f71c8822
TT
988 std::string copy = arg;
989 buf_ptr = &copy[0];
6ba8e26f 990 if (isdigit (*buf_ptr))
c906108c 991 {
6ba8e26f 992 char *num_str;
c906108c 993
6ba8e26f
AC
994 num_str = buf_ptr;
995 buf_ptr = strchr (buf_ptr, ' ');
63a33118 996 if (buf_ptr != NULL)
c906108c 997 {
78e8cb91 998 *buf_ptr = '\0';
6ba8e26f
AC
999 if (num_to_scroll)
1000 *num_to_scroll = atoi (num_str);
1001 buf_ptr++;
c906108c 1002 }
6ba8e26f
AC
1003 else if (num_to_scroll)
1004 *num_to_scroll = atoi (num_str);
c906108c
SS
1005 }
1006
1cc6d956 1007 /* Process the window name if one is specified. */
63a33118 1008 if (buf_ptr != NULL)
c906108c 1009 {
a121b7c1 1010 const char *wname;
c906108c 1011
78e8cb91 1012 wname = skip_spaces (buf_ptr);
c906108c 1013
78e8cb91 1014 if (*wname != '\0')
c709a7c2 1015 {
78e8cb91
TT
1016 *win_to_scroll = tui_partial_win_by_name (wname);
1017
1018 if (*win_to_scroll == NULL)
1019 error (_("Unrecognized window `%s'"), wname);
1020 if (!(*win_to_scroll)->is_visible ())
1021 error (_("Window is not visible"));
1022 else if (*win_to_scroll == TUI_CMD_WIN)
1023 *win_to_scroll = *(tui_source_windows ().begin ());
c709a7c2 1024 }
c906108c 1025 }
c906108c 1026 }
6ba8e26f 1027}
7806cea7
TT
1028
1029/* Function to initialize gdb commands, for tui window
1030 manipulation. */
1031
6c265988 1032void _initialize_tui_win ();
7806cea7 1033void
6c265988 1034_initialize_tui_win ()
7806cea7
TT
1035{
1036 static struct cmd_list_element *tui_setlist;
1037 static struct cmd_list_element *tui_showlist;
1038 struct cmd_list_element *cmd;
1039
1040 /* Define the classes of commands.
1041 They will appear in the help list in the reverse of this order. */
1042 add_prefix_cmd ("tui", class_tui, set_tui_cmd,
590042fc 1043 _("TUI configuration variables."),
7806cea7
TT
1044 &tui_setlist, "set tui ",
1045 0 /* allow-unknown */, &setlist);
1046 add_prefix_cmd ("tui", class_tui, show_tui_cmd,
590042fc 1047 _("TUI configuration variables."),
7806cea7
TT
1048 &tui_showlist, "show tui ",
1049 0 /* allow-unknown */, &showlist);
1050
1051 add_com ("refresh", class_tui, tui_refresh_all_command,
89549d7f 1052 _("Refresh the terminal display."));
7806cea7
TT
1053
1054 cmd = add_com ("tabset", class_tui, tui_set_tab_width_command, _("\
1055Set the width (in characters) of tab stops.\n\
89549d7f 1056Usage: tabset N"));
7806cea7
TT
1057 deprecate_cmd (cmd, "set tui tab-width");
1058
1059 cmd = add_com ("winheight", class_tui, tui_set_win_height_command, _("\
1060Set or modify the height of a specified window.\n"
1061WIN_HEIGHT_USAGE
1062"Window names are:\n\
89549d7f
TT
1063 src : the source window\n\
1064 cmd : the command window\n\
1065 asm : the disassembly window\n\
1066 regs : the register display"));
7806cea7
TT
1067 add_com_alias ("wh", "winheight", class_tui, 0);
1068 set_cmd_completer (cmd, winheight_completer);
1069 add_info ("win", tui_all_windows_info,
89549d7f 1070 _("List of all displayed windows."));
7806cea7
TT
1071 cmd = add_com ("focus", class_tui, tui_set_focus_command, _("\
1072Set focus to named window or next/prev window.\n"
1073FOCUS_USAGE
1074"Valid Window names are:\n\
89549d7f
TT
1075 src : the source window\n\
1076 asm : the disassembly window\n\
1077 regs : the register display\n\
1078 cmd : the command window"));
7806cea7
TT
1079 add_com_alias ("fs", "focus", class_tui, 0);
1080 set_cmd_completer (cmd, focus_completer);
1081 add_com ("+", class_tui, tui_scroll_forward_command, _("\
1082Scroll window forward.\n\
7a27a45b
AB
1083Usage: + [N] [WIN]\n\
1084Scroll window WIN N lines forwards. Both WIN and N are optional, N\n\
1085defaults to 1, and WIN defaults to the currently focused window."));
7806cea7
TT
1086 add_com ("-", class_tui, tui_scroll_backward_command, _("\
1087Scroll window backward.\n\
7a27a45b
AB
1088Usage: - [N] [WIN]\n\
1089Scroll window WIN N lines backwards. Both WIN and N are optional, N\n\
1090defaults to 1, and WIN defaults to the currently focused window."));
7806cea7
TT
1091 add_com ("<", class_tui, tui_scroll_left_command, _("\
1092Scroll window text to the left.\n\
7a27a45b
AB
1093Usage: < [N] [WIN]\n\
1094Scroll window WIN N characters left. Both WIN and N are optional, N\n\
1095defaults to 1, and WIN defaults to the currently focused window."));
7806cea7
TT
1096 add_com (">", class_tui, tui_scroll_right_command, _("\
1097Scroll window text to the right.\n\
7a27a45b
AB
1098Usage: > [N] [WIN]\n\
1099Scroll window WIN N characters right. Both WIN and N are optional, N\n\
1100defaults to 1, and WIN defaults to the currently focused window."));
7806cea7
TT
1101
1102 /* Define the tui control variables. */
1103 add_setshow_enum_cmd ("border-kind", no_class, tui_border_kind_enums,
1104 &tui_border_kind, _("\
1105Set the kind of border for TUI windows."), _("\
1106Show the kind of border for TUI windows."), _("\
1107This variable controls the border of TUI windows:\n\
89549d7f
TT
1108 space use a white space\n\
1109 ascii use ascii characters + - | for the border\n\
1110 acs use the Alternate Character Set"),
7806cea7
TT
1111 tui_set_var_cmd,
1112 show_tui_border_kind,
1113 &tui_setlist, &tui_showlist);
1114
1115 add_setshow_enum_cmd ("border-mode", no_class, tui_border_mode_enums,
1116 &tui_border_mode, _("\
1117Set the attribute mode to use for the TUI window borders."), _("\
1118Show the attribute mode to use for the TUI window borders."), _("\
1119This variable controls the attributes to use for the window borders:\n\
89549d7f
TT
1120 normal normal display\n\
1121 standout use highlight mode of terminal\n\
1122 reverse use reverse video mode\n\
1123 half use half bright\n\
1124 half-standout use half bright and standout mode\n\
1125 bold use extra bright or bold\n\
1126 bold-standout use extra bright or bold with standout mode"),
7806cea7
TT
1127 tui_set_var_cmd,
1128 show_tui_border_mode,
1129 &tui_setlist, &tui_showlist);
1130
1131 add_setshow_enum_cmd ("active-border-mode", no_class, tui_border_mode_enums,
1132 &tui_active_border_mode, _("\
1133Set the attribute mode to use for the active TUI window border."), _("\
1134Show the attribute mode to use for the active TUI window border."), _("\
1135This variable controls the attributes to use for the active window border:\n\
89549d7f
TT
1136 normal normal display\n\
1137 standout use highlight mode of terminal\n\
1138 reverse use reverse video mode\n\
1139 half use half bright\n\
1140 half-standout use half bright and standout mode\n\
1141 bold use extra bright or bold\n\
1142 bold-standout use extra bright or bold with standout mode"),
7806cea7
TT
1143 tui_set_var_cmd,
1144 show_tui_active_border_mode,
1145 &tui_setlist, &tui_showlist);
1146
1147 add_setshow_zuinteger_cmd ("tab-width", no_class,
1148 &internal_tab_width, _("\
1149Set the tab width, in characters, for the TUI."), _("\
590042fc 1150Show the tab witdh, in characters, for the TUI."), _("\
7806cea7
TT
1151This variable controls how many spaces are used to display a tab character."),
1152 tui_set_tab_width, tui_show_tab_width,
1153 &tui_setlist, &tui_showlist);
45e42163
TT
1154
1155 add_setshow_boolean_cmd ("tui-resize-message", class_maintenance,
1156 &resize_message, _("\
1157Set TUI resize messaging."), _("\
1158Show TUI resize messaging."), _("\
1159When enabled GDB will print a message when the terminal is resized."),
1160 nullptr,
1161 show_tui_resize_message,
1162 &maintenance_set_cmdlist,
1163 &maintenance_show_cmdlist);
d1da6b01
TT
1164
1165 add_setshow_boolean_cmd ("compact-source", class_tui,
1166 &compact_source, _("\
1167Set whether the TUI source window is compact."), _("\
1168Show whether the TUI source window is compact."), _("\
1169This variable controls whether the TUI source window is shown\n\
1170in a compact form. The compact form puts the source closer to\n\
1171the line numbers and uses less horizontal space."),
1172 tui_set_compact_source, tui_show_compact_source,
1173 &tui_setlist, &tui_showlist);
a2a7af0c
TT
1174
1175 tui_border_style.changed.attach (tui_rehighlight_all);
1176 tui_active_border_style.changed.attach (tui_rehighlight_all);
7806cea7 1177}
This page took 2.207335 seconds and 4 git commands to generate.