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