AArch64: Implement choice between Cortex-A53 erratum workarounds. (PR ld/24373)
[deliverable/binutils-gdb.git] / gdb / tui / tui-layout.c
CommitLineData
f377b406 1/* TUI layout window management.
f33c6cbf 2
42a4f53d 3 Copyright (C) 1998-2019 Free Software Foundation, Inc.
f33c6cbf 4
f377b406 5 Contributed by Hewlett-Packard Company.
c906108c 6
f377b406
SC
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
f377b406
SC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
21
22#include "defs.h"
957b8b5a 23#include "arch-utils.h"
c906108c
SS
24#include "command.h"
25#include "symtab.h"
26#include "frame.h"
52575520 27#include "source.h"
84b1e7c7 28#include <ctype.h>
c906108c 29
d7b2e967
AC
30#include "tui/tui.h"
31#include "tui/tui-data.h"
32#include "tui/tui-windata.h"
33#include "tui/tui-wingeneral.h"
34#include "tui/tui-stack.h"
35#include "tui/tui-regs.h"
36#include "tui/tui-win.h"
37#include "tui/tui-winsource.h"
38#include "tui/tui-disasm.h"
2c0b251b 39#include "tui/tui-layout.h"
6a83354a 40#include "gdb_curses.h"
96ec9981 41
c906108c
SS
42/*******************************
43** Static Local Decls
44********************************/
6ba8e26f 45static void show_layout (enum tui_layout_type);
08ef48c5
MS
46static void init_gen_win_info (struct tui_gen_win_info *,
47 enum tui_win_type,
48 int, int, int, int);
49static void *init_and_make_win (void *, enum tui_win_type,
50 int, int, int, int, int);
6ba8e26f 51static void show_source_or_disasm_and_command (enum tui_layout_type);
08ef48c5
MS
52static void make_source_or_disasm_window (struct tui_win_info **,
53 enum tui_win_type,
54 int, int);
5b6fe301
MS
55static void make_command_window (struct tui_win_info **, int, int);
56static void make_source_window (struct tui_win_info **, int, int);
57static void make_disasm_window (struct tui_win_info **, int, int);
58static void make_data_window (struct tui_win_info **, int, int);
6ba8e26f
AC
59static void show_source_command (void);
60static void show_disasm_command (void);
61static void show_source_disasm_command (void);
62static void show_data (enum tui_layout_type);
63static enum tui_layout_type next_layout (void);
64static enum tui_layout_type prev_layout (void);
0b39b52e 65static void tui_layout_command (const char *, int);
13274fc3 66static void extract_display_start_addr (struct gdbarch **, CORE_ADDR *);
c906108c
SS
67
68
69/***************************************
70** DEFINITIONS
71***************************************/
72
73#define LAYOUT_USAGE "Usage: layout prev | next | <layout_name> \n"
74
c7037be1
SC
75/* Show the screen layout defined. */
76static void
6ba8e26f 77show_layout (enum tui_layout_type layout)
c906108c 78{
6ba8e26f 79 enum tui_layout_type cur_layout = tui_current_layout ();
c906108c 80
6ba8e26f 81 if (layout != cur_layout)
c906108c 82 {
ef5eab5a
MS
83 /* Since the new layout may cause changes in window size, we
84 should free the content and reallocate on next display of
85 source/asm. */
dd1abb8c
AC
86 tui_free_all_source_wins_content ();
87 tui_clear_source_windows ();
e5908723
MS
88 if (layout == SRC_DATA_COMMAND
89 || layout == DISASSEM_DATA_COMMAND)
c906108c 90 {
6ba8e26f 91 show_data (layout);
6d012f14 92 tui_refresh_all (tui_win_list);
c906108c
SS
93 }
94 else
95 {
1cc6d956 96 /* First make the current layout be invisible. */
ec7d9e56 97 tui_make_all_invisible ();
dd1abb8c 98 tui_make_invisible (tui_locator_win_info_ptr ());
c906108c
SS
99
100 switch (layout)
101 {
1cc6d956 102 /* Now show the new layout. */
c906108c 103 case SRC_COMMAND:
6ba8e26f 104 show_source_command ();
6d012f14 105 tui_add_to_source_windows (TUI_SRC_WIN);
c906108c
SS
106 break;
107 case DISASSEM_COMMAND:
6ba8e26f 108 show_disasm_command ();
6d012f14 109 tui_add_to_source_windows (TUI_DISASM_WIN);
c906108c
SS
110 break;
111 case SRC_DISASSEM_COMMAND:
6ba8e26f 112 show_source_disasm_command ();
6d012f14
AC
113 tui_add_to_source_windows (TUI_SRC_WIN);
114 tui_add_to_source_windows (TUI_DISASM_WIN);
c906108c
SS
115 break;
116 default:
117 break;
118 }
119 }
120 }
bc712bbf 121}
c906108c
SS
122
123
080ce8c0 124/* Function to set the layout to SRC_COMMAND, DISASSEM_COMMAND,
7bd0be3a 125 SRC_DISASSEM_COMMAND, SRC_DATA_COMMAND, or DISASSEM_DATA_COMMAND. */
080ce8c0 126enum tui_status
7bd0be3a 127tui_set_layout (enum tui_layout_type layout_type)
c906108c 128{
22940a24 129 enum tui_status status = TUI_SUCCESS;
c906108c 130
7bd0be3a 131 if (layout_type != UNDEFINED_LAYOUT)
c906108c 132 {
e5908723
MS
133 enum tui_layout_type cur_layout = tui_current_layout (),
134 new_layout = UNDEFINED_LAYOUT;
6ba8e26f 135 int regs_populate = FALSE;
13274fc3
UW
136 struct gdbarch *gdbarch;
137 CORE_ADDR addr;
5b6fe301
MS
138 struct tui_win_info *win_with_focus = tui_win_with_focus ();
139 struct tui_layout_def *layout_def = tui_layout_def ();
c906108c 140
13274fc3 141 extract_display_start_addr (&gdbarch, &addr);
c906108c 142
7bd0be3a 143 new_layout = layout_type;
c906108c 144
7bd0be3a
AB
145 regs_populate = (new_layout == SRC_DATA_COMMAND
146 || new_layout == DISASSEM_DATA_COMMAND);
147 if (new_layout != cur_layout)
c906108c 148 {
7bd0be3a 149 show_layout (new_layout);
ef5eab5a 150
7bd0be3a
AB
151 /* Now determine where focus should be. */
152 if (win_with_focus != TUI_CMD_WIN)
153 {
154 switch (new_layout)
c906108c 155 {
7bd0be3a
AB
156 case SRC_COMMAND:
157 tui_set_win_focus_to (TUI_SRC_WIN);
158 layout_def->display_mode = SRC_WIN;
159 layout_def->split = FALSE;
160 break;
161 case DISASSEM_COMMAND:
162 /* The previous layout was not showing code.
163 This can happen if there is no source
164 available:
165
166 1. if the source file is in another dir OR
167 2. if target was compiled without -g
168 We still want to show the assembly though! */
169
170 tui_get_begin_asm_address (&gdbarch, &addr);
171 tui_set_win_focus_to (TUI_DISASM_WIN);
172 layout_def->display_mode = DISASSEM_WIN;
173 layout_def->split = FALSE;
174 break;
175 case SRC_DISASSEM_COMMAND:
176 /* The previous layout was not showing code.
177 This can happen if there is no source
178 available:
179
180 1. if the source file is in another dir OR
181 2. if target was compiled without -g
182 We still want to show the assembly though! */
183
184 tui_get_begin_asm_address (&gdbarch, &addr);
185 if (win_with_focus == TUI_SRC_WIN)
186 tui_set_win_focus_to (TUI_SRC_WIN);
187 else
188 tui_set_win_focus_to (TUI_DISASM_WIN);
189 layout_def->split = TRUE;
190 break;
191 case SRC_DATA_COMMAND:
192 if (win_with_focus != TUI_DATA_WIN)
193 tui_set_win_focus_to (TUI_SRC_WIN);
194 else
195 tui_set_win_focus_to (TUI_DATA_WIN);
196 layout_def->display_mode = SRC_WIN;
197 layout_def->split = FALSE;
198 break;
199 case DISASSEM_DATA_COMMAND:
200 /* The previous layout was not showing code.
201 This can happen if there is no source
202 available:
203
204 1. if the source file is in another dir OR
205 2. if target was compiled without -g
206 We still want to show the assembly though! */
207
208 tui_get_begin_asm_address (&gdbarch, &addr);
209 if (win_with_focus != TUI_DATA_WIN)
210 tui_set_win_focus_to (TUI_DISASM_WIN);
211 else
212 tui_set_win_focus_to (TUI_DATA_WIN);
213 layout_def->display_mode = DISASSEM_WIN;
214 layout_def->split = FALSE;
215 break;
216 default:
217 break;
c906108c 218 }
c906108c 219 }
7bd0be3a
AB
220 /*
221 * Now update the window content.
222 */
223 if (!regs_populate
224 && (new_layout == SRC_DATA_COMMAND
225 || new_layout == DISASSEM_DATA_COMMAND))
226 tui_display_all_data ();
227
228 tui_update_source_windows_with_addr (gdbarch, addr);
229
6ba8e26f 230 if (regs_populate)
c906108c 231 {
7bd0be3a
AB
232 struct reggroup *group =
233 TUI_DATA_WIN->detail.data_display_info.current_group;
234 tui_show_registers (group);
c906108c
SS
235 }
236 }
237 }
238 else
239 status = TUI_FAILURE;
240
241 return status;
bc712bbf 242}
c906108c 243
080ce8c0
AC
244/* Add the specified window to the layout in a logical way. This
245 means setting up the most logical layout given the window to be
246 added. */
c906108c 247void
080ce8c0 248tui_add_win_to_layout (enum tui_win_type type)
c906108c 249{
6ba8e26f 250 enum tui_layout_type cur_layout = tui_current_layout ();
c906108c
SS
251
252 switch (type)
253 {
254 case SRC_WIN:
e5908723
MS
255 if (cur_layout != SRC_COMMAND
256 && cur_layout != SRC_DISASSEM_COMMAND
257 && cur_layout != SRC_DATA_COMMAND)
c906108c 258 {
dd1abb8c 259 tui_clear_source_windows_detail ();
6ba8e26f
AC
260 if (cur_layout == DISASSEM_DATA_COMMAND)
261 show_layout (SRC_DATA_COMMAND);
c906108c 262 else
6ba8e26f 263 show_layout (SRC_COMMAND);
c906108c
SS
264 }
265 break;
266 case DISASSEM_WIN:
e5908723
MS
267 if (cur_layout != DISASSEM_COMMAND
268 && cur_layout != SRC_DISASSEM_COMMAND
269 && cur_layout != DISASSEM_DATA_COMMAND)
c906108c 270 {
dd1abb8c 271 tui_clear_source_windows_detail ();
6ba8e26f
AC
272 if (cur_layout == SRC_DATA_COMMAND)
273 show_layout (DISASSEM_DATA_COMMAND);
c906108c 274 else
6ba8e26f 275 show_layout (DISASSEM_COMMAND);
c906108c
SS
276 }
277 break;
278 case DATA_WIN:
e5908723
MS
279 if (cur_layout != SRC_DATA_COMMAND
280 && cur_layout != DISASSEM_DATA_COMMAND)
c906108c 281 {
6ba8e26f
AC
282 if (cur_layout == DISASSEM_COMMAND)
283 show_layout (DISASSEM_DATA_COMMAND);
c906108c 284 else
6ba8e26f 285 show_layout (SRC_DATA_COMMAND);
c906108c
SS
286 }
287 break;
288 default:
289 break;
290 }
6ba8e26f 291}
c906108c
SS
292
293
6ba8e26f
AC
294/* Answer the height of a window. If it hasn't been created yet,
295 answer what the height of a window would be based upon its type and
296 the layout. */
c906108c 297int
08ef48c5
MS
298tui_default_win_height (enum tui_win_type type,
299 enum tui_layout_type layout)
c906108c
SS
300{
301 int h;
302
6d012f14
AC
303 if (tui_win_list[type] != (struct tui_win_info *) NULL)
304 h = tui_win_list[type]->generic.height;
c906108c
SS
305 else
306 {
307 switch (layout)
308 {
309 case SRC_COMMAND:
310 case DISASSEM_COMMAND:
6d012f14 311 if (TUI_CMD_WIN == NULL)
dd1abb8c 312 h = tui_term_height () / 2;
c906108c 313 else
6d012f14 314 h = tui_term_height () - TUI_CMD_WIN->generic.height;
c906108c
SS
315 break;
316 case SRC_DISASSEM_COMMAND:
317 case SRC_DATA_COMMAND:
318 case DISASSEM_DATA_COMMAND:
6d012f14 319 if (TUI_CMD_WIN == NULL)
dd1abb8c 320 h = tui_term_height () / 3;
c906108c 321 else
6d012f14 322 h = (tui_term_height () - TUI_CMD_WIN->generic.height) / 2;
c906108c
SS
323 break;
324 default:
325 h = 0;
326 break;
327 }
328 }
329
330 return h;
6ba8e26f 331}
c906108c
SS
332
333
080ce8c0
AC
334/* Answer the height of a window. If it hasn't been created yet,
335 answer what the height of a window would be based upon its type and
336 the layout. */
c906108c 337int
080ce8c0
AC
338tui_default_win_viewport_height (enum tui_win_type type,
339 enum tui_layout_type layout)
c906108c
SS
340{
341 int h;
342
6ba8e26f 343 h = tui_default_win_height (type, layout);
c906108c 344
6d012f14 345 if (tui_win_list[type] == TUI_CMD_WIN)
c906108c
SS
346 h -= 1;
347 else
348 h -= 2;
349
350 return h;
6ba8e26f 351}
c906108c 352
a0145030
AB
353/* Complete possible layout names. TEXT is the complete text entered so
354 far, WORD is the word currently being completed. */
355
eb3ff9a5 356static void
a0145030 357layout_completer (struct cmd_list_element *ignore,
eb3ff9a5 358 completion_tracker &tracker,
a0145030
AB
359 const char *text, const char *word)
360{
361 static const char *layout_names [] =
362 { "src", "asm", "split", "regs", "next", "prev", NULL };
363
eb3ff9a5 364 complete_on_enum (tracker, layout_names, text, word);
a0145030
AB
365}
366
6ba8e26f
AC
367/* Function to initialize gdb commands, for tui window layout
368 manipulation. */
2c0b251b 369
c906108c 370void
6ba8e26f 371_initialize_tui_layout (void)
c906108c 372{
a0145030
AB
373 struct cmd_list_element *cmd;
374
375 cmd = add_com ("layout", class_tui, tui_layout_command, _("\
1bedd215 376Change the layout of windows.\n\
bf212be1 377Usage: layout prev | next | LAYOUT-NAME\n\
c906108c
SS
378Layout names are:\n\
379 src : Displays source and command windows.\n\
380 asm : Displays disassembly and command windows.\n\
381 split : Displays source, disassembly and command windows.\n\
382 regs : Displays register window. If existing layout\n\
383 is source/command or assembly/command, the \n\
384 register window is displayed. If the\n\
385 source/assembly/command (split) is displayed, \n\
386 the register window is displayed with \n\
1bedd215 387 the window that has current logical focus.\n"));
a0145030 388 set_cmd_completer (cmd, layout_completer);
41783295 389}
c906108c
SS
390
391
392/*************************
393** STATIC LOCAL FUNCTIONS
394**************************/
395
396
7bd0be3a
AB
397/* Function to set the layout to SRC, ASM, SPLIT, NEXT, PREV, DATA, or
398 REGS. */
22940a24 399enum tui_status
7bd0be3a 400tui_set_layout_by_name (const char *layout_name)
c906108c 401{
22940a24 402 enum tui_status status = TUI_SUCCESS;
c906108c 403
63a33118 404 if (layout_name != NULL)
c906108c 405 {
d02c80cd 406 int i;
6ba8e26f 407 enum tui_layout_type new_layout = UNDEFINED_LAYOUT;
6ba8e26f 408 enum tui_layout_type cur_layout = tui_current_layout ();
c906108c 409
f71c8822
TT
410 std::string copy = layout_name;
411 for (i = 0; i < copy.size (); i++)
412 copy[i] = toupper (copy[i]);
413 const char *buf_ptr = copy.c_str ();
c906108c 414
1cc6d956 415 /* First check for ambiguous input. */
7bd0be3a 416 if (strlen (buf_ptr) <= 1 && *buf_ptr == 'S')
c906108c 417 {
8a3fe4f8 418 warning (_("Ambiguous command input."));
c906108c
SS
419 status = TUI_FAILURE;
420 }
421 else
422 {
6ba8e26f
AC
423 if (subset_compare (buf_ptr, "SRC"))
424 new_layout = SRC_COMMAND;
425 else if (subset_compare (buf_ptr, "ASM"))
426 new_layout = DISASSEM_COMMAND;
427 else if (subset_compare (buf_ptr, "SPLIT"))
428 new_layout = SRC_DISASSEM_COMMAND;
7bd0be3a 429 else if (subset_compare (buf_ptr, "REGS"))
c906108c 430 {
7bd0be3a 431 if (cur_layout == SRC_COMMAND
e5908723 432 || cur_layout == SRC_DATA_COMMAND)
6ba8e26f 433 new_layout = SRC_DATA_COMMAND;
c906108c 434 else
6ba8e26f 435 new_layout = DISASSEM_DATA_COMMAND;
c906108c 436 }
6ba8e26f
AC
437 else if (subset_compare (buf_ptr, "NEXT"))
438 new_layout = next_layout ();
439 else if (subset_compare (buf_ptr, "PREV"))
440 new_layout = prev_layout ();
c906108c
SS
441 else
442 status = TUI_FAILURE;
c906108c 443
880d1e40
AB
444 if (status == TUI_SUCCESS)
445 {
446 /* Make sure the curses mode is enabled. */
447 tui_enable ();
448 tui_set_layout (new_layout);
449 }
c906108c
SS
450 }
451 }
452 else
453 status = TUI_FAILURE;
454
455 return status;
e8b915dc 456}
c906108c
SS
457
458
13274fc3
UW
459static void
460extract_display_start_addr (struct gdbarch **gdbarch_p, CORE_ADDR *addr_p)
c906108c 461{
6ba8e26f 462 enum tui_layout_type cur_layout = tui_current_layout ();
957b8b5a 463 struct gdbarch *gdbarch = get_current_arch ();
c774cec6 464 CORE_ADDR addr;
84b1e7c7 465 CORE_ADDR pc;
52575520 466 struct symtab_and_line cursal = get_current_source_symtab_and_line ();
c906108c 467
6ba8e26f 468 switch (cur_layout)
c906108c
SS
469 {
470 case SRC_COMMAND:
471 case SRC_DATA_COMMAND:
13274fc3 472 gdbarch = TUI_SRC_WIN->detail.source_info.gdbarch;
52575520 473 find_line_pc (cursal.symtab,
362c05fe 474 TUI_SRC_WIN->detail.source_info.start_line_or_addr.u.line_no,
84b1e7c7 475 &pc);
c774cec6 476 addr = pc;
c906108c
SS
477 break;
478 case DISASSEM_COMMAND:
479 case SRC_DISASSEM_COMMAND:
480 case DISASSEM_DATA_COMMAND:
13274fc3 481 gdbarch = TUI_DISASM_WIN->detail.source_info.gdbarch;
362c05fe 482 addr = TUI_DISASM_WIN->detail.source_info.start_line_or_addr.u.addr;
c906108c
SS
483 break;
484 default:
c774cec6 485 addr = 0;
c906108c
SS
486 break;
487 }
488
13274fc3
UW
489 *gdbarch_p = gdbarch;
490 *addr_p = addr;
6ba8e26f 491}
c906108c
SS
492
493
c906108c 494static void
0b39b52e 495tui_layout_command (const char *arg, int from_tty)
c906108c 496{
19eb139b 497 /* Switch to the selected layout. */
7bd0be3a 498 if (tui_set_layout_by_name (arg) != TUI_SUCCESS)
8a3fe4f8 499 warning (_("Invalid layout specified.\n%s"), LAYOUT_USAGE);
e8b915dc 500}
c906108c 501
6ba8e26f 502/* Answer the previous layout to cycle to. */
2a8854a7 503static enum tui_layout_type
6ba8e26f 504next_layout (void)
c906108c 505{
570dc176 506 int new_layout;
c906108c 507
6ba8e26f
AC
508 new_layout = tui_current_layout ();
509 if (new_layout == UNDEFINED_LAYOUT)
510 new_layout = SRC_COMMAND;
c906108c
SS
511 else
512 {
6ba8e26f
AC
513 new_layout++;
514 if (new_layout == UNDEFINED_LAYOUT)
515 new_layout = SRC_COMMAND;
c906108c
SS
516 }
517
570dc176 518 return (enum tui_layout_type) new_layout;
6ba8e26f 519}
c906108c
SS
520
521
6ba8e26f 522/* Answer the next layout to cycle to. */
2a8854a7 523static enum tui_layout_type
6ba8e26f 524prev_layout (void)
c906108c 525{
570dc176 526 int new_layout;
c906108c 527
6ba8e26f
AC
528 new_layout = tui_current_layout ();
529 if (new_layout == SRC_COMMAND)
530 new_layout = DISASSEM_DATA_COMMAND;
c906108c
SS
531 else
532 {
6ba8e26f
AC
533 new_layout--;
534 if (new_layout == UNDEFINED_LAYOUT)
535 new_layout = DISASSEM_DATA_COMMAND;
c906108c
SS
536 }
537
570dc176 538 return (enum tui_layout_type) new_layout;
6ba8e26f 539}
c906108c
SS
540
541
542
c906108c 543static void
08ef48c5
MS
544make_command_window (struct tui_win_info **win_info_ptr,
545 int height, int origin_y)
c906108c 546{
19ba03f4
SM
547 *win_info_ptr
548 = (struct tui_win_info *) init_and_make_win (*win_info_ptr,
549 CMD_WIN,
550 height,
551 tui_term_width (),
552 0,
553 origin_y,
554 DONT_BOX_WINDOW);
c906108c 555
6ba8e26f
AC
556 (*win_info_ptr)->can_highlight = FALSE;
557}
c906108c
SS
558
559
ef5eab5a 560/* make_source_window().
c5aa993b 561 */
c906108c 562static void
08ef48c5
MS
563make_source_window (struct tui_win_info **win_info_ptr,
564 int height, int origin_y)
c906108c 565{
6ba8e26f 566 make_source_or_disasm_window (win_info_ptr, SRC_WIN, height, origin_y);
c906108c
SS
567
568 return;
6ba8e26f 569} /* make_source_window */
c906108c
SS
570
571
ef5eab5a 572/* make_disasm_window().
c5aa993b 573 */
c906108c 574static void
08ef48c5
MS
575make_disasm_window (struct tui_win_info **win_info_ptr,
576 int height, int origin_y)
c906108c 577{
6ba8e26f 578 make_source_or_disasm_window (win_info_ptr, DISASSEM_WIN, height, origin_y);
c906108c
SS
579
580 return;
6ba8e26f 581} /* make_disasm_window */
c906108c
SS
582
583
c906108c 584static void
08ef48c5
MS
585make_data_window (struct tui_win_info **win_info_ptr,
586 int height, int origin_y)
c906108c 587{
19ba03f4
SM
588 *win_info_ptr
589 = (struct tui_win_info *) init_and_make_win (*win_info_ptr,
590 DATA_WIN,
591 height,
592 tui_term_width (),
593 0,
594 origin_y,
595 BOX_WINDOW);
6ba8e26f 596}
c906108c
SS
597
598
599
6ba8e26f 600/* Show the Source/Command layout. */
c906108c 601static void
6ba8e26f 602show_source_command (void)
c906108c 603{
6ba8e26f
AC
604 show_source_or_disasm_and_command (SRC_COMMAND);
605}
c906108c
SS
606
607
6ba8e26f 608/* Show the Dissassem/Command layout. */
c906108c 609static void
6ba8e26f 610show_disasm_command (void)
c906108c 611{
6ba8e26f
AC
612 show_source_or_disasm_and_command (DISASSEM_COMMAND);
613}
c906108c
SS
614
615
6ba8e26f 616/* Show the Source/Disassem/Command layout. */
c906108c 617static void
6ba8e26f 618show_source_disasm_command (void)
c906108c 619{
dd1abb8c 620 if (tui_current_layout () != SRC_DISASSEM_COMMAND)
c906108c 621 {
6ba8e26f 622 int cmd_height, src_height, asm_height;
c906108c 623
6d012f14 624 if (TUI_CMD_WIN != NULL)
6ba8e26f 625 cmd_height = TUI_CMD_WIN->generic.height;
c906108c 626 else
6ba8e26f 627 cmd_height = tui_term_height () / 3;
c906108c 628
6ba8e26f
AC
629 src_height = (tui_term_height () - cmd_height) / 2;
630 asm_height = tui_term_height () - (src_height + cmd_height);
c906108c 631
6d012f14 632 if (TUI_SRC_WIN == NULL)
6ba8e26f 633 make_source_window (&TUI_SRC_WIN, src_height, 0);
c906108c
SS
634 else
635 {
6ba8e26f 636 init_gen_win_info (&TUI_SRC_WIN->generic,
08ef48c5
MS
637 TUI_SRC_WIN->generic.type,
638 src_height,
639 TUI_SRC_WIN->generic.width,
640 TUI_SRC_WIN->detail.source_info.execution_info->width,
641 0);
6d012f14 642 TUI_SRC_WIN->can_highlight = TRUE;
6ba8e26f 643 init_gen_win_info (TUI_SRC_WIN->detail.source_info.execution_info,
08ef48c5
MS
644 EXEC_INFO_WIN,
645 src_height,
646 3,
647 0,
648 0);
6d012f14
AC
649 tui_make_visible (&TUI_SRC_WIN->generic);
650 tui_make_visible (TUI_SRC_WIN->detail.source_info.execution_info);
651 TUI_SRC_WIN->detail.source_info.has_locator = FALSE;;
c906108c 652 }
6d012f14 653 if (TUI_SRC_WIN != NULL)
c906108c 654 {
5b6fe301 655 struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
c906108c 656
6d012f14
AC
657 tui_show_source_content (TUI_SRC_WIN);
658 if (TUI_DISASM_WIN == NULL)
c906108c 659 {
6ba8e26f 660 make_disasm_window (&TUI_DISASM_WIN, asm_height, src_height - 1);
19ba03f4
SM
661 locator
662 = ((struct tui_gen_win_info *)
663 init_and_make_win (locator,
664 LOCATOR_WIN,
665 2 /* 1 */ ,
666 tui_term_width (),
667 0,
668 (src_height + asm_height) - 1,
669 DONT_BOX_WINDOW));
c906108c
SS
670 }
671 else
672 {
6ba8e26f 673 init_gen_win_info (locator,
08ef48c5
MS
674 LOCATOR_WIN,
675 2 /* 1 */ ,
676 tui_term_width (),
677 0,
678 (src_height + asm_height) - 1);
6d012f14 679 TUI_DISASM_WIN->detail.source_info.has_locator = TRUE;
08ef48c5
MS
680 init_gen_win_info (&TUI_DISASM_WIN->generic,
681 TUI_DISASM_WIN->generic.type,
682 asm_height,
683 TUI_DISASM_WIN->generic.width,
684 TUI_DISASM_WIN->detail.source_info.execution_info->width,
685 src_height - 1);
6ba8e26f 686 init_gen_win_info (TUI_DISASM_WIN->detail.source_info.execution_info,
08ef48c5
MS
687 EXEC_INFO_WIN,
688 asm_height,
689 3,
690 0,
691 src_height - 1);
6d012f14
AC
692 TUI_DISASM_WIN->can_highlight = TRUE;
693 tui_make_visible (&TUI_DISASM_WIN->generic);
694 tui_make_visible (TUI_DISASM_WIN->detail.source_info.execution_info);
c906108c 695 }
6d012f14 696 if (TUI_DISASM_WIN != NULL)
c906108c 697 {
6d012f14
AC
698 TUI_SRC_WIN->detail.source_info.has_locator = FALSE;
699 TUI_DISASM_WIN->detail.source_info.has_locator = TRUE;
ec7d9e56 700 tui_make_visible (locator);
47d3492a 701 tui_show_locator_content ();
6d012f14 702 tui_show_source_content (TUI_DISASM_WIN);
c906108c 703
6d012f14 704 if (TUI_CMD_WIN == NULL)
6ba8e26f 705 make_command_window (&TUI_CMD_WIN,
08ef48c5
MS
706 cmd_height,
707 tui_term_height () - cmd_height);
c906108c
SS
708 else
709 {
6ba8e26f 710 init_gen_win_info (&TUI_CMD_WIN->generic,
08ef48c5
MS
711 TUI_CMD_WIN->generic.type,
712 TUI_CMD_WIN->generic.height,
713 TUI_CMD_WIN->generic.width,
714 0,
715 TUI_CMD_WIN->generic.origin.y);
6d012f14
AC
716 TUI_CMD_WIN->can_highlight = FALSE;
717 tui_make_visible (&TUI_CMD_WIN->generic);
c906108c 718 }
6d012f14
AC
719 if (TUI_CMD_WIN != NULL)
720 tui_refresh_win (&TUI_CMD_WIN->generic);
c906108c
SS
721 }
722 }
dd1abb8c 723 tui_set_current_layout_to (SRC_DISASSEM_COMMAND);
c906108c 724 }
6ba8e26f 725}
c906108c
SS
726
727
6ba8e26f
AC
728/* Show the Source/Data/Command or the Dissassembly/Data/Command
729 layout. */
c906108c 730static void
6ba8e26f 731show_data (enum tui_layout_type new_layout)
c906108c 732{
6ba8e26f
AC
733 int total_height = (tui_term_height () - TUI_CMD_WIN->generic.height);
734 int src_height, data_height;
735 enum tui_win_type win_type;
5b6fe301 736 struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
c906108c
SS
737
738
6ba8e26f
AC
739 data_height = total_height / 2;
740 src_height = total_height - data_height;
ec7d9e56
AC
741 tui_make_all_invisible ();
742 tui_make_invisible (locator);
6ba8e26f 743 make_data_window (&TUI_DATA_WIN, data_height, 0);
6d012f14 744 TUI_DATA_WIN->can_highlight = TRUE;
6ba8e26f
AC
745 if (new_layout == SRC_DATA_COMMAND)
746 win_type = SRC_WIN;
c906108c 747 else
6ba8e26f
AC
748 win_type = DISASSEM_WIN;
749 if (tui_win_list[win_type] == NULL)
c906108c 750 {
6ba8e26f
AC
751 if (win_type == SRC_WIN)
752 make_source_window (&tui_win_list[win_type], src_height, data_height - 1);
c906108c 753 else
6ba8e26f 754 make_disasm_window (&tui_win_list[win_type], src_height, data_height - 1);
19ba03f4
SM
755 locator
756 = ((struct tui_gen_win_info *)
757 init_and_make_win (locator,
758 LOCATOR_WIN,
759 2 /* 1 */ ,
760 tui_term_width (),
761 0,
762 total_height - 1,
763 DONT_BOX_WINDOW));
c906108c
SS
764 }
765 else
766 {
6ba8e26f 767 init_gen_win_info (&tui_win_list[win_type]->generic,
08ef48c5
MS
768 tui_win_list[win_type]->generic.type,
769 src_height,
770 tui_win_list[win_type]->generic.width,
771 tui_win_list[win_type]->detail.source_info.execution_info->width,
772 data_height - 1);
6ba8e26f 773 init_gen_win_info (tui_win_list[win_type]->detail.source_info.execution_info,
08ef48c5
MS
774 EXEC_INFO_WIN,
775 src_height,
776 3,
777 0,
778 data_height - 1);
6ba8e26f
AC
779 tui_make_visible (&tui_win_list[win_type]->generic);
780 tui_make_visible (tui_win_list[win_type]->detail.source_info.execution_info);
781 init_gen_win_info (locator,
08ef48c5
MS
782 LOCATOR_WIN,
783 2 /* 1 */ ,
784 tui_term_width (),
785 0,
786 total_height - 1);
c906108c 787 }
6ba8e26f 788 tui_win_list[win_type]->detail.source_info.has_locator = TRUE;
ec7d9e56 789 tui_make_visible (locator);
47d3492a 790 tui_show_locator_content ();
6ba8e26f
AC
791 tui_add_to_source_windows (tui_win_list[win_type]);
792 tui_set_current_layout_to (new_layout);
793}
c906108c 794
ef5eab5a 795/* init_gen_win_info().
c5aa993b 796 */
c906108c 797static void
08ef48c5
MS
798init_gen_win_info (struct tui_gen_win_info *win_info,
799 enum tui_win_type type,
800 int height, int width,
801 int origin_x, int origin_y)
c906108c
SS
802{
803 int h = height;
804
6ba8e26f
AC
805 win_info->type = type;
806 win_info->width = width;
807 win_info->height = h;
c906108c
SS
808 if (h > 1)
809 {
6ba8e26f
AC
810 win_info->viewport_height = h - 1;
811 if (win_info->type != CMD_WIN)
812 win_info->viewport_height--;
c906108c
SS
813 }
814 else
6ba8e26f
AC
815 win_info->viewport_height = 1;
816 win_info->origin.x = origin_x;
817 win_info->origin.y = origin_y;
c906108c
SS
818
819 return;
6ba8e26f 820} /* init_gen_win_info */
c906108c 821
ef5eab5a 822/* init_and_make_win().
c5aa993b 823 */
d5d6fca5 824static void *
08ef48c5
MS
825init_and_make_win (void *opaque_win_info,
826 enum tui_win_type win_type,
827 int height, int width,
828 int origin_x, int origin_y,
d5d6fca5 829 int box_it)
c906108c 830{
5b6fe301 831 struct tui_gen_win_info *generic;
c906108c 832
6ba8e26f 833 if (opaque_win_info == NULL)
c906108c 834 {
6ba8e26f
AC
835 if (tui_win_is_auxillary (win_type))
836 opaque_win_info = (void *) tui_alloc_generic_win_info ();
c906108c 837 else
6ba8e26f 838 opaque_win_info = (void *) tui_alloc_win_info (win_type);
c906108c 839 }
6ba8e26f
AC
840 if (tui_win_is_auxillary (win_type))
841 generic = (struct tui_gen_win_info *) opaque_win_info;
c906108c 842 else
6ba8e26f 843 generic = &((struct tui_win_info *) opaque_win_info)->generic;
c906108c 844
6ba8e26f 845 if (opaque_win_info != NULL)
c906108c 846 {
6ba8e26f
AC
847 init_gen_win_info (generic, win_type, height, width, origin_x, origin_y);
848 if (!tui_win_is_auxillary (win_type))
c906108c
SS
849 {
850 if (generic->type == CMD_WIN)
6ba8e26f 851 ((struct tui_win_info *) opaque_win_info)->can_highlight = FALSE;
c906108c 852 else
6ba8e26f 853 ((struct tui_win_info *) opaque_win_info)->can_highlight = TRUE;
c906108c 854 }
6ba8e26f 855 tui_make_window (generic, box_it);
c906108c 856 }
d5d6fca5 857 return opaque_win_info;
bc712bbf 858}
c906108c
SS
859
860
c906108c 861static void
08ef48c5
MS
862make_source_or_disasm_window (struct tui_win_info **win_info_ptr,
863 enum tui_win_type type,
864 int height, int origin_y)
c906108c 865{
e65b5245 866 struct tui_gen_win_info *execution_info = NULL;
c906108c 867
ef5eab5a 868 /* Create the exeuction info window. */
c906108c 869 if (type == SRC_WIN)
6d012f14 870 execution_info = tui_source_exec_info_win_ptr ();
c906108c 871 else
6d012f14 872 execution_info = tui_disassem_exec_info_win_ptr ();
19ba03f4
SM
873 execution_info
874 = ((struct tui_gen_win_info *)
875 init_and_make_win (execution_info,
876 EXEC_INFO_WIN,
877 height,
878 3,
879 0,
880 origin_y,
881 DONT_BOX_WINDOW));
ef5eab5a
MS
882
883 /* Now create the source window. */
19ba03f4
SM
884 *win_info_ptr
885 = ((struct tui_win_info *)
886 init_and_make_win (*win_info_ptr,
887 type,
888 height,
889 tui_term_width () - execution_info->width,
890 execution_info->width,
891 origin_y,
892 BOX_WINDOW));
c906108c 893
6ba8e26f
AC
894 (*win_info_ptr)->detail.source_info.execution_info = execution_info;
895}
c906108c
SS
896
897
1cc6d956 898/* Show the Source/Command or the Disassem layout. */
c906108c 899static void
6ba8e26f 900show_source_or_disasm_and_command (enum tui_layout_type layout_type)
c906108c 901{
6ba8e26f 902 if (tui_current_layout () != layout_type)
c906108c 903 {
5b6fe301 904 struct tui_win_info **win_info_ptr;
6ba8e26f 905 int src_height, cmd_height;
5b6fe301 906 struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
c906108c 907
6d012f14 908 if (TUI_CMD_WIN != NULL)
6ba8e26f 909 cmd_height = TUI_CMD_WIN->generic.height;
c906108c 910 else
6ba8e26f
AC
911 cmd_height = tui_term_height () / 3;
912 src_height = tui_term_height () - cmd_height;
c906108c 913
6ba8e26f
AC
914 if (layout_type == SRC_COMMAND)
915 win_info_ptr = &TUI_SRC_WIN;
c906108c 916 else
6ba8e26f 917 win_info_ptr = &TUI_DISASM_WIN;
c906108c 918
6ba8e26f 919 if ((*win_info_ptr) == NULL)
c906108c 920 {
6ba8e26f
AC
921 if (layout_type == SRC_COMMAND)
922 make_source_window (win_info_ptr, src_height - 1, 0);
c906108c 923 else
6ba8e26f 924 make_disasm_window (win_info_ptr, src_height - 1, 0);
19ba03f4
SM
925 locator
926 = ((struct tui_gen_win_info *)
927 init_and_make_win (locator,
928 LOCATOR_WIN,
929 2 /* 1 */ ,
930 tui_term_width (),
931 0,
932 src_height - 1,
933 DONT_BOX_WINDOW));
c906108c
SS
934 }
935 else
936 {
6ba8e26f 937 init_gen_win_info (locator,
08ef48c5
MS
938 LOCATOR_WIN,
939 2 /* 1 */ ,
940 tui_term_width (),
941 0,
942 src_height - 1);
6ba8e26f 943 (*win_info_ptr)->detail.source_info.has_locator = TRUE;
08ef48c5
MS
944 init_gen_win_info (&(*win_info_ptr)->generic,
945 (*win_info_ptr)->generic.type,
946 src_height - 1,
947 (*win_info_ptr)->generic.width,
948 (*win_info_ptr)->detail.source_info.execution_info->width,
949 0);
6ba8e26f 950 init_gen_win_info ((*win_info_ptr)->detail.source_info.execution_info,
08ef48c5
MS
951 EXEC_INFO_WIN,
952 src_height - 1,
953 3,
954 0,
955 0);
6ba8e26f
AC
956 (*win_info_ptr)->can_highlight = TRUE;
957 tui_make_visible (&(*win_info_ptr)->generic);
958 tui_make_visible ((*win_info_ptr)->detail.source_info.execution_info);
c906108c 959 }
6ba8e26f 960 if ((*win_info_ptr) != NULL)
c906108c 961 {
6ba8e26f 962 (*win_info_ptr)->detail.source_info.has_locator = TRUE;
ec7d9e56 963 tui_make_visible (locator);
47d3492a 964 tui_show_locator_content ();
6ba8e26f 965 tui_show_source_content (*win_info_ptr);
c906108c 966
6d012f14 967 if (TUI_CMD_WIN == NULL)
c906108c 968 {
6ba8e26f 969 make_command_window (&TUI_CMD_WIN, cmd_height, src_height);
6d012f14 970 tui_refresh_win (&TUI_CMD_WIN->generic);
c906108c
SS
971 }
972 else
973 {
6ba8e26f 974 init_gen_win_info (&TUI_CMD_WIN->generic,
08ef48c5
MS
975 TUI_CMD_WIN->generic.type,
976 TUI_CMD_WIN->generic.height,
977 TUI_CMD_WIN->generic.width,
978 TUI_CMD_WIN->generic.origin.x,
979 TUI_CMD_WIN->generic.origin.y);
6d012f14
AC
980 TUI_CMD_WIN->can_highlight = FALSE;
981 tui_make_visible (&TUI_CMD_WIN->generic);
c906108c
SS
982 }
983 }
6ba8e26f 984 tui_set_current_layout_to (layout_type);
c906108c 985 }
6ba8e26f 986}
This page took 3.569604 seconds and 4 git commands to generate.