2010-07-28 Balazs Kezes <rlblaster@gmail.com>
[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 }
1cc6d956
MS
802 /* Turn keypad back on, unless focus is in the command
803 window. */
6ba8e26f 804 if (win_with_focus != TUI_CMD_WIN)
6d012f14 805 keypad (TUI_CMD_WIN->generic.handle, TRUE);
c906108c 806 }
6ba8e26f 807}
c906108c 808
2c0b251b 809#ifdef SIGWINCH
6ba8e26f
AC
810/* SIGWINCH signal handler for the tui. This signal handler is always
811 called, even when the readline package clears signals because it is
812 set as the old_sigwinch() (TUI only). */
2c0b251b 813static void
6ba8e26f 814tui_sigwinch_handler (int signal)
c906108c 815{
ef5eab5a
MS
816 /* Say that a resize was done so that the readline can do it later
817 when appropriate. */
dd1abb8c 818 tui_set_win_resized_to (TRUE);
6ba8e26f 819}
2c0b251b 820#endif
c906108c 821
9612b5ec
UW
822/* Initializes SIGWINCH signal handler for the tui. */
823void
824tui_initialize_win (void)
825{
826#ifdef SIGWINCH
827#ifdef HAVE_SIGACTION
828 struct sigaction old_winch;
1c5313c5 829
9612b5ec
UW
830 memset (&old_winch, 0, sizeof (old_winch));
831 old_winch.sa_handler = &tui_sigwinch_handler;
832 sigaction (SIGWINCH, &old_winch, NULL);
833#else
834 signal (SIGWINCH, &tui_sigwinch_handler);
835#endif
836#endif
837}
c906108c
SS
838
839
840/*************************
841** STATIC LOCAL FUNCTIONS
842**************************/
843
844
c906108c 845static void
6ba8e26f 846tui_scroll_forward_command (char *arg, int from_tty)
c906108c 847{
6ba8e26f 848 int num_to_scroll = 1;
5b6fe301 849 struct tui_win_info *win_to_scroll;
c906108c 850
1854bb21
SC
851 /* Make sure the curses mode is enabled. */
852 tui_enable ();
c906108c 853 if (arg == (char *) NULL)
6ba8e26f 854 parse_scrolling_args (arg, &win_to_scroll, (int *) NULL);
c906108c 855 else
6ba8e26f
AC
856 parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);
857 tui_scroll (FORWARD_SCROLL, win_to_scroll, num_to_scroll);
e8b915dc 858}
c906108c
SS
859
860
c906108c 861static void
6ba8e26f 862tui_scroll_backward_command (char *arg, int from_tty)
c906108c 863{
6ba8e26f 864 int num_to_scroll = 1;
5b6fe301 865 struct tui_win_info *win_to_scroll;
c906108c 866
1854bb21
SC
867 /* Make sure the curses mode is enabled. */
868 tui_enable ();
c906108c 869 if (arg == (char *) NULL)
6ba8e26f 870 parse_scrolling_args (arg, &win_to_scroll, (int *) NULL);
c906108c 871 else
6ba8e26f
AC
872 parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);
873 tui_scroll (BACKWARD_SCROLL, win_to_scroll, num_to_scroll);
e8b915dc 874}
c906108c
SS
875
876
c906108c 877static void
6ba8e26f 878tui_scroll_left_command (char *arg, int from_tty)
c906108c 879{
6ba8e26f 880 int num_to_scroll;
5b6fe301 881 struct tui_win_info *win_to_scroll;
c906108c 882
1854bb21
SC
883 /* Make sure the curses mode is enabled. */
884 tui_enable ();
6ba8e26f
AC
885 parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);
886 tui_scroll (LEFT_SCROLL, win_to_scroll, num_to_scroll);
e8b915dc 887}
c906108c
SS
888
889
c906108c 890static void
6ba8e26f 891tui_scroll_right_command (char *arg, int from_tty)
c906108c 892{
6ba8e26f 893 int num_to_scroll;
5b6fe301 894 struct tui_win_info *win_to_scroll;
c906108c 895
1854bb21
SC
896 /* Make sure the curses mode is enabled. */
897 tui_enable ();
6ba8e26f
AC
898 parse_scrolling_args (arg, &win_to_scroll, &num_to_scroll);
899 tui_scroll (RIGHT_SCROLL, win_to_scroll, num_to_scroll);
e8b915dc 900}
c906108c
SS
901
902
6ba8e26f 903/* Set focus to the window named by 'arg'. */
c906108c 904static void
6ba8e26f 905tui_set_focus (char *arg, int from_tty)
c906108c
SS
906{
907 if (arg != (char *) NULL)
908 {
6ba8e26f 909 char *buf_ptr = (char *) xstrdup (arg);
c906108c 910 int i;
5b6fe301 911 struct tui_win_info *win_info = (struct tui_win_info *) NULL;
c906108c 912
6ba8e26f
AC
913 for (i = 0; (i < strlen (buf_ptr)); i++)
914 buf_ptr[i] = toupper (arg[i]);
c906108c 915
6ba8e26f 916 if (subset_compare (buf_ptr, "NEXT"))
6d012f14 917 win_info = tui_next_win (tui_win_with_focus ());
6ba8e26f 918 else if (subset_compare (buf_ptr, "PREV"))
6d012f14 919 win_info = tui_prev_win (tui_win_with_focus ());
c906108c 920 else
6ba8e26f 921 win_info = tui_partial_win_by_name (buf_ptr);
c906108c 922
e5908723
MS
923 if (win_info == (struct tui_win_info *) NULL
924 || !win_info->generic.is_visible)
8a3fe4f8
AC
925 warning (_("Invalid window specified. \n\
926The window name specified must be valid and visible.\n"));
c906108c
SS
927 else
928 {
6d012f14
AC
929 tui_set_win_focus_to (win_info);
930 keypad (TUI_CMD_WIN->generic.handle, (win_info != TUI_CMD_WIN));
c906108c
SS
931 }
932
6d012f14 933 if (TUI_DATA_WIN && TUI_DATA_WIN->generic.is_visible)
edae1ccf 934 tui_refresh_data_win ();
6ba8e26f 935 xfree (buf_ptr);
a3f17187 936 printf_filtered (_("Focus set to %s window.\n"),
2a8854a7 937 tui_win_name ((struct tui_gen_win_info *) tui_win_with_focus ()));
c906108c
SS
938 }
939 else
8a3fe4f8 940 warning (_("Incorrect Number of Arguments.\n%s"), FOCUS_USAGE);
6ba8e26f 941}
c906108c 942
c906108c 943static void
6ba8e26f 944tui_set_focus_command (char *arg, int from_tty)
c906108c 945{
1854bb21
SC
946 /* Make sure the curses mode is enabled. */
947 tui_enable ();
6ba8e26f 948 tui_set_focus (arg, from_tty);
e8b915dc 949}
c906108c
SS
950
951
c906108c 952static void
6ba8e26f 953tui_all_windows_info (char *arg, int from_tty)
c906108c 954{
22940a24 955 enum tui_win_type type;
5b6fe301 956 struct tui_win_info *win_with_focus = tui_win_with_focus ();
c906108c
SS
957
958 for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++)
e5908723
MS
959 if (tui_win_list[type]
960 && tui_win_list[type]->generic.is_visible)
c906108c 961 {
6ba8e26f 962 if (win_with_focus == tui_win_list[type])
c906108c 963 printf_filtered (" %s\t(%d lines) <has focus>\n",
6d012f14
AC
964 tui_win_name (&tui_win_list[type]->generic),
965 tui_win_list[type]->generic.height);
c906108c
SS
966 else
967 printf_filtered (" %s\t(%d lines)\n",
6d012f14
AC
968 tui_win_name (&tui_win_list[type]->generic),
969 tui_win_list[type]->generic.height);
c906108c 970 }
6ba8e26f 971}
c906108c
SS
972
973
c906108c 974static void
6ba8e26f 975tui_refresh_all_command (char *arg, int from_tty)
c906108c 976{
1854bb21
SC
977 /* Make sure the curses mode is enabled. */
978 tui_enable ();
979
a21fcd8f 980 tui_refresh_all_win ();
c906108c
SS
981}
982
983
1cc6d956 984/* Set the height of the specified window. */
c906108c 985static void
6ba8e26f 986tui_set_tab_width_command (char *arg, int from_tty)
c906108c 987{
1854bb21
SC
988 /* Make sure the curses mode is enabled. */
989 tui_enable ();
c906108c
SS
990 if (arg != (char *) NULL)
991 {
992 int ts;
993
994 ts = atoi (arg);
995 if (ts > 0)
dd1abb8c 996 tui_set_default_tab_len (ts);
c906108c 997 else
8a3fe4f8 998 warning (_("Tab widths greater than 0 must be specified."));
c906108c 999 }
6ba8e26f 1000}
c906108c
SS
1001
1002
1cc6d956 1003/* Set the height of the specified window. */
c906108c 1004static void
6ba8e26f 1005tui_set_win_height (char *arg, int from_tty)
c906108c 1006{
1854bb21
SC
1007 /* Make sure the curses mode is enabled. */
1008 tui_enable ();
c906108c
SS
1009 if (arg != (char *) NULL)
1010 {
1854bb21 1011 char *buf = xstrdup (arg);
6ba8e26f 1012 char *buf_ptr = buf;
c906108c 1013 char *wname = (char *) NULL;
6ba8e26f 1014 int new_height, i;
5b6fe301 1015 struct tui_win_info *win_info;
c906108c 1016
6ba8e26f
AC
1017 wname = buf_ptr;
1018 buf_ptr = strchr (buf_ptr, ' ');
1019 if (buf_ptr != (char *) NULL)
c906108c 1020 {
6ba8e26f 1021 *buf_ptr = (char) 0;
c906108c 1022
ef5eab5a 1023 /* Validate the window name. */
c906108c
SS
1024 for (i = 0; i < strlen (wname); i++)
1025 wname[i] = toupper (wname[i]);
6d012f14 1026 win_info = tui_partial_win_by_name (wname);
c906108c 1027
e5908723
MS
1028 if (win_info == (struct tui_win_info *) NULL
1029 || !win_info->generic.is_visible)
8a3fe4f8
AC
1030 warning (_("Invalid window specified. \n\
1031The window name specified must be valid and visible.\n"));
c906108c
SS
1032 else
1033 {
1cc6d956 1034 /* Process the size. */
6ba8e26f 1035 while (*(++buf_ptr) == ' ')
c906108c
SS
1036 ;
1037
6ba8e26f 1038 if (*buf_ptr != (char) 0)
c906108c
SS
1039 {
1040 int negate = FALSE;
6ba8e26f
AC
1041 int fixed_size = TRUE;
1042 int input_no;;
c906108c 1043
6ba8e26f 1044 if (*buf_ptr == '+' || *buf_ptr == '-')
c906108c 1045 {
6ba8e26f 1046 if (*buf_ptr == '-')
c906108c 1047 negate = TRUE;
6ba8e26f
AC
1048 fixed_size = FALSE;
1049 buf_ptr++;
c906108c 1050 }
6ba8e26f
AC
1051 input_no = atoi (buf_ptr);
1052 if (input_no > 0)
c906108c
SS
1053 {
1054 if (negate)
6ba8e26f
AC
1055 input_no *= (-1);
1056 if (fixed_size)
1057 new_height = input_no;
c906108c 1058 else
6ba8e26f 1059 new_height = win_info->generic.height + input_no;
ef5eab5a
MS
1060
1061 /* Now change the window's height, and adjust
1062 all other windows around it. */
6ba8e26f
AC
1063 if (tui_adjust_win_heights (win_info,
1064 new_height) == TUI_FAILURE)
8a3fe4f8 1065 warning (_("Invalid window height specified.\n%s"),
c906108c
SS
1066 WIN_HEIGHT_USAGE);
1067 else
3e752b04 1068 tui_update_gdb_sizes ();
c906108c
SS
1069 }
1070 else
8a3fe4f8 1071 warning (_("Invalid window height specified.\n%s"),
c906108c
SS
1072 WIN_HEIGHT_USAGE);
1073 }
1074 }
1075 }
1076 else
1077 printf_filtered (WIN_HEIGHT_USAGE);
1078
1079 if (buf != (char *) NULL)
22940a24 1080 xfree (buf);
c906108c
SS
1081 }
1082 else
1083 printf_filtered (WIN_HEIGHT_USAGE);
6ba8e26f 1084}
c906108c 1085
1cc6d956 1086/* Set the height of the specified window, with va_list. */
c906108c 1087static void
6ba8e26f 1088tui_set_win_height_command (char *arg, int from_tty)
c906108c 1089{
1854bb21
SC
1090 /* Make sure the curses mode is enabled. */
1091 tui_enable ();
6ba8e26f 1092 tui_set_win_height (arg, from_tty);
e8b915dc 1093}
c906108c
SS
1094
1095
6ba8e26f 1096/* XDB Compatibility command for setting the window height. This will
1cc6d956
MS
1097 increase or decrease the command window by the specified
1098 amount. */
c906108c 1099static void
6ba8e26f 1100tui_xdb_set_win_height (char *arg, int from_tty)
c906108c 1101{
1854bb21
SC
1102 /* Make sure the curses mode is enabled. */
1103 tui_enable ();
c906108c
SS
1104 if (arg != (char *) NULL)
1105 {
6ba8e26f 1106 int input_no = atoi (arg);
c906108c 1107
6ba8e26f 1108 if (input_no > 0)
1cc6d956 1109 { /* Add 1 for the locator. */
6ba8e26f 1110 int new_height = tui_term_height () - (input_no + 1);
c906108c 1111
e5908723
MS
1112 if (!new_height_ok (tui_win_list[CMD_WIN], new_height)
1113 || tui_adjust_win_heights (tui_win_list[CMD_WIN],
1114 new_height) == TUI_FAILURE)
8a3fe4f8 1115 warning (_("Invalid window height specified.\n%s"),
c906108c
SS
1116 XDBWIN_HEIGHT_USAGE);
1117 }
1118 else
8a3fe4f8 1119 warning (_("Invalid window height specified.\n%s"),
c906108c
SS
1120 XDBWIN_HEIGHT_USAGE);
1121 }
1122 else
8a3fe4f8 1123 warning (_("Invalid window height specified.\n%s"), XDBWIN_HEIGHT_USAGE);
6ba8e26f 1124}
c906108c 1125
6ba8e26f 1126/* Set the height of the specified window, with va_list. */
c906108c 1127static void
6ba8e26f 1128tui_xdb_set_win_height_command (char *arg, int from_tty)
c906108c 1129{
6ba8e26f 1130 tui_xdb_set_win_height (arg, from_tty);
e8b915dc 1131}
c906108c
SS
1132
1133
6ba8e26f 1134/* Function to adjust all window heights around the primary. */
22940a24 1135static enum tui_status
08ef48c5
MS
1136tui_adjust_win_heights (struct tui_win_info *primary_win_info,
1137 int new_height)
c906108c 1138{
22940a24 1139 enum tui_status status = TUI_FAILURE;
c906108c 1140
6ba8e26f 1141 if (new_height_ok (primary_win_info, new_height))
c906108c
SS
1142 {
1143 status = TUI_SUCCESS;
6ba8e26f 1144 if (new_height != primary_win_info->generic.height)
c906108c 1145 {
bc712bbf 1146 int diff;
5b6fe301
MS
1147 struct tui_win_info *win_info;
1148 struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
6ba8e26f 1149 enum tui_layout_type cur_layout = tui_current_layout ();
c906108c 1150
6ba8e26f 1151 diff = (new_height - primary_win_info->generic.height) * (-1);
e5908723
MS
1152 if (cur_layout == SRC_COMMAND
1153 || cur_layout == DISASSEM_COMMAND)
c906108c 1154 {
5b6fe301 1155 struct tui_win_info *src_win_info;
c906108c 1156
6ba8e26f
AC
1157 make_invisible_and_set_new_height (primary_win_info, new_height);
1158 if (primary_win_info->generic.type == CMD_WIN)
c906108c 1159 {
96c1eda2 1160 win_info = (tui_source_windows ())->list[0];
6ba8e26f 1161 src_win_info = win_info;
c906108c
SS
1162 }
1163 else
1164 {
6d012f14 1165 win_info = tui_win_list[CMD_WIN];
6ba8e26f 1166 src_win_info = primary_win_info;
c906108c 1167 }
6ba8e26f 1168 make_invisible_and_set_new_height (win_info,
6d012f14
AC
1169 win_info->generic.height + diff);
1170 TUI_CMD_WIN->generic.origin.y = locator->origin.y + 1;
6ba8e26f
AC
1171 make_visible_with_new_height (win_info);
1172 make_visible_with_new_height (primary_win_info);
1173 if (src_win_info->generic.content_size <= 0)
1174 tui_erase_source_content (src_win_info, EMPTY_SOURCE_PROMPT);
c906108c
SS
1175 }
1176 else
1177 {
6ba8e26f
AC
1178 struct tui_win_info *first_win;
1179 struct tui_win_info *second_win;
c906108c 1180
6ba8e26f 1181 if (cur_layout == SRC_DISASSEM_COMMAND)
c906108c 1182 {
6ba8e26f
AC
1183 first_win = TUI_SRC_WIN;
1184 second_win = TUI_DISASM_WIN;
c906108c
SS
1185 }
1186 else
1187 {
6ba8e26f 1188 first_win = TUI_DATA_WIN;
96c1eda2 1189 second_win = (tui_source_windows ())->list[0];
c906108c 1190 }
6ba8e26f 1191 if (primary_win_info == TUI_CMD_WIN)
ef5eab5a
MS
1192 { /* Split the change in height accross the 1st & 2nd
1193 windows, adjusting them as well. */
1194 /* Subtract the locator. */
1195 int first_split_diff = diff / 2;
6ba8e26f 1196 int second_split_diff = first_split_diff;
c906108c
SS
1197
1198 if (diff % 2)
1199 {
6ba8e26f
AC
1200 if (first_win->generic.height >
1201 second_win->generic.height)
c906108c 1202 if (diff < 0)
6ba8e26f 1203 first_split_diff--;
c906108c 1204 else
6ba8e26f 1205 first_split_diff++;
c906108c
SS
1206 else
1207 {
1208 if (diff < 0)
6ba8e26f 1209 second_split_diff--;
c906108c 1210 else
6ba8e26f 1211 second_split_diff++;
c906108c
SS
1212 }
1213 }
1cc6d956
MS
1214 /* Make sure that the minimum hieghts are
1215 honored. */
6ba8e26f 1216 while ((first_win->generic.height + first_split_diff) < 3)
c906108c 1217 {
6ba8e26f
AC
1218 first_split_diff++;
1219 second_split_diff--;
c906108c 1220 }
6ba8e26f 1221 while ((second_win->generic.height + second_split_diff) < 3)
c906108c 1222 {
6ba8e26f
AC
1223 second_split_diff++;
1224 first_split_diff--;
c906108c 1225 }
6ba8e26f
AC
1226 make_invisible_and_set_new_height (
1227 first_win,
1228 first_win->generic.height + first_split_diff);
1229 second_win->generic.origin.y = first_win->generic.height - 1;
1230 make_invisible_and_set_new_height (
1231 second_win, second_win->generic.height + second_split_diff);
6d012f14 1232 TUI_CMD_WIN->generic.origin.y = locator->origin.y + 1;
6ba8e26f 1233 make_invisible_and_set_new_height (TUI_CMD_WIN, new_height);
c906108c
SS
1234 }
1235 else
1236 {
6d012f14 1237 if ((TUI_CMD_WIN->generic.height + diff) < 1)
ef5eab5a
MS
1238 { /* If there is no way to increase the command
1239 window take real estate from the 1st or 2nd
1240 window. */
6d012f14 1241 if ((TUI_CMD_WIN->generic.height + diff) < 1)
c906108c
SS
1242 {
1243 int i;
1c5313c5 1244
6d012f14 1245 for (i = TUI_CMD_WIN->generic.height + diff;
c906108c 1246 (i < 1); i++)
6ba8e26f
AC
1247 if (primary_win_info == first_win)
1248 second_win->generic.height--;
c906108c 1249 else
6ba8e26f 1250 first_win->generic.height--;
c906108c
SS
1251 }
1252 }
6ba8e26f
AC
1253 if (primary_win_info == first_win)
1254 make_invisible_and_set_new_height (first_win, new_height);
c906108c 1255 else
6ba8e26f
AC
1256 make_invisible_and_set_new_height (
1257 first_win,
1258 first_win->generic.height);
1259 second_win->generic.origin.y = first_win->generic.height - 1;
1260 if (primary_win_info == second_win)
1261 make_invisible_and_set_new_height (second_win, new_height);
c906108c 1262 else
6ba8e26f
AC
1263 make_invisible_and_set_new_height (
1264 second_win, second_win->generic.height);
6d012f14
AC
1265 TUI_CMD_WIN->generic.origin.y = locator->origin.y + 1;
1266 if ((TUI_CMD_WIN->generic.height + diff) < 1)
6ba8e26f 1267 make_invisible_and_set_new_height (TUI_CMD_WIN, 1);
c906108c 1268 else
6ba8e26f 1269 make_invisible_and_set_new_height (
6d012f14 1270 TUI_CMD_WIN, TUI_CMD_WIN->generic.height + diff);
c906108c 1271 }
6ba8e26f
AC
1272 make_visible_with_new_height (TUI_CMD_WIN);
1273 make_visible_with_new_height (second_win);
1274 make_visible_with_new_height (first_win);
1275 if (first_win->generic.content_size <= 0)
1276 tui_erase_source_content (first_win, EMPTY_SOURCE_PROMPT);
1277 if (second_win->generic.content_size <= 0)
1278 tui_erase_source_content (second_win, EMPTY_SOURCE_PROMPT);
c906108c
SS
1279 }
1280 }
1281 }
1282
1283 return status;
6ba8e26f 1284}
c906108c
SS
1285
1286
6ba8e26f 1287/* Function make the target window (and auxillary windows associated
1cc6d956
MS
1288 with the targer) invisible, and set the new height and
1289 location. */
c906108c 1290static void
08ef48c5
MS
1291make_invisible_and_set_new_height (struct tui_win_info *win_info,
1292 int height)
c906108c
SS
1293{
1294 int i;
5b6fe301 1295 struct tui_gen_win_info *gen_win_info;
c906108c 1296
6d012f14
AC
1297 tui_make_invisible (&win_info->generic);
1298 win_info->generic.height = height;
c906108c 1299 if (height > 1)
6d012f14 1300 win_info->generic.viewport_height = height - 1;
c906108c 1301 else
6d012f14
AC
1302 win_info->generic.viewport_height = height;
1303 if (win_info != TUI_CMD_WIN)
1304 win_info->generic.viewport_height--;
c906108c 1305
1cc6d956 1306 /* Now deal with the auxillary windows associated with win_info. */
6d012f14 1307 switch (win_info->generic.type)
c906108c
SS
1308 {
1309 case SRC_WIN:
1310 case DISASSEM_WIN:
6ba8e26f
AC
1311 gen_win_info = win_info->detail.source_info.execution_info;
1312 tui_make_invisible (gen_win_info);
1313 gen_win_info->height = height;
1314 gen_win_info->origin.y = win_info->generic.origin.y;
c906108c 1315 if (height > 1)
6ba8e26f 1316 gen_win_info->viewport_height = height - 1;
c906108c 1317 else
6ba8e26f 1318 gen_win_info->viewport_height = height;
6d012f14 1319 if (win_info != TUI_CMD_WIN)
6ba8e26f 1320 gen_win_info->viewport_height--;
c906108c 1321
6d012f14 1322 if (tui_win_has_locator (win_info))
c906108c 1323 {
6ba8e26f
AC
1324 gen_win_info = tui_locator_win_info_ptr ();
1325 tui_make_invisible (gen_win_info);
1326 gen_win_info->origin.y = win_info->generic.origin.y + height;
c906108c
SS
1327 }
1328 break;
1329 case DATA_WIN:
1cc6d956 1330 /* Delete all data item windows. */
6d012f14 1331 for (i = 0; i < win_info->generic.content_size; i++)
c906108c 1332 {
6ba8e26f 1333 gen_win_info = (struct tui_gen_win_info *) & ((struct tui_win_element *)
6d012f14 1334 win_info->generic.content[i])->which_element.data_window;
6ba8e26f
AC
1335 tui_delete_win (gen_win_info->handle);
1336 gen_win_info->handle = (WINDOW *) NULL;
c906108c
SS
1337 }
1338 break;
1339 default:
1340 break;
1341 }
bc712bbf 1342}
c906108c
SS
1343
1344
6ba8e26f
AC
1345/* Function to make the windows with new heights visible. This means
1346 re-creating the windows' content since the window had to be
1347 destroyed to be made invisible. */
c906108c 1348static void
5b6fe301 1349make_visible_with_new_height (struct tui_win_info *win_info)
c906108c 1350{
c906108c
SS
1351 struct symtab *s;
1352
6d012f14
AC
1353 tui_make_visible (&win_info->generic);
1354 tui_check_and_display_highlight_if_needed (win_info);
1355 switch (win_info->generic.type)
c906108c
SS
1356 {
1357 case SRC_WIN:
1358 case DISASSEM_WIN:
6d012f14
AC
1359 tui_free_win_content (win_info->detail.source_info.execution_info);
1360 tui_make_visible (win_info->detail.source_info.execution_info);
1361 if (win_info->generic.content != NULL)
c906108c 1362 {
13274fc3 1363 struct gdbarch *gdbarch = win_info->detail.source_info.gdbarch;
362c05fe 1364 struct tui_line_or_address line_or_addr;
52575520
EZ
1365 struct symtab_and_line cursal
1366 = get_current_source_symtab_and_line ();
c906108c 1367
362c05fe 1368 line_or_addr = win_info->detail.source_info.start_line_or_addr;
6d012f14 1369 tui_free_win_content (&win_info->generic);
13274fc3
UW
1370 tui_update_source_window (win_info, gdbarch,
1371 cursal.symtab, line_or_addr, TRUE);
c906108c 1372 }
206415a3 1373 else if (deprecated_safe_get_selected_frame () != NULL)
c906108c 1374 {
362c05fe 1375 struct tui_line_or_address line;
52575520 1376 struct symtab_and_line cursal = get_current_source_symtab_and_line ();
206415a3 1377 struct frame_info *frame = deprecated_safe_get_selected_frame ();
13274fc3 1378 struct gdbarch *gdbarch = get_frame_arch (frame);
52575520 1379
206415a3 1380 s = find_pc_symtab (get_frame_pc (frame));
6d012f14 1381 if (win_info->generic.type == SRC_WIN)
362c05fe
AS
1382 {
1383 line.loa = LOA_LINE;
1384 line.u.line_no = cursal.line;
1385 }
c906108c 1386 else
84b1e7c7 1387 {
362c05fe
AS
1388 line.loa = LOA_ADDRESS;
1389 find_line_pc (s, cursal.line, &line.u.addr);
84b1e7c7 1390 }
13274fc3 1391 tui_update_source_window (win_info, gdbarch, s, line, TRUE);
c906108c 1392 }
6d012f14 1393 if (tui_win_has_locator (win_info))
c906108c 1394 {
dd1abb8c 1395 tui_make_visible (tui_locator_win_info_ptr ());
47d3492a 1396 tui_show_locator_content ();
c906108c
SS
1397 }
1398 break;
1399 case DATA_WIN:
edae1ccf 1400 tui_display_all_data ();
c906108c
SS
1401 break;
1402 case CMD_WIN:
6d012f14
AC
1403 win_info->detail.command_info.cur_line = 0;
1404 win_info->detail.command_info.curch = 0;
1405 wmove (win_info->generic.handle,
1406 win_info->detail.command_info.cur_line,
1407 win_info->detail.command_info.curch);
c906108c
SS
1408 break;
1409 default:
1410 break;
1411 }
6ba8e26f 1412}
c906108c
SS
1413
1414
1415static int
08ef48c5
MS
1416new_height_ok (struct tui_win_info *primary_win_info,
1417 int new_height)
c906108c 1418{
6ba8e26f 1419 int ok = (new_height < tui_term_height ());
c906108c
SS
1420
1421 if (ok)
1422 {
bc712bbf 1423 int diff;
6d012f14 1424 enum tui_layout_type cur_layout = tui_current_layout ();
c906108c 1425
6ba8e26f 1426 diff = (new_height - primary_win_info->generic.height) * (-1);
6d012f14 1427 if (cur_layout == SRC_COMMAND || cur_layout == DISASSEM_COMMAND)
c906108c 1428 {
e5908723
MS
1429 ok = ((primary_win_info->generic.type == CMD_WIN
1430 && new_height <= (tui_term_height () - 4)
1431 && new_height >= MIN_CMD_WIN_HEIGHT)
1432 || (primary_win_info->generic.type != CMD_WIN
1433 && new_height <= (tui_term_height () - 2)
1434 && new_height >= MIN_WIN_HEIGHT));
c906108c 1435 if (ok)
1cc6d956 1436 { /* Check the total height. */
5b6fe301 1437 struct tui_win_info *win_info;
c906108c 1438
6ba8e26f 1439 if (primary_win_info == TUI_CMD_WIN)
96c1eda2 1440 win_info = (tui_source_windows ())->list[0];
c906108c 1441 else
6d012f14 1442 win_info = TUI_CMD_WIN;
6ba8e26f 1443 ok = ((new_height +
6d012f14 1444 (win_info->generic.height + diff)) <= tui_term_height ());
c906108c
SS
1445 }
1446 }
1447 else
1448 {
6ba8e26f
AC
1449 int cur_total_height, total_height, min_height = 0;
1450 struct tui_win_info *first_win;
1451 struct tui_win_info *second_win;
c906108c 1452
6d012f14 1453 if (cur_layout == SRC_DISASSEM_COMMAND)
c906108c 1454 {
6ba8e26f
AC
1455 first_win = TUI_SRC_WIN;
1456 second_win = TUI_DISASM_WIN;
c906108c
SS
1457 }
1458 else
1459 {
6ba8e26f 1460 first_win = TUI_DATA_WIN;
96c1eda2 1461 second_win = (tui_source_windows ())->list[0];
c906108c 1462 }
ef5eab5a
MS
1463 /* We could simply add all the heights to obtain the same
1464 result but below is more explicit since we subtract 1 for
1465 the line that the first and second windows share, and add
1466 one for the locator. */
6ba8e26f
AC
1467 total_height = cur_total_height =
1468 (first_win->generic.height + second_win->generic.height - 1)
1cc6d956 1469 + TUI_CMD_WIN->generic.height + 1; /* Locator. */
6ba8e26f 1470 if (primary_win_info == TUI_CMD_WIN)
c906108c 1471 {
1cc6d956 1472 /* Locator included since first & second win share a line. */
6ba8e26f
AC
1473 ok = ((first_win->generic.height +
1474 second_win->generic.height + diff) >=
e5908723
MS
1475 (MIN_WIN_HEIGHT * 2)
1476 && new_height >= MIN_CMD_WIN_HEIGHT);
c906108c
SS
1477 if (ok)
1478 {
e5908723
MS
1479 total_height = new_height +
1480 (first_win->generic.height +
1481 second_win->generic.height + diff);
6ba8e26f 1482 min_height = MIN_CMD_WIN_HEIGHT;
c906108c
SS
1483 }
1484 }
1485 else
1486 {
6ba8e26f 1487 min_height = MIN_WIN_HEIGHT;
ef5eab5a
MS
1488
1489 /* First see if we can increase/decrease the command
1490 window. And make sure that the command window is at
1491 least 1 line. */
6d012f14 1492 ok = ((TUI_CMD_WIN->generic.height + diff) > 0);
c906108c 1493 if (!ok)
ef5eab5a
MS
1494 { /* Looks like we have to increase/decrease one of
1495 the other windows. */
6ba8e26f
AC
1496 if (primary_win_info == first_win)
1497 ok = (second_win->generic.height + diff) >= min_height;
c906108c 1498 else
6ba8e26f 1499 ok = (first_win->generic.height + diff) >= min_height;
c906108c
SS
1500 }
1501 if (ok)
1502 {
6ba8e26f
AC
1503 if (primary_win_info == first_win)
1504 total_height = new_height +
1505 second_win->generic.height +
6d012f14 1506 TUI_CMD_WIN->generic.height + diff;
c906108c 1507 else
6ba8e26f
AC
1508 total_height = new_height +
1509 first_win->generic.height +
6d012f14 1510 TUI_CMD_WIN->generic.height + diff;
c906108c
SS
1511 }
1512 }
ef5eab5a
MS
1513 /* Now make sure that the proposed total height doesn't
1514 exceed the old total height. */
c906108c 1515 if (ok)
e5908723
MS
1516 ok = (new_height >= min_height
1517 && total_height <= cur_total_height);
c906108c
SS
1518 }
1519 }
1520
1521 return ok;
6ba8e26f 1522}
c906108c
SS
1523
1524
c906108c 1525static void
08ef48c5
MS
1526parse_scrolling_args (char *arg,
1527 struct tui_win_info **win_to_scroll,
6ba8e26f 1528 int *num_to_scroll)
c906108c 1529{
6ba8e26f
AC
1530 if (num_to_scroll)
1531 *num_to_scroll = 0;
1532 *win_to_scroll = tui_win_with_focus ();
c906108c 1533
ef5eab5a
MS
1534 /* First set up the default window to scroll, in case there is no
1535 window name arg. */
c906108c
SS
1536 if (arg != (char *) NULL)
1537 {
6ba8e26f 1538 char *buf, *buf_ptr;
c906108c 1539
1cc6d956 1540 /* Process the number of lines to scroll. */
6ba8e26f
AC
1541 buf = buf_ptr = xstrdup (arg);
1542 if (isdigit (*buf_ptr))
c906108c 1543 {
6ba8e26f 1544 char *num_str;
c906108c 1545
6ba8e26f
AC
1546 num_str = buf_ptr;
1547 buf_ptr = strchr (buf_ptr, ' ');
1548 if (buf_ptr != (char *) NULL)
c906108c 1549 {
6ba8e26f
AC
1550 *buf_ptr = (char) 0;
1551 if (num_to_scroll)
1552 *num_to_scroll = atoi (num_str);
1553 buf_ptr++;
c906108c 1554 }
6ba8e26f
AC
1555 else if (num_to_scroll)
1556 *num_to_scroll = atoi (num_str);
c906108c
SS
1557 }
1558
1cc6d956 1559 /* Process the window name if one is specified. */
6ba8e26f 1560 if (buf_ptr != (char *) NULL)
c906108c
SS
1561 {
1562 char *wname;
1563 int i;
1564
6ba8e26f
AC
1565 if (*buf_ptr == ' ')
1566 while (*(++buf_ptr) == ' ')
c906108c
SS
1567 ;
1568
6ba8e26f
AC
1569 if (*buf_ptr != (char) 0)
1570 wname = buf_ptr;
a4b99e53
SC
1571 else
1572 wname = "?";
1573
1cc6d956 1574 /* Validate the window name. */
c906108c
SS
1575 for (i = 0; i < strlen (wname); i++)
1576 wname[i] = toupper (wname[i]);
6ba8e26f 1577 *win_to_scroll = tui_partial_win_by_name (wname);
c906108c 1578
e5908723
MS
1579 if (*win_to_scroll == (struct tui_win_info *) NULL
1580 || !(*win_to_scroll)->generic.is_visible)
ec502284 1581 error (_("Invalid window specified. \n\
8a3fe4f8 1582The window name specified must be valid and visible.\n"));
6ba8e26f 1583 else if (*win_to_scroll == TUI_CMD_WIN)
96c1eda2 1584 *win_to_scroll = (tui_source_windows ())->list[0];
c906108c 1585 }
22940a24 1586 xfree (buf);
c906108c 1587 }
6ba8e26f 1588}
This page took 1.184889 seconds and 4 git commands to generate.