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