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