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