Fix an error in parse_scrolling_args
[deliverable/binutils-gdb.git] / gdb / tui / tui-win.c
CommitLineData
f377b406 1/* TUI window generic functions.
f33c6cbf 2
42a4f53d 3 Copyright (C) 1998-2019 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"
3e752b04 33#include "top.h"
52575520 34#include "source.h"
c4ef48c6 35#include "event-loop.h"
c906108c 36
d7b2e967 37#include "tui/tui.h"
c4ef48c6 38#include "tui/tui-io.h"
ce38393b 39#include "tui/tui-command.h"
d7b2e967
AC
40#include "tui/tui-data.h"
41#include "tui/tui-wingeneral.h"
42#include "tui/tui-stack.h"
43#include "tui/tui-regs.h"
44#include "tui/tui-disasm.h"
45#include "tui/tui-source.h"
46#include "tui/tui-winsource.h"
2c0b251b 47#include "tui/tui-win.h"
c906108c 48
6a83354a 49#include "gdb_curses.h"
96ec9981 50#include <ctype.h>
dbda9972 51#include "readline/readline.h"
96ec9981 52
9612b5ec
UW
53#include <signal.h>
54
c906108c
SS
55/*******************************
56** Static Local Decls
57********************************/
08ef48c5
MS
58static enum tui_status tui_adjust_win_heights (struct tui_win_info *,
59 int);
6ba8e26f 60static int new_height_ok (struct tui_win_info *, int);
0b39b52e
TT
61static void tui_set_tab_width_command (const char *, int);
62static void tui_refresh_all_command (const char *, int);
1d12d88f 63static void tui_all_windows_info (const char *, int);
0b39b52e
TT
64static void tui_scroll_forward_command (const char *, int);
65static void tui_scroll_backward_command (const char *, int);
66static void tui_scroll_left_command (const char *, int);
67static void tui_scroll_right_command (const char *, int);
68static void parse_scrolling_args (const char *,
08ef48c5
MS
69 struct tui_win_info **,
70 int *);
c906108c
SS
71
72
73/***************************************
74** DEFINITIONS
75***************************************/
57dbb3af 76#define WIN_HEIGHT_USAGE "Usage: winheight WINDOW-NAME [+ | -] NUM-LINES\n"
bf212be1 77#define FOCUS_USAGE "Usage: focus [WINDOW-NAME | next | prev]\n"
c906108c
SS
78
79/***************************************
80** PUBLIC FUNCTIONS
81***************************************/
82
17aae570
SC
83#ifndef ACS_LRCORNER
84# define ACS_LRCORNER '+'
85#endif
86#ifndef ACS_LLCORNER
87# define ACS_LLCORNER '+'
88#endif
89#ifndef ACS_ULCORNER
90# define ACS_ULCORNER '+'
91#endif
92#ifndef ACS_URCORNER
93# define ACS_URCORNER '+'
94#endif
95#ifndef ACS_HLINE
96# define ACS_HLINE '-'
97#endif
98#ifndef ACS_VLINE
99# define ACS_VLINE '|'
100#endif
101
af101512 102/* Possible values for tui-border-kind variable. */
40478521 103static const char *const tui_border_kind_enums[] = {
af101512
SC
104 "space",
105 "ascii",
106 "acs",
107 NULL
108};
109
110/* Possible values for tui-border-mode and tui-active-border-mode. */
40478521 111static const char *const tui_border_mode_enums[] = {
af101512
SC
112 "normal",
113 "standout",
114 "reverse",
115 "half",
116 "half-standout",
117 "bold",
118 "bold-standout",
119 NULL
120};
121
122struct tui_translate
123{
124 const char *name;
125 int value;
126};
127
128/* Translation table for border-mode variables.
129 The list of values must be terminated by a NULL.
130 After the NULL value, an entry defines the default. */
131struct tui_translate tui_border_mode_translate[] = {
132 { "normal", A_NORMAL },
133 { "standout", A_STANDOUT },
134 { "reverse", A_REVERSE },
135 { "half", A_DIM },
136 { "half-standout", A_DIM | A_STANDOUT },
137 { "bold", A_BOLD },
138 { "bold-standout", A_BOLD | A_STANDOUT },
139 { 0, 0 },
140 { "normal", A_NORMAL }
141};
142
143/* Translation tables for border-kind, one for each border
144 character (see wborder, border curses operations).
145 -1 is used to indicate the ACS because ACS characters
146 are determined at run time by curses (depends on terminal). */
147struct tui_translate tui_border_kind_translate_vline[] = {
148 { "space", ' ' },
149 { "ascii", '|' },
150 { "acs", -1 },
151 { 0, 0 },
152 { "ascii", '|' }
153};
154
155struct tui_translate tui_border_kind_translate_hline[] = {
156 { "space", ' ' },
157 { "ascii", '-' },
158 { "acs", -1 },
159 { 0, 0 },
160 { "ascii", '-' }
161};
162
163struct tui_translate tui_border_kind_translate_ulcorner[] = {
164 { "space", ' ' },
165 { "ascii", '+' },
166 { "acs", -1 },
167 { 0, 0 },
168 { "ascii", '+' }
169};
170
171struct tui_translate tui_border_kind_translate_urcorner[] = {
172 { "space", ' ' },
173 { "ascii", '+' },
174 { "acs", -1 },
175 { 0, 0 },
176 { "ascii", '+' }
177};
178
179struct tui_translate tui_border_kind_translate_llcorner[] = {
180 { "space", ' ' },
181 { "ascii", '+' },
182 { "acs", -1 },
183 { 0, 0 },
184 { "ascii", '+' }
185};
186
187struct tui_translate tui_border_kind_translate_lrcorner[] = {
188 { "space", ' ' },
189 { "ascii", '+' },
190 { "acs", -1 },
191 { 0, 0 },
192 { "ascii", '+' }
193};
194
195
196/* Tui configuration variables controlled with set/show command. */
197const char *tui_active_border_mode = "bold-standout";
920d2a44 198static void
08ef48c5
MS
199show_tui_active_border_mode (struct ui_file *file,
200 int from_tty,
201 struct cmd_list_element *c,
202 const char *value)
920d2a44
AC
203{
204 fprintf_filtered (file, _("\
205The attribute mode to use for the active TUI window border is \"%s\".\n"),
206 value);
207}
208
af101512 209const char *tui_border_mode = "normal";
920d2a44 210static void
08ef48c5
MS
211show_tui_border_mode (struct ui_file *file,
212 int from_tty,
213 struct cmd_list_element *c,
214 const char *value)
920d2a44
AC
215{
216 fprintf_filtered (file, _("\
217The attribute mode to use for the TUI window borders is \"%s\".\n"),
218 value);
219}
220
af101512 221const char *tui_border_kind = "acs";
920d2a44 222static void
08ef48c5
MS
223show_tui_border_kind (struct ui_file *file,
224 int from_tty,
225 struct cmd_list_element *c,
226 const char *value)
920d2a44
AC
227{
228 fprintf_filtered (file, _("The kind of border for TUI windows is \"%s\".\n"),
229 value);
230}
231
af101512 232
1cc6d956
MS
233/* Tui internal configuration variables. These variables are updated
234 by tui_update_variables to reflect the tui configuration
af101512
SC
235 variables. */
236chtype tui_border_vline;
237chtype tui_border_hline;
238chtype tui_border_ulcorner;
239chtype tui_border_urcorner;
240chtype tui_border_llcorner;
241chtype tui_border_lrcorner;
242
243int tui_border_attrs;
244int tui_active_border_attrs;
245
246/* Identify the item in the translation table.
247 When the item is not recognized, use the default entry. */
248static struct tui_translate *
249translate (const char *name, struct tui_translate *table)
250{
251 while (table->name)
252 {
253 if (name && strcmp (table->name, name) == 0)
254 return table;
255 table++;
256 }
257
258 /* Not found, return default entry. */
259 table++;
260 return table;
261}
262
263/* Update the tui internal configuration according to gdb settings.
264 Returns 1 if the configuration has changed and the screen should
265 be redrawn. */
266int
d02c80cd 267tui_update_variables (void)
af101512
SC
268{
269 int need_redraw = 0;
270 struct tui_translate *entry;
271
272 entry = translate (tui_border_mode, tui_border_mode_translate);
273 if (tui_border_attrs != entry->value)
274 {
275 tui_border_attrs = entry->value;
276 need_redraw = 1;
277 }
278 entry = translate (tui_active_border_mode, tui_border_mode_translate);
279 if (tui_active_border_attrs != entry->value)
280 {
281 tui_active_border_attrs = entry->value;
282 need_redraw = 1;
283 }
284
285 /* If one corner changes, all characters are changed.
286 Only check the first one. The ACS characters are determined at
287 run time by curses terminal management. */
288 entry = translate (tui_border_kind, tui_border_kind_translate_lrcorner);
289 if (tui_border_lrcorner != (chtype) entry->value)
290 {
291 tui_border_lrcorner = (entry->value < 0) ? ACS_LRCORNER : entry->value;
292 need_redraw = 1;
293 }
294 entry = translate (tui_border_kind, tui_border_kind_translate_llcorner);
295 tui_border_llcorner = (entry->value < 0) ? ACS_LLCORNER : entry->value;
296
297 entry = translate (tui_border_kind, tui_border_kind_translate_ulcorner);
298 tui_border_ulcorner = (entry->value < 0) ? ACS_ULCORNER : entry->value;
299
300 entry = translate (tui_border_kind, tui_border_kind_translate_urcorner);
301 tui_border_urcorner = (entry->value < 0) ? ACS_URCORNER : entry->value;
302
303 entry = translate (tui_border_kind, tui_border_kind_translate_hline);
304 tui_border_hline = (entry->value < 0) ? ACS_HLINE : entry->value;
305
306 entry = translate (tui_border_kind, tui_border_kind_translate_vline);
307 tui_border_vline = (entry->value < 0) ? ACS_VLINE : entry->value;
308
309 return need_redraw;
310}
311
c9684879 312static void
981a3fb3 313set_tui_cmd (const char *args, int from_tty)
c9684879
SC
314{
315}
316
317static void
981a3fb3 318show_tui_cmd (const char *args, int from_tty)
c9684879
SC
319{
320}
af101512 321
10f59415
SC
322static struct cmd_list_element *tuilist;
323
324static void
981a3fb3 325tui_command (const char *args, int from_tty)
10f59415 326{
a3f17187
AC
327 printf_unfiltered (_("\"tui\" must be followed by the name of a "
328 "tui command.\n"));
635c7e8a 329 help_list (tuilist, "tui ", all_commands, gdb_stdout);
10f59415
SC
330}
331
332struct cmd_list_element **
da745b36 333tui_get_cmd_list (void)
10f59415
SC
334{
335 if (tuilist == 0)
336 add_prefix_cmd ("tui", class_tui, tui_command,
1bedd215 337 _("Text User Interface commands."),
10f59415
SC
338 &tuilist, "tui ", 0, &cmdlist);
339 return &tuilist;
340}
341
6cdb25f4
EZ
342/* The set_func hook of "set tui ..." commands that affect the window
343 borders on the TUI display. */
344void
eb4c3f4a
TT
345tui_set_var_cmd (const char *null_args,
346 int from_tty, struct cmd_list_element *c)
6cdb25f4
EZ
347{
348 if (tui_update_variables () && tui_active)
349 tui_rehighlight_all ();
350}
351
97605e61
AB
352/* Generic window name completion function. Complete window name pointed
353 to by TEXT and WORD. If INCLUDE_NEXT_PREV_P is true then the special
354 window names 'next' and 'prev' will also be considered as possible
355 completions of the window name. */
2e52ae68 356
eb3ff9a5
PA
357static void
358window_name_completer (completion_tracker &tracker,
359 int include_next_prev_p,
97605e61 360 const char *text, const char *word)
2e52ae68 361{
625ad440 362 std::vector<const char *> completion_name_vec;
2e52ae68 363
1ce3e844 364 for (tui_win_info *win_info : all_tui_windows ())
2e52ae68
PP
365 {
366 const char *completion_name = NULL;
367
368 /* We can't focus on an invisible window. */
1ce3e844 369 if (!win_info->is_visible)
2e52ae68
PP
370 continue;
371
1ce3e844 372 completion_name = win_info->name ();
150375dc 373 gdb_assert (completion_name != NULL);
625ad440 374 completion_name_vec.push_back (completion_name);
2e52ae68
PP
375 }
376
377 /* If no windows are considered visible then the TUI has not yet been
378 initialized. But still "focus src" and "focus cmd" will work because
379 invoking the focus command will entail initializing the TUI which sets the
380 default layout to SRC_COMMAND. */
625ad440 381 if (completion_name_vec.empty ())
2e52ae68 382 {
625ad440
SM
383 completion_name_vec.push_back (SRC_NAME);
384 completion_name_vec.push_back (CMD_NAME);
2e52ae68
PP
385 }
386
97605e61
AB
387 if (include_next_prev_p)
388 {
625ad440
SM
389 completion_name_vec.push_back ("next");
390 completion_name_vec.push_back ("prev");
97605e61 391 }
2e52ae68 392
2e52ae68 393
625ad440
SM
394 completion_name_vec.push_back (NULL);
395 complete_on_enum (tracker, completion_name_vec.data (), text, word);
2e52ae68
PP
396}
397
97605e61
AB
398/* Complete possible window names to focus on. TEXT is the complete text
399 entered so far, WORD is the word currently being completed. */
400
eb3ff9a5 401static void
97605e61 402focus_completer (struct cmd_list_element *ignore,
eb3ff9a5
PA
403 completion_tracker &tracker,
404 const char *text, const char *word)
97605e61 405{
eb3ff9a5 406 window_name_completer (tracker, 1, text, word);
97605e61
AB
407}
408
409/* Complete possible window names for winheight command. TEXT is the
410 complete text entered so far, WORD is the word currently being
411 completed. */
412
eb3ff9a5 413static void
97605e61 414winheight_completer (struct cmd_list_element *ignore,
eb3ff9a5 415 completion_tracker &tracker,
97605e61
AB
416 const char *text, const char *word)
417{
418 /* The first word is the window name. That we can complete. Subsequent
419 words can't be completed. */
420 if (word != text)
eb3ff9a5 421 return;
97605e61 422
eb3ff9a5 423 window_name_completer (tracker, 0, text, word);
97605e61
AB
424}
425
3e752b04
SC
426/* Update gdb's knowledge of the terminal size. */
427void
d02c80cd 428tui_update_gdb_sizes (void)
3e752b04 429{
d6e5e7f7
PP
430 int width, height;
431
432 if (tui_active)
433 {
cb2ce893
TT
434 width = TUI_CMD_WIN->width;
435 height = TUI_CMD_WIN->height;
d6e5e7f7
PP
436 }
437 else
438 {
439 width = tui_term_width ();
440 height = tui_term_height ();
441 }
442
443 set_screen_width_and_height (width, height);
3e752b04
SC
444}
445
c906108c 446
1cc6d956 447/* Set the logical focus to win_info. */
c906108c 448void
5b6fe301 449tui_set_win_focus_to (struct tui_win_info *win_info)
c906108c 450{
6d012f14 451 if (win_info != NULL)
c906108c 452 {
5b6fe301 453 struct tui_win_info *win_with_focus = tui_win_with_focus ();
c906108c 454
bbc228ee 455 tui_unhighlight_win (win_with_focus);
6d012f14 456 tui_set_win_with_focus (win_info);
bbc228ee 457 tui_highlight_win (win_info);
c906108c 458 }
6ba8e26f 459}
c906108c
SS
460
461
c906108c 462void
13446e05 463tui_win_info::forward_scroll (int num_to_scroll)
c906108c 464{
13446e05 465 if (num_to_scroll == 0)
cb2ce893 466 num_to_scroll = height - 3;
c906108c 467
c3bd716f 468 do_scroll_vertical (num_to_scroll);
a21fcd8f 469}
c906108c 470
c906108c 471void
13446e05 472tui_win_info::backward_scroll (int num_to_scroll)
c906108c 473{
13446e05 474 if (num_to_scroll == 0)
cb2ce893 475 num_to_scroll = height - 3;
13446e05 476
c3bd716f 477 do_scroll_vertical (-num_to_scroll);
a21fcd8f 478}
c906108c
SS
479
480
c906108c 481void
13446e05 482tui_win_info::left_scroll (int num_to_scroll)
c906108c 483{
13446e05
TT
484 if (num_to_scroll == 0)
485 num_to_scroll = 1;
486
c3bd716f 487 do_scroll_horizontal (num_to_scroll);
a21fcd8f 488}
c906108c
SS
489
490
c906108c 491void
13446e05 492tui_win_info::right_scroll (int num_to_scroll)
c906108c 493{
13446e05
TT
494 if (num_to_scroll == 0)
495 num_to_scroll = 1;
496
c3bd716f 497 do_scroll_horizontal (-num_to_scroll);
e8b915dc 498}
c906108c
SS
499
500
c906108c 501void
a21fcd8f 502tui_refresh_all_win (void)
c906108c 503{
3e266828 504 clearok (curscr, TRUE);
1ce3e844
TT
505 tui_refresh_all ();
506 for (tui_win_info *win_info : all_tui_windows ())
c906108c 507 {
1ce3e844
TT
508 if (win_info->is_visible)
509 win_info->refresh_all ();
c906108c 510 }
47d3492a 511 tui_show_locator_content ();
bc712bbf 512}
c906108c 513
6cdb25f4
EZ
514void
515tui_rehighlight_all (void)
516{
1ce3e844
TT
517 for (tui_win_info *win_info : all_tui_windows ())
518 tui_check_and_display_highlight_if_needed (win_info);
6cdb25f4 519}
c906108c 520
b021a221 521/* Resize all the windows based on the terminal size. This function
ae2b5380 522 gets called from within the readline SIGWINCH handler. */
c906108c 523void
6ba8e26f 524tui_resize_all (void)
c906108c 525{
6ba8e26f 526 int height_diff, width_diff;
9255ee31 527 int screenheight, screenwidth;
c906108c 528
9255ee31 529 rl_get_screen_size (&screenheight, &screenwidth);
6ba8e26f
AC
530 width_diff = screenwidth - tui_term_width ();
531 height_diff = screenheight - tui_term_height ();
532 if (height_diff || width_diff)
c906108c 533 {
6ba8e26f 534 enum tui_layout_type cur_layout = tui_current_layout ();
5b6fe301 535 struct tui_win_info *win_with_focus = tui_win_with_focus ();
6ba8e26f
AC
536 struct tui_win_info *first_win;
537 struct tui_win_info *second_win;
7908abbf 538 tui_source_window_base *src_win;
3add462f 539 struct tui_locator_window *locator = tui_locator_win_info_ptr ();
570dc176 540 int win_type;
6ba8e26f 541 int new_height, split_diff, cmd_split_diff, num_wins_displayed = 2;
c906108c 542
10f59415
SC
543#ifdef HAVE_RESIZE_TERM
544 resize_term (screenheight, screenwidth);
545#endif
1cc6d956 546 /* Turn keypad off while we resize. */
6ba8e26f 547 if (win_with_focus != TUI_CMD_WIN)
cb2ce893 548 keypad (TUI_CMD_WIN->handle, FALSE);
3e752b04 549 tui_update_gdb_sizes ();
dd1abb8c
AC
550 tui_set_term_height_to (screenheight);
551 tui_set_term_width_to (screenwidth);
e5908723
MS
552 if (cur_layout == SRC_DISASSEM_COMMAND
553 || cur_layout == SRC_DATA_COMMAND
554 || cur_layout == DISASSEM_DATA_COMMAND)
6ba8e26f
AC
555 num_wins_displayed++;
556 split_diff = height_diff / num_wins_displayed;
557 cmd_split_diff = split_diff;
558 if (height_diff % num_wins_displayed)
c906108c 559 {
6ba8e26f
AC
560 if (height_diff < 0)
561 cmd_split_diff--;
c906108c 562 else
c366c1f0
TT
563 cmd_split_diff++;
564 }
1cc6d956 565 /* Now adjust each window. */
c366c1f0
TT
566 /* erase + clearok are used instead of a straightforward clear as
567 AIX 5.3 does not define clear. */
568 erase ();
569 clearok (curscr, TRUE);
c906108c 570 refresh ();
6ba8e26f 571 switch (cur_layout)
c366c1f0 572 {
c906108c
SS
573 case SRC_COMMAND:
574 case DISASSEM_COMMAND:
7908abbf
TT
575 src_win = tui_source_windows ()[0];
576 first_win = src_win;
cb2ce893 577 first_win->width += width_diff;
6ba8e26f 578 locator->width += width_diff;
1cc6d956 579 /* Check for invalid heights. */
6ba8e26f 580 if (height_diff == 0)
cb2ce893
TT
581 new_height = first_win->height;
582 else if ((first_win->height + split_diff) >=
c906108c 583 (screenheight - MIN_CMD_WIN_HEIGHT - 1))
6ba8e26f 584 new_height = screenheight - MIN_CMD_WIN_HEIGHT - 1;
cb2ce893 585 else if ((first_win->height + split_diff) <= 0)
6ba8e26f 586 new_height = MIN_WIN_HEIGHT;
c906108c 587 else
cb2ce893 588 new_height = first_win->height + split_diff;
c906108c 589
0036e657 590 locator->origin.y = new_height + 1;
daa15dde 591 first_win->make_invisible_and_set_new_height (new_height);
cb2ce893
TT
592 TUI_CMD_WIN->origin.y = locator->origin.y + 1;
593 TUI_CMD_WIN->width += width_diff;
594 new_height = screenheight - TUI_CMD_WIN->origin.y;
daa15dde 595 TUI_CMD_WIN->make_invisible_and_set_new_height (new_height);
5fcee43a
TT
596 first_win->make_visible_with_new_height ();
597 TUI_CMD_WIN->make_visible_with_new_height ();
53e7cdba 598 if (src_win->content.empty ())
caf0bc4e 599 tui_erase_source_content (src_win);
c906108c
SS
600 break;
601 default:
6ba8e26f 602 if (cur_layout == SRC_DISASSEM_COMMAND)
c906108c 603 {
7908abbf
TT
604 src_win = TUI_SRC_WIN;
605 first_win = src_win;
cb2ce893 606 first_win->width += width_diff;
6ba8e26f 607 second_win = TUI_DISASM_WIN;
cb2ce893 608 second_win->width += width_diff;
c906108c
SS
609 }
610 else
611 {
6ba8e26f 612 first_win = TUI_DATA_WIN;
cb2ce893 613 first_win->width += width_diff;
7908abbf
TT
614 src_win = tui_source_windows ()[0];
615 second_win = src_win;
cb2ce893 616 second_win->width += width_diff;
c906108c 617 }
1cc6d956
MS
618 /* Change the first window's height/width. */
619 /* Check for invalid heights. */
6ba8e26f 620 if (height_diff == 0)
cb2ce893
TT
621 new_height = first_win->height;
622 else if ((first_win->height +
623 second_win->height + (split_diff * 2)) >=
c906108c 624 (screenheight - MIN_CMD_WIN_HEIGHT - 1))
6ba8e26f 625 new_height = (screenheight - MIN_CMD_WIN_HEIGHT - 1) / 2;
cb2ce893 626 else if ((first_win->height + split_diff) <= 0)
6ba8e26f 627 new_height = MIN_WIN_HEIGHT;
c906108c 628 else
cb2ce893 629 new_height = first_win->height + split_diff;
daa15dde 630 first_win->make_invisible_and_set_new_height (new_height);
c906108c 631
6ba8e26f 632 locator->width += width_diff;
c906108c 633
1cc6d956
MS
634 /* Change the second window's height/width. */
635 /* Check for invalid heights. */
6ba8e26f 636 if (height_diff == 0)
cb2ce893
TT
637 new_height = second_win->height;
638 else if ((first_win->height +
639 second_win->height + (split_diff * 2)) >=
c906108c
SS
640 (screenheight - MIN_CMD_WIN_HEIGHT - 1))
641 {
6ba8e26f
AC
642 new_height = screenheight - MIN_CMD_WIN_HEIGHT - 1;
643 if (new_height % 2)
644 new_height = (new_height / 2) + 1;
c906108c 645 else
6ba8e26f 646 new_height /= 2;
c906108c 647 }
cb2ce893 648 else if ((second_win->height + split_diff) <= 0)
6ba8e26f 649 new_height = MIN_WIN_HEIGHT;
c906108c 650 else
cb2ce893
TT
651 new_height = second_win->height + split_diff;
652 second_win->origin.y = first_win->height - 1;
daa15dde 653 second_win->make_invisible_and_set_new_height (new_height);
c906108c 654
1cc6d956 655 /* Change the command window's height/width. */
cb2ce893 656 TUI_CMD_WIN->origin.y = locator->origin.y + 1;
daa15dde
TT
657 TUI_CMD_WIN->make_invisible_and_set_new_height (TUI_CMD_WIN->height
658 + cmd_split_diff);
5fcee43a
TT
659 first_win->make_visible_with_new_height ();
660 second_win->make_visible_with_new_height ();
661 TUI_CMD_WIN->make_visible_with_new_height ();
53e7cdba 662 if (src_win->content.empty ())
caf0bc4e 663 tui_erase_source_content (src_win);
c906108c
SS
664 break;
665 }
ef5eab5a
MS
666 /* Now remove all invisible windows, and their content so that
667 they get created again when called for with the new size. */
6ba8e26f 668 for (win_type = SRC_WIN; (win_type < MAX_MAJOR_WINDOWS); win_type++)
c906108c 669 {
e5908723
MS
670 if (win_type != CMD_WIN
671 && (tui_win_list[win_type] != NULL)
cb2ce893 672 && !tui_win_list[win_type]->is_visible)
c906108c 673 {
e7e11af4 674 delete tui_win_list[win_type];
e65b5245 675 tui_win_list[win_type] = NULL;
c906108c
SS
676 }
677 }
1cc6d956
MS
678 /* Turn keypad back on, unless focus is in the command
679 window. */
6ba8e26f 680 if (win_with_focus != TUI_CMD_WIN)
cb2ce893 681 keypad (TUI_CMD_WIN->handle, TRUE);
c906108c 682 }
6ba8e26f 683}
c906108c 684
2c0b251b 685#ifdef SIGWINCH
c4ef48c6
PP
686/* Token for use by TUI's asynchronous SIGWINCH handler. */
687static struct async_signal_handler *tui_sigwinch_token;
688
689/* TUI's SIGWINCH signal handler. */
2c0b251b 690static void
6ba8e26f 691tui_sigwinch_handler (int signal)
c906108c 692{
c4ef48c6 693 mark_async_signal_handler (tui_sigwinch_token);
dd1abb8c 694 tui_set_win_resized_to (TRUE);
6ba8e26f 695}
c4ef48c6
PP
696
697/* Callback for asynchronously resizing TUI following a SIGWINCH signal. */
698static void
699tui_async_resize_screen (gdb_client_data arg)
700{
a88d0bb3
PP
701 rl_resize_terminal ();
702
c4ef48c6 703 if (!tui_active)
a88d0bb3
PP
704 {
705 int screen_height, screen_width;
c4ef48c6 706
a88d0bb3
PP
707 rl_get_screen_size (&screen_height, &screen_width);
708 set_screen_width_and_height (screen_width, screen_height);
709
710 /* win_resized is left set so that the next call to tui_enable()
711 resizes the TUI windows. */
712 }
713 else
714 {
1e04046d 715 tui_set_win_resized_to (FALSE);
a88d0bb3
PP
716 tui_resize_all ();
717 tui_refresh_all_win ();
718 tui_update_gdb_sizes ();
a88d0bb3
PP
719 tui_redisplay_readline ();
720 }
c4ef48c6 721}
2c0b251b 722#endif
c906108c 723
c4ef48c6
PP
724/* Initialize TUI's SIGWINCH signal handler. Note that the handler is not
725 uninstalled when we exit TUI, so the handler should not assume that TUI is
726 always active. */
9612b5ec
UW
727void
728tui_initialize_win (void)
729{
730#ifdef SIGWINCH
c4ef48c6
PP
731 tui_sigwinch_token
732 = create_async_signal_handler (tui_async_resize_screen, NULL);
733
734 {
9612b5ec 735#ifdef HAVE_SIGACTION
c4ef48c6 736 struct sigaction old_winch;
1c5313c5 737
c4ef48c6
PP
738 memset (&old_winch, 0, sizeof (old_winch));
739 old_winch.sa_handler = &tui_sigwinch_handler;
a344fc09 740#ifdef SA_RESTART
c4ef48c6 741 old_winch.sa_flags = SA_RESTART;
a344fc09 742#endif
c4ef48c6 743 sigaction (SIGWINCH, &old_winch, NULL);
9612b5ec 744#else
c4ef48c6 745 signal (SIGWINCH, &tui_sigwinch_handler);
9612b5ec 746#endif
c4ef48c6 747 }
9612b5ec
UW
748#endif
749}
c906108c
SS
750
751
752/*************************
753** STATIC LOCAL FUNCTIONS
754**************************/
755
756
c906108c 757static void
0b39b52e 758tui_scroll_forward_command (const char *arg, int from_tty)
c906108c 759{
6ba8e26f 760 int num_to_scroll = 1;
5b6fe301 761 struct tui_win_info *win_to_scroll;
c906108c 762
1854bb21
SC
763 /* Make sure the curses mode is enabled. */
764 tui_enable ();
63a33118 765 if (arg == NULL)
cafb3438 766 parse_scrolling_args (arg, &win_to_scroll, NULL);
c906108c 767 else
6ba8e26f 768 parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);
13446e05 769 win_to_scroll->forward_scroll (num_to_scroll);
e8b915dc 770}
c906108c
SS
771
772
c906108c 773static void
0b39b52e 774tui_scroll_backward_command (const char *arg, int from_tty)
c906108c 775{
6ba8e26f 776 int num_to_scroll = 1;
5b6fe301 777 struct tui_win_info *win_to_scroll;
c906108c 778
1854bb21
SC
779 /* Make sure the curses mode is enabled. */
780 tui_enable ();
63a33118 781 if (arg == NULL)
cafb3438 782 parse_scrolling_args (arg, &win_to_scroll, NULL);
c906108c 783 else
6ba8e26f 784 parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);
13446e05 785 win_to_scroll->backward_scroll (num_to_scroll);
e8b915dc 786}
c906108c
SS
787
788
c906108c 789static void
0b39b52e 790tui_scroll_left_command (const char *arg, int from_tty)
c906108c 791{
6ba8e26f 792 int num_to_scroll;
5b6fe301 793 struct tui_win_info *win_to_scroll;
c906108c 794
1854bb21
SC
795 /* Make sure the curses mode is enabled. */
796 tui_enable ();
6ba8e26f 797 parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);
13446e05 798 win_to_scroll->left_scroll (num_to_scroll);
e8b915dc 799}
c906108c
SS
800
801
c906108c 802static void
0b39b52e 803tui_scroll_right_command (const char *arg, int from_tty)
c906108c 804{
6ba8e26f 805 int num_to_scroll;
5b6fe301 806 struct tui_win_info *win_to_scroll;
c906108c 807
1854bb21
SC
808 /* Make sure the curses mode is enabled. */
809 tui_enable ();
6ba8e26f 810 parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);
13446e05 811 win_to_scroll->right_scroll (num_to_scroll);
e8b915dc 812}
c906108c
SS
813
814
6ba8e26f 815/* Set focus to the window named by 'arg'. */
c906108c 816static void
01aeb396 817tui_set_focus_command (const char *arg, int from_tty)
c906108c 818{
01aeb396
TT
819 tui_enable ();
820
63a33118 821 if (arg != NULL)
c906108c 822 {
63a33118 823 char *buf_ptr = xstrdup (arg);
c906108c 824 int i;
e65b5245 825 struct tui_win_info *win_info = NULL;
c906108c 826
6ba8e26f 827 for (i = 0; (i < strlen (buf_ptr)); i++)
6dce28e4 828 buf_ptr[i] = tolower (arg[i]);
c906108c 829
6dce28e4 830 if (subset_compare (buf_ptr, "next"))
6d012f14 831 win_info = tui_next_win (tui_win_with_focus ());
6dce28e4 832 else if (subset_compare (buf_ptr, "prev"))
6d012f14 833 win_info = tui_prev_win (tui_win_with_focus ());
c906108c 834 else
6ba8e26f 835 win_info = tui_partial_win_by_name (buf_ptr);
c906108c 836
cb2ce893 837 if (win_info == NULL || !win_info->is_visible)
8a3fe4f8
AC
838 warning (_("Invalid window specified. \n\
839The window name specified must be valid and visible.\n"));
c906108c
SS
840 else
841 {
6d012f14 842 tui_set_win_focus_to (win_info);
cb2ce893 843 keypad (TUI_CMD_WIN->handle, (win_info != TUI_CMD_WIN));
c906108c
SS
844 }
845
6ba8e26f 846 xfree (buf_ptr);
a3f17187 847 printf_filtered (_("Focus set to %s window.\n"),
152f3f4b 848 tui_win_with_focus ()->name ());
c906108c
SS
849 }
850 else
8a3fe4f8 851 warning (_("Incorrect Number of Arguments.\n%s"), FOCUS_USAGE);
6ba8e26f 852}
c906108c 853
c906108c 854static void
1d12d88f 855tui_all_windows_info (const char *arg, int from_tty)
c906108c 856{
5b6fe301 857 struct tui_win_info *win_with_focus = tui_win_with_focus ();
c906108c 858
1ce3e844
TT
859 for (tui_win_info *win_info : all_tui_windows ())
860 if (win_info->is_visible)
c906108c 861 {
1ce3e844 862 if (win_with_focus == win_info)
c906108c 863 printf_filtered (" %s\t(%d lines) <has focus>\n",
1ce3e844
TT
864 win_info->name (),
865 win_info->height);
c906108c
SS
866 else
867 printf_filtered (" %s\t(%d lines)\n",
1ce3e844
TT
868 win_info->name (),
869 win_info->height);
c906108c 870 }
6ba8e26f 871}
c906108c
SS
872
873
c906108c 874static void
0b39b52e 875tui_refresh_all_command (const char *arg, int from_tty)
c906108c 876{
1854bb21
SC
877 /* Make sure the curses mode is enabled. */
878 tui_enable ();
879
a21fcd8f 880 tui_refresh_all_win ();
c906108c
SS
881}
882
7806cea7
TT
883/* The tab width that should be used by the TUI. */
884
885unsigned int tui_tab_width = DEFAULT_TAB_LEN;
886
887/* The tab width as set by the user. */
888
889static unsigned int internal_tab_width = DEFAULT_TAB_LEN;
890
d83f1fe6
TT
891/* After the tab width is set, call this to update the relevant
892 windows. */
893
894static void
895update_tab_width ()
896{
1ce3e844 897 for (tui_win_info *win_info : all_tui_windows ())
7806cea7 898 {
1ce3e844
TT
899 if (win_info->is_visible)
900 win_info->update_tab_width ();
7806cea7
TT
901 }
902}
903
904/* Callback for "set tui tab-width". */
905
906static void
907tui_set_tab_width (const char *ignore,
908 int from_tty, struct cmd_list_element *c)
909{
910 if (internal_tab_width == 0)
911 {
912 internal_tab_width = tui_tab_width;
913 error (_("Tab width must not be 0"));
914 }
915
916 tui_tab_width = internal_tab_width;
917 update_tab_width ();
918}
919
920/* Callback for "show tui tab-width". */
921
922static void
923tui_show_tab_width (struct ui_file *file, int from_tty,
924 struct cmd_list_element *c, const char *value)
925{
926 fprintf_filtered (gdb_stdout, _("TUI tab width is %s spaces.\n"), value);
927
928}
c906108c 929
c54da50d 930/* Set the tab width of the specified window. */
c906108c 931static void
0b39b52e 932tui_set_tab_width_command (const char *arg, int from_tty)
c906108c 933{
1854bb21
SC
934 /* Make sure the curses mode is enabled. */
935 tui_enable ();
63a33118 936 if (arg != NULL)
c906108c
SS
937 {
938 int ts;
939
940 ts = atoi (arg);
7806cea7
TT
941 if (ts <= 0)
942 warning (_("Tab widths greater than 0 must be specified."));
943 else
cb86fcc1 944 {
7806cea7
TT
945 internal_tab_width = ts;
946 tui_tab_width = ts;
947
948 update_tab_width ();
cb86fcc1 949 }
c906108c 950 }
6ba8e26f 951}
c906108c
SS
952
953
1cc6d956 954/* Set the height of the specified window. */
c906108c 955static void
4dde7b34 956tui_set_win_height_command (const char *arg, int from_tty)
c906108c 957{
1854bb21
SC
958 /* Make sure the curses mode is enabled. */
959 tui_enable ();
63a33118 960 if (arg != NULL)
c906108c 961 {
f71c8822
TT
962 std::string copy = arg;
963 char *buf = &copy[0];
6ba8e26f 964 char *buf_ptr = buf;
e65b5245 965 char *wname = NULL;
6ba8e26f 966 int new_height, i;
5b6fe301 967 struct tui_win_info *win_info;
c906108c 968
6ba8e26f
AC
969 wname = buf_ptr;
970 buf_ptr = strchr (buf_ptr, ' ');
63a33118 971 if (buf_ptr != NULL)
c906108c 972 {
6ba8e26f 973 *buf_ptr = (char) 0;
c906108c 974
ef5eab5a 975 /* Validate the window name. */
c906108c 976 for (i = 0; i < strlen (wname); i++)
6dce28e4 977 wname[i] = tolower (wname[i]);
6d012f14 978 win_info = tui_partial_win_by_name (wname);
c906108c 979
cb2ce893 980 if (win_info == NULL || !win_info->is_visible)
8a3fe4f8
AC
981 warning (_("Invalid window specified. \n\
982The window name specified must be valid and visible.\n"));
c906108c
SS
983 else
984 {
1cc6d956 985 /* Process the size. */
6ba8e26f 986 while (*(++buf_ptr) == ' ')
c906108c
SS
987 ;
988
6ba8e26f 989 if (*buf_ptr != (char) 0)
c906108c
SS
990 {
991 int negate = FALSE;
6ba8e26f
AC
992 int fixed_size = TRUE;
993 int input_no;;
c906108c 994
6ba8e26f 995 if (*buf_ptr == '+' || *buf_ptr == '-')
c906108c 996 {
6ba8e26f 997 if (*buf_ptr == '-')
c906108c 998 negate = TRUE;
6ba8e26f
AC
999 fixed_size = FALSE;
1000 buf_ptr++;
c906108c 1001 }
6ba8e26f
AC
1002 input_no = atoi (buf_ptr);
1003 if (input_no > 0)
c906108c
SS
1004 {
1005 if (negate)
6ba8e26f
AC
1006 input_no *= (-1);
1007 if (fixed_size)
1008 new_height = input_no;
c906108c 1009 else
cb2ce893 1010 new_height = win_info->height + input_no;
ef5eab5a
MS
1011
1012 /* Now change the window's height, and adjust
1013 all other windows around it. */
6ba8e26f
AC
1014 if (tui_adjust_win_heights (win_info,
1015 new_height) == TUI_FAILURE)
8a3fe4f8 1016 warning (_("Invalid window height specified.\n%s"),
c906108c
SS
1017 WIN_HEIGHT_USAGE);
1018 else
3e752b04 1019 tui_update_gdb_sizes ();
c906108c
SS
1020 }
1021 else
8a3fe4f8 1022 warning (_("Invalid window height specified.\n%s"),
c906108c
SS
1023 WIN_HEIGHT_USAGE);
1024 }
1025 }
1026 }
1027 else
1028 printf_filtered (WIN_HEIGHT_USAGE);
c906108c
SS
1029 }
1030 else
1031 printf_filtered (WIN_HEIGHT_USAGE);
6ba8e26f 1032}
c906108c 1033
6ba8e26f 1034/* Function to adjust all window heights around the primary. */
22940a24 1035static enum tui_status
08ef48c5
MS
1036tui_adjust_win_heights (struct tui_win_info *primary_win_info,
1037 int new_height)
c906108c 1038{
22940a24 1039 enum tui_status status = TUI_FAILURE;
c906108c 1040
6ba8e26f 1041 if (new_height_ok (primary_win_info, new_height))
c906108c
SS
1042 {
1043 status = TUI_SUCCESS;
cb2ce893 1044 if (new_height != primary_win_info->height)
c906108c 1045 {
bc712bbf 1046 int diff;
5b6fe301 1047 struct tui_win_info *win_info;
3add462f 1048 struct tui_locator_window *locator = tui_locator_win_info_ptr ();
6ba8e26f 1049 enum tui_layout_type cur_layout = tui_current_layout ();
c906108c 1050
cb2ce893 1051 diff = (new_height - primary_win_info->height) * (-1);
e5908723
MS
1052 if (cur_layout == SRC_COMMAND
1053 || cur_layout == DISASSEM_COMMAND)
c906108c 1054 {
5b6fe301 1055 struct tui_win_info *src_win_info;
c906108c 1056
daa15dde 1057 primary_win_info->make_invisible_and_set_new_height (new_height);
cb2ce893 1058 if (primary_win_info->type == CMD_WIN)
c906108c 1059 {
b4eb2452 1060 win_info = tui_source_windows ()[0];
6ba8e26f 1061 src_win_info = win_info;
c906108c
SS
1062 }
1063 else
1064 {
6d012f14 1065 win_info = tui_win_list[CMD_WIN];
6ba8e26f 1066 src_win_info = primary_win_info;
c906108c 1067 }
daa15dde
TT
1068 win_info->make_invisible_and_set_new_height
1069 (win_info->height + diff);
cb2ce893 1070 TUI_CMD_WIN->origin.y = locator->origin.y + 1;
5fcee43a
TT
1071 win_info->make_visible_with_new_height ();
1072 primary_win_info->make_visible_with_new_height ();
7908abbf 1073 if ((src_win_info->type == SRC_WIN
53e7cdba
TT
1074 || src_win_info->type == DISASSEM_WIN))
1075 {
1076 tui_source_window_base *src_base
1077 = (tui_source_window_base *) src_win_info;
1078 if (src_base->content.empty ())
caf0bc4e 1079 tui_erase_source_content (src_base);
53e7cdba 1080 }
c906108c
SS
1081 }
1082 else
1083 {
6ba8e26f 1084 struct tui_win_info *first_win;
7908abbf
TT
1085 struct tui_source_window_base *second_win;
1086 tui_source_window_base *src1;
c906108c 1087
6ba8e26f 1088 if (cur_layout == SRC_DISASSEM_COMMAND)
c906108c 1089 {
7908abbf
TT
1090 src1 = TUI_SRC_WIN;
1091 first_win = src1;
6ba8e26f 1092 second_win = TUI_DISASM_WIN;
c906108c
SS
1093 }
1094 else
1095 {
7908abbf 1096 src1 = nullptr;
6ba8e26f 1097 first_win = TUI_DATA_WIN;
b4eb2452 1098 second_win = tui_source_windows ()[0];
c906108c 1099 }
6ba8e26f 1100 if (primary_win_info == TUI_CMD_WIN)
ef5eab5a
MS
1101 { /* Split the change in height accross the 1st & 2nd
1102 windows, adjusting them as well. */
1103 /* Subtract the locator. */
1104 int first_split_diff = diff / 2;
6ba8e26f 1105 int second_split_diff = first_split_diff;
c906108c
SS
1106
1107 if (diff % 2)
1108 {
cb2ce893
TT
1109 if (first_win->height >
1110 second_win->height)
c906108c 1111 if (diff < 0)
6ba8e26f 1112 first_split_diff--;
c906108c 1113 else
6ba8e26f 1114 first_split_diff++;
c906108c
SS
1115 else
1116 {
1117 if (diff < 0)
6ba8e26f 1118 second_split_diff--;
c906108c 1119 else
6ba8e26f 1120 second_split_diff++;
c906108c
SS
1121 }
1122 }
1cc6d956
MS
1123 /* Make sure that the minimum hieghts are
1124 honored. */
cb2ce893 1125 while ((first_win->height + first_split_diff) < 3)
c906108c 1126 {
6ba8e26f
AC
1127 first_split_diff++;
1128 second_split_diff--;
c906108c 1129 }
cb2ce893 1130 while ((second_win->height + second_split_diff) < 3)
c906108c 1131 {
6ba8e26f
AC
1132 second_split_diff++;
1133 first_split_diff--;
c906108c 1134 }
daa15dde
TT
1135 first_win->make_invisible_and_set_new_height
1136 (first_win->height + first_split_diff);
cb2ce893 1137 second_win->origin.y = first_win->height - 1;
daa15dde
TT
1138 second_win->make_invisible_and_set_new_height
1139 (second_win->height + second_split_diff);
cb2ce893 1140 TUI_CMD_WIN->origin.y = locator->origin.y + 1;
daa15dde 1141 TUI_CMD_WIN->make_invisible_and_set_new_height (new_height);
c906108c
SS
1142 }
1143 else
1144 {
cb2ce893 1145 if ((TUI_CMD_WIN->height + diff) < 1)
ef5eab5a
MS
1146 { /* If there is no way to increase the command
1147 window take real estate from the 1st or 2nd
1148 window. */
cb2ce893 1149 if ((TUI_CMD_WIN->height + diff) < 1)
c906108c
SS
1150 {
1151 int i;
1c5313c5 1152
cb2ce893 1153 for (i = TUI_CMD_WIN->height + diff;
c906108c 1154 (i < 1); i++)
6ba8e26f 1155 if (primary_win_info == first_win)
cb2ce893 1156 second_win->height--;
c906108c 1157 else
cb2ce893 1158 first_win->height--;
c906108c
SS
1159 }
1160 }
6ba8e26f 1161 if (primary_win_info == first_win)
daa15dde 1162 first_win->make_invisible_and_set_new_height (new_height);
c906108c 1163 else
daa15dde
TT
1164 first_win->make_invisible_and_set_new_height
1165 (first_win->height);
cb2ce893 1166 second_win->origin.y = first_win->height - 1;
6ba8e26f 1167 if (primary_win_info == second_win)
daa15dde 1168 second_win->make_invisible_and_set_new_height (new_height);
c906108c 1169 else
daa15dde
TT
1170 second_win->make_invisible_and_set_new_height
1171 (second_win->height);
cb2ce893
TT
1172 TUI_CMD_WIN->origin.y = locator->origin.y + 1;
1173 if ((TUI_CMD_WIN->height + diff) < 1)
daa15dde 1174 TUI_CMD_WIN->make_invisible_and_set_new_height (1);
c906108c 1175 else
daa15dde
TT
1176 TUI_CMD_WIN->make_invisible_and_set_new_height
1177 (TUI_CMD_WIN->height + diff);
c906108c 1178 }
5fcee43a
TT
1179 TUI_CMD_WIN->make_visible_with_new_height ();
1180 second_win->make_visible_with_new_height ();
1181 first_win->make_visible_with_new_height ();
53e7cdba 1182 if (src1 != nullptr && src1->content.empty ())
caf0bc4e 1183 tui_erase_source_content (src1);
53e7cdba 1184 if (second_win->content.empty ())
caf0bc4e 1185 tui_erase_source_content (second_win);
c906108c
SS
1186 }
1187 }
1188 }
1189
1190 return status;
6ba8e26f 1191}
c906108c
SS
1192
1193
daa15dde
TT
1194/* See tui-data.h. */
1195
1196void
1197tui_win_info::make_invisible_and_set_new_height (int height)
c906108c 1198{
daa15dde
TT
1199 make_visible (false);
1200 height = height;
c906108c 1201 if (height > 1)
daa15dde 1202 viewport_height = height - 1;
c906108c 1203 else
daa15dde
TT
1204 viewport_height = height;
1205 if (this != TUI_CMD_WIN)
1206 viewport_height--;
c906108c 1207
6658b1bf 1208 /* Now deal with the auxiliary windows associated with win_info. */
daa15dde 1209 set_new_height (height);
bc712bbf 1210}
c906108c
SS
1211
1212
5fcee43a
TT
1213/* See tui-data.h. */
1214
1215void
1216tui_win_info::make_visible_with_new_height ()
c906108c 1217{
5fcee43a
TT
1218 make_visible (true);
1219 tui_check_and_display_highlight_if_needed (this);
1220 do_make_visible_with_new_height ();
1221}
1222
1223/* See tui-data.h. */
c906108c 1224
8903bd8a
TT
1225int
1226tui_win_info::max_height () const
1227{
1228 return tui_term_height () - 2;
1229}
1230
c906108c 1231static int
08ef48c5
MS
1232new_height_ok (struct tui_win_info *primary_win_info,
1233 int new_height)
c906108c 1234{
6ba8e26f 1235 int ok = (new_height < tui_term_height ());
c906108c
SS
1236
1237 if (ok)
1238 {
bc712bbf 1239 int diff;
6d012f14 1240 enum tui_layout_type cur_layout = tui_current_layout ();
c906108c 1241
cb2ce893 1242 diff = (new_height - primary_win_info->height) * (-1);
6d012f14 1243 if (cur_layout == SRC_COMMAND || cur_layout == DISASSEM_COMMAND)
c906108c 1244 {
8903bd8a
TT
1245 ok = (new_height <= primary_win_info->max_height ()
1246 && new_height >= MIN_CMD_WIN_HEIGHT);
c906108c 1247 if (ok)
1cc6d956 1248 { /* Check the total height. */
5b6fe301 1249 struct tui_win_info *win_info;
c906108c 1250
6ba8e26f 1251 if (primary_win_info == TUI_CMD_WIN)
b4eb2452 1252 win_info = tui_source_windows ()[0];
c906108c 1253 else
6d012f14 1254 win_info = TUI_CMD_WIN;
6ba8e26f 1255 ok = ((new_height +
cb2ce893 1256 (win_info->height + diff)) <= tui_term_height ());
c906108c
SS
1257 }
1258 }
1259 else
1260 {
6ba8e26f
AC
1261 int cur_total_height, total_height, min_height = 0;
1262 struct tui_win_info *first_win;
1263 struct tui_win_info *second_win;
c906108c 1264
6d012f14 1265 if (cur_layout == SRC_DISASSEM_COMMAND)
c906108c 1266 {
6ba8e26f
AC
1267 first_win = TUI_SRC_WIN;
1268 second_win = TUI_DISASM_WIN;
c906108c
SS
1269 }
1270 else
1271 {
6ba8e26f 1272 first_win = TUI_DATA_WIN;
b4eb2452 1273 second_win = tui_source_windows ()[0];
c906108c 1274 }
ef5eab5a
MS
1275 /* We could simply add all the heights to obtain the same
1276 result but below is more explicit since we subtract 1 for
1277 the line that the first and second windows share, and add
1278 one for the locator. */
6ba8e26f 1279 total_height = cur_total_height =
cb2ce893
TT
1280 (first_win->height + second_win->height - 1)
1281 + TUI_CMD_WIN->height + 1; /* Locator. */
6ba8e26f 1282 if (primary_win_info == TUI_CMD_WIN)
c906108c 1283 {
1cc6d956 1284 /* Locator included since first & second win share a line. */
cb2ce893
TT
1285 ok = ((first_win->height +
1286 second_win->height + diff) >=
e5908723
MS
1287 (MIN_WIN_HEIGHT * 2)
1288 && new_height >= MIN_CMD_WIN_HEIGHT);
c906108c
SS
1289 if (ok)
1290 {
e5908723 1291 total_height = new_height +
cb2ce893
TT
1292 (first_win->height +
1293 second_win->height + diff);
6ba8e26f 1294 min_height = MIN_CMD_WIN_HEIGHT;
c906108c
SS
1295 }
1296 }
1297 else
1298 {
6ba8e26f 1299 min_height = MIN_WIN_HEIGHT;
ef5eab5a
MS
1300
1301 /* First see if we can increase/decrease the command
1302 window. And make sure that the command window is at
1303 least 1 line. */
cb2ce893 1304 ok = ((TUI_CMD_WIN->height + diff) > 0);
c906108c 1305 if (!ok)
ef5eab5a
MS
1306 { /* Looks like we have to increase/decrease one of
1307 the other windows. */
6ba8e26f 1308 if (primary_win_info == first_win)
cb2ce893 1309 ok = (second_win->height + diff) >= min_height;
c906108c 1310 else
cb2ce893 1311 ok = (first_win->height + diff) >= min_height;
c906108c
SS
1312 }
1313 if (ok)
1314 {
6ba8e26f
AC
1315 if (primary_win_info == first_win)
1316 total_height = new_height +
cb2ce893
TT
1317 second_win->height +
1318 TUI_CMD_WIN->height + diff;
c906108c 1319 else
6ba8e26f 1320 total_height = new_height +
cb2ce893
TT
1321 first_win->height +
1322 TUI_CMD_WIN->height + diff;
c906108c
SS
1323 }
1324 }
ef5eab5a
MS
1325 /* Now make sure that the proposed total height doesn't
1326 exceed the old total height. */
c906108c 1327 if (ok)
e5908723
MS
1328 ok = (new_height >= min_height
1329 && total_height <= cur_total_height);
c906108c
SS
1330 }
1331 }
1332
1333 return ok;
6ba8e26f 1334}
c906108c
SS
1335
1336
c906108c 1337static void
0b39b52e 1338parse_scrolling_args (const char *arg,
08ef48c5 1339 struct tui_win_info **win_to_scroll,
6ba8e26f 1340 int *num_to_scroll)
c906108c 1341{
6ba8e26f
AC
1342 if (num_to_scroll)
1343 *num_to_scroll = 0;
1344 *win_to_scroll = tui_win_with_focus ();
c906108c 1345
ef5eab5a
MS
1346 /* First set up the default window to scroll, in case there is no
1347 window name arg. */
63a33118 1348 if (arg != NULL)
c906108c 1349 {
f71c8822 1350 char *buf_ptr;
c906108c 1351
1cc6d956 1352 /* Process the number of lines to scroll. */
f71c8822
TT
1353 std::string copy = arg;
1354 buf_ptr = &copy[0];
6ba8e26f 1355 if (isdigit (*buf_ptr))
c906108c 1356 {
6ba8e26f 1357 char *num_str;
c906108c 1358
6ba8e26f
AC
1359 num_str = buf_ptr;
1360 buf_ptr = strchr (buf_ptr, ' ');
63a33118 1361 if (buf_ptr != NULL)
c906108c 1362 {
6ba8e26f
AC
1363 *buf_ptr = (char) 0;
1364 if (num_to_scroll)
1365 *num_to_scroll = atoi (num_str);
1366 buf_ptr++;
c906108c 1367 }
6ba8e26f
AC
1368 else if (num_to_scroll)
1369 *num_to_scroll = atoi (num_str);
c906108c
SS
1370 }
1371
1cc6d956 1372 /* Process the window name if one is specified. */
63a33118 1373 if (buf_ptr != NULL)
c906108c 1374 {
a121b7c1 1375 const char *wname;
c906108c 1376
6ba8e26f
AC
1377 if (*buf_ptr == ' ')
1378 while (*(++buf_ptr) == ' ')
c906108c
SS
1379 ;
1380
6ba8e26f 1381 if (*buf_ptr != (char) 0)
c709a7c2 1382 {
c709a7c2 1383 /* Validate the window name. */
a121b7c1
PA
1384 for (char *p = buf_ptr; *p != '\0'; p++)
1385 *p = tolower (*p);
1386
1387 wname = buf_ptr;
c709a7c2 1388 }
a4b99e53
SC
1389 else
1390 wname = "?";
1391
6ba8e26f 1392 *win_to_scroll = tui_partial_win_by_name (wname);
c906108c 1393
ca5af91e
TT
1394 if (*win_to_scroll == NULL)
1395 error (_("Unrecognized window `%s'"), wname);
1396 if (!(*win_to_scroll)->is_visible)
1397 error (_("Window is not visible"));
6ba8e26f 1398 else if (*win_to_scroll == TUI_CMD_WIN)
b4eb2452 1399 *win_to_scroll = tui_source_windows ()[0];
c906108c 1400 }
c906108c 1401 }
6ba8e26f 1402}
7806cea7
TT
1403
1404/* Function to initialize gdb commands, for tui window
1405 manipulation. */
1406
1407void
1408_initialize_tui_win (void)
1409{
1410 static struct cmd_list_element *tui_setlist;
1411 static struct cmd_list_element *tui_showlist;
1412 struct cmd_list_element *cmd;
1413
1414 /* Define the classes of commands.
1415 They will appear in the help list in the reverse of this order. */
1416 add_prefix_cmd ("tui", class_tui, set_tui_cmd,
1417 _("TUI configuration variables"),
1418 &tui_setlist, "set tui ",
1419 0 /* allow-unknown */, &setlist);
1420 add_prefix_cmd ("tui", class_tui, show_tui_cmd,
1421 _("TUI configuration variables"),
1422 &tui_showlist, "show tui ",
1423 0 /* allow-unknown */, &showlist);
1424
1425 add_com ("refresh", class_tui, tui_refresh_all_command,
89549d7f 1426 _("Refresh the terminal display."));
7806cea7
TT
1427
1428 cmd = add_com ("tabset", class_tui, tui_set_tab_width_command, _("\
1429Set the width (in characters) of tab stops.\n\
89549d7f 1430Usage: tabset N"));
7806cea7
TT
1431 deprecate_cmd (cmd, "set tui tab-width");
1432
1433 cmd = add_com ("winheight", class_tui, tui_set_win_height_command, _("\
1434Set or modify the height of a specified window.\n"
1435WIN_HEIGHT_USAGE
1436"Window names are:\n\
89549d7f
TT
1437 src : the source window\n\
1438 cmd : the command window\n\
1439 asm : the disassembly window\n\
1440 regs : the register display"));
7806cea7
TT
1441 add_com_alias ("wh", "winheight", class_tui, 0);
1442 set_cmd_completer (cmd, winheight_completer);
1443 add_info ("win", tui_all_windows_info,
89549d7f 1444 _("List of all displayed windows."));
7806cea7
TT
1445 cmd = add_com ("focus", class_tui, tui_set_focus_command, _("\
1446Set focus to named window or next/prev window.\n"
1447FOCUS_USAGE
1448"Valid Window names are:\n\
89549d7f
TT
1449 src : the source window\n\
1450 asm : the disassembly window\n\
1451 regs : the register display\n\
1452 cmd : the command window"));
7806cea7
TT
1453 add_com_alias ("fs", "focus", class_tui, 0);
1454 set_cmd_completer (cmd, focus_completer);
1455 add_com ("+", class_tui, tui_scroll_forward_command, _("\
1456Scroll window forward.\n\
89549d7f 1457Usage: + [WIN] [N]"));
7806cea7
TT
1458 add_com ("-", class_tui, tui_scroll_backward_command, _("\
1459Scroll window backward.\n\
89549d7f 1460Usage: - [WIN] [N]"));
7806cea7
TT
1461 add_com ("<", class_tui, tui_scroll_left_command, _("\
1462Scroll window text to the left.\n\
89549d7f 1463Usage: < [WIN] [N]"));
7806cea7
TT
1464 add_com (">", class_tui, tui_scroll_right_command, _("\
1465Scroll window text to the right.\n\
89549d7f 1466Usage: > [WIN] [N]"));
7806cea7
TT
1467
1468 /* Define the tui control variables. */
1469 add_setshow_enum_cmd ("border-kind", no_class, tui_border_kind_enums,
1470 &tui_border_kind, _("\
1471Set the kind of border for TUI windows."), _("\
1472Show the kind of border for TUI windows."), _("\
1473This variable controls the border of TUI windows:\n\
89549d7f
TT
1474 space use a white space\n\
1475 ascii use ascii characters + - | for the border\n\
1476 acs use the Alternate Character Set"),
7806cea7
TT
1477 tui_set_var_cmd,
1478 show_tui_border_kind,
1479 &tui_setlist, &tui_showlist);
1480
1481 add_setshow_enum_cmd ("border-mode", no_class, tui_border_mode_enums,
1482 &tui_border_mode, _("\
1483Set the attribute mode to use for the TUI window borders."), _("\
1484Show the attribute mode to use for the TUI window borders."), _("\
1485This variable controls the attributes to use for the window borders:\n\
89549d7f
TT
1486 normal normal display\n\
1487 standout use highlight mode of terminal\n\
1488 reverse use reverse video mode\n\
1489 half use half bright\n\
1490 half-standout use half bright and standout mode\n\
1491 bold use extra bright or bold\n\
1492 bold-standout use extra bright or bold with standout mode"),
7806cea7
TT
1493 tui_set_var_cmd,
1494 show_tui_border_mode,
1495 &tui_setlist, &tui_showlist);
1496
1497 add_setshow_enum_cmd ("active-border-mode", no_class, tui_border_mode_enums,
1498 &tui_active_border_mode, _("\
1499Set the attribute mode to use for the active TUI window border."), _("\
1500Show the attribute mode to use for the active TUI window border."), _("\
1501This variable controls the attributes to use for the active window border:\n\
89549d7f
TT
1502 normal normal display\n\
1503 standout use highlight mode of terminal\n\
1504 reverse use reverse video mode\n\
1505 half use half bright\n\
1506 half-standout use half bright and standout mode\n\
1507 bold use extra bright or bold\n\
1508 bold-standout use extra bright or bold with standout mode"),
7806cea7
TT
1509 tui_set_var_cmd,
1510 show_tui_active_border_mode,
1511 &tui_setlist, &tui_showlist);
1512
1513 add_setshow_zuinteger_cmd ("tab-width", no_class,
1514 &internal_tab_width, _("\
1515Set the tab width, in characters, for the TUI."), _("\
1516Show the tab witdh, in characters, for the TUI"), _("\
1517This variable controls how many spaces are used to display a tab character."),
1518 tui_set_tab_width, tui_show_tab_width,
1519 &tui_setlist, &tui_showlist);
1520}
This page took 2.128617 seconds and 4 git commands to generate.