Adjust Value.location for lval_register
[deliverable/binutils-gdb.git] / gdb / tui / tui-layout.c
CommitLineData
f377b406 1/* TUI layout window management.
f33c6cbf 2
618f726f 3 Copyright (C) 1998-2016 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);
65static void tui_layout_command (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
356static VEC (char_ptr) *
357layout_completer (struct cmd_list_element *ignore,
358 const char *text, const char *word)
359{
360 static const char *layout_names [] =
361 { "src", "asm", "split", "regs", "next", "prev", NULL };
362
363 return complete_on_enum (layout_names, text, word);
364}
365
6ba8e26f
AC
366/* Function to initialize gdb commands, for tui window layout
367 manipulation. */
2c0b251b
PA
368
369/* Provide a prototype to silence -Wmissing-prototypes. */
370extern initialize_file_ftype _initialize_tui_layout;
371
c906108c 372void
6ba8e26f 373_initialize_tui_layout (void)
c906108c 374{
a0145030
AB
375 struct cmd_list_element *cmd;
376
377 cmd = add_com ("layout", class_tui, tui_layout_command, _("\
1bedd215 378Change the layout of windows.\n\
c906108c
SS
379Usage: layout prev | next | <layout_name> \n\
380Layout names are:\n\
381 src : Displays source and command windows.\n\
382 asm : Displays disassembly and command windows.\n\
383 split : Displays source, disassembly and command windows.\n\
384 regs : Displays register window. If existing layout\n\
385 is source/command or assembly/command, the \n\
386 register window is displayed. If the\n\
387 source/assembly/command (split) is displayed, \n\
388 the register window is displayed with \n\
1bedd215 389 the window that has current logical focus.\n"));
a0145030 390 set_cmd_completer (cmd, layout_completer);
41783295 391}
c906108c
SS
392
393
394/*************************
395** STATIC LOCAL FUNCTIONS
396**************************/
397
398
7bd0be3a
AB
399/* Function to set the layout to SRC, ASM, SPLIT, NEXT, PREV, DATA, or
400 REGS. */
22940a24 401enum tui_status
7bd0be3a 402tui_set_layout_by_name (const char *layout_name)
c906108c 403{
22940a24 404 enum tui_status status = TUI_SUCCESS;
c906108c 405
6ba8e26f 406 if (layout_name != (char *) NULL)
c906108c 407 {
d02c80cd
AC
408 int i;
409 char *buf_ptr;
6ba8e26f 410 enum tui_layout_type new_layout = UNDEFINED_LAYOUT;
6ba8e26f 411 enum tui_layout_type cur_layout = tui_current_layout ();
c1b009ee 412 struct cleanup *old_chain;
c906108c 413
6ba8e26f
AC
414 buf_ptr = (char *) xstrdup (layout_name);
415 for (i = 0; (i < strlen (layout_name)); i++)
416 buf_ptr[i] = toupper (buf_ptr[i]);
c1b009ee 417 old_chain = make_cleanup (xfree, buf_ptr);
c906108c 418
1cc6d956 419 /* First check for ambiguous input. */
7bd0be3a 420 if (strlen (buf_ptr) <= 1 && *buf_ptr == 'S')
c906108c 421 {
8a3fe4f8 422 warning (_("Ambiguous command input."));
c906108c
SS
423 status = TUI_FAILURE;
424 }
425 else
426 {
6ba8e26f
AC
427 if (subset_compare (buf_ptr, "SRC"))
428 new_layout = SRC_COMMAND;
429 else if (subset_compare (buf_ptr, "ASM"))
430 new_layout = DISASSEM_COMMAND;
431 else if (subset_compare (buf_ptr, "SPLIT"))
432 new_layout = SRC_DISASSEM_COMMAND;
7bd0be3a 433 else if (subset_compare (buf_ptr, "REGS"))
c906108c 434 {
7bd0be3a 435 if (cur_layout == SRC_COMMAND
e5908723 436 || cur_layout == SRC_DATA_COMMAND)
6ba8e26f 437 new_layout = SRC_DATA_COMMAND;
c906108c 438 else
6ba8e26f 439 new_layout = DISASSEM_DATA_COMMAND;
c906108c 440 }
6ba8e26f
AC
441 else if (subset_compare (buf_ptr, "NEXT"))
442 new_layout = next_layout ();
443 else if (subset_compare (buf_ptr, "PREV"))
444 new_layout = prev_layout ();
c906108c
SS
445 else
446 status = TUI_FAILURE;
c906108c 447
880d1e40
AB
448 if (status == TUI_SUCCESS)
449 {
450 /* Make sure the curses mode is enabled. */
451 tui_enable ();
452 tui_set_layout (new_layout);
453 }
c906108c 454 }
c1b009ee 455 do_cleanups (old_chain);
c906108c
SS
456 }
457 else
458 status = TUI_FAILURE;
459
460 return status;
e8b915dc 461}
c906108c
SS
462
463
13274fc3
UW
464static void
465extract_display_start_addr (struct gdbarch **gdbarch_p, CORE_ADDR *addr_p)
c906108c 466{
6ba8e26f 467 enum tui_layout_type cur_layout = tui_current_layout ();
957b8b5a 468 struct gdbarch *gdbarch = get_current_arch ();
c774cec6 469 CORE_ADDR addr;
84b1e7c7 470 CORE_ADDR pc;
52575520 471 struct symtab_and_line cursal = get_current_source_symtab_and_line ();
c906108c 472
6ba8e26f 473 switch (cur_layout)
c906108c
SS
474 {
475 case SRC_COMMAND:
476 case SRC_DATA_COMMAND:
13274fc3 477 gdbarch = TUI_SRC_WIN->detail.source_info.gdbarch;
52575520 478 find_line_pc (cursal.symtab,
362c05fe 479 TUI_SRC_WIN->detail.source_info.start_line_or_addr.u.line_no,
84b1e7c7 480 &pc);
c774cec6 481 addr = pc;
c906108c
SS
482 break;
483 case DISASSEM_COMMAND:
484 case SRC_DISASSEM_COMMAND:
485 case DISASSEM_DATA_COMMAND:
13274fc3 486 gdbarch = TUI_DISASM_WIN->detail.source_info.gdbarch;
362c05fe 487 addr = TUI_DISASM_WIN->detail.source_info.start_line_or_addr.u.addr;
c906108c
SS
488 break;
489 default:
c774cec6 490 addr = 0;
c906108c
SS
491 break;
492 }
493
13274fc3
UW
494 *gdbarch_p = gdbarch;
495 *addr_p = addr;
6ba8e26f 496}
c906108c
SS
497
498
c906108c 499static void
6ba8e26f 500tui_layout_command (char *arg, int from_tty)
c906108c 501{
19eb139b 502 /* Switch to the selected layout. */
7bd0be3a 503 if (tui_set_layout_by_name (arg) != TUI_SUCCESS)
8a3fe4f8 504 warning (_("Invalid layout specified.\n%s"), LAYOUT_USAGE);
c906108c 505
e8b915dc 506}
c906108c 507
6ba8e26f 508/* Answer the previous layout to cycle to. */
2a8854a7 509static enum tui_layout_type
6ba8e26f 510next_layout (void)
c906108c 511{
570dc176 512 int new_layout;
c906108c 513
6ba8e26f
AC
514 new_layout = tui_current_layout ();
515 if (new_layout == UNDEFINED_LAYOUT)
516 new_layout = SRC_COMMAND;
c906108c
SS
517 else
518 {
6ba8e26f
AC
519 new_layout++;
520 if (new_layout == UNDEFINED_LAYOUT)
521 new_layout = SRC_COMMAND;
c906108c
SS
522 }
523
570dc176 524 return (enum tui_layout_type) new_layout;
6ba8e26f 525}
c906108c
SS
526
527
6ba8e26f 528/* Answer the next layout to cycle to. */
2a8854a7 529static enum tui_layout_type
6ba8e26f 530prev_layout (void)
c906108c 531{
570dc176 532 int new_layout;
c906108c 533
6ba8e26f
AC
534 new_layout = tui_current_layout ();
535 if (new_layout == SRC_COMMAND)
536 new_layout = DISASSEM_DATA_COMMAND;
c906108c
SS
537 else
538 {
6ba8e26f
AC
539 new_layout--;
540 if (new_layout == UNDEFINED_LAYOUT)
541 new_layout = DISASSEM_DATA_COMMAND;
c906108c
SS
542 }
543
570dc176 544 return (enum tui_layout_type) new_layout;
6ba8e26f 545}
c906108c
SS
546
547
548
c906108c 549static void
08ef48c5
MS
550make_command_window (struct tui_win_info **win_info_ptr,
551 int height, int origin_y)
c906108c 552{
19ba03f4
SM
553 *win_info_ptr
554 = (struct tui_win_info *) init_and_make_win (*win_info_ptr,
555 CMD_WIN,
556 height,
557 tui_term_width (),
558 0,
559 origin_y,
560 DONT_BOX_WINDOW);
c906108c 561
6ba8e26f
AC
562 (*win_info_ptr)->can_highlight = FALSE;
563}
c906108c
SS
564
565
ef5eab5a 566/* make_source_window().
c5aa993b 567 */
c906108c 568static void
08ef48c5
MS
569make_source_window (struct tui_win_info **win_info_ptr,
570 int height, int origin_y)
c906108c 571{
6ba8e26f 572 make_source_or_disasm_window (win_info_ptr, SRC_WIN, height, origin_y);
c906108c
SS
573
574 return;
6ba8e26f 575} /* make_source_window */
c906108c
SS
576
577
ef5eab5a 578/* make_disasm_window().
c5aa993b 579 */
c906108c 580static void
08ef48c5
MS
581make_disasm_window (struct tui_win_info **win_info_ptr,
582 int height, int origin_y)
c906108c 583{
6ba8e26f 584 make_source_or_disasm_window (win_info_ptr, DISASSEM_WIN, height, origin_y);
c906108c
SS
585
586 return;
6ba8e26f 587} /* make_disasm_window */
c906108c
SS
588
589
c906108c 590static void
08ef48c5
MS
591make_data_window (struct tui_win_info **win_info_ptr,
592 int height, int origin_y)
c906108c 593{
19ba03f4
SM
594 *win_info_ptr
595 = (struct tui_win_info *) init_and_make_win (*win_info_ptr,
596 DATA_WIN,
597 height,
598 tui_term_width (),
599 0,
600 origin_y,
601 BOX_WINDOW);
6ba8e26f 602}
c906108c
SS
603
604
605
6ba8e26f 606/* Show the Source/Command layout. */
c906108c 607static void
6ba8e26f 608show_source_command (void)
c906108c 609{
6ba8e26f
AC
610 show_source_or_disasm_and_command (SRC_COMMAND);
611}
c906108c
SS
612
613
6ba8e26f 614/* Show the Dissassem/Command layout. */
c906108c 615static void
6ba8e26f 616show_disasm_command (void)
c906108c 617{
6ba8e26f
AC
618 show_source_or_disasm_and_command (DISASSEM_COMMAND);
619}
c906108c
SS
620
621
6ba8e26f 622/* Show the Source/Disassem/Command layout. */
c906108c 623static void
6ba8e26f 624show_source_disasm_command (void)
c906108c 625{
dd1abb8c 626 if (tui_current_layout () != SRC_DISASSEM_COMMAND)
c906108c 627 {
6ba8e26f 628 int cmd_height, src_height, asm_height;
c906108c 629
6d012f14 630 if (TUI_CMD_WIN != NULL)
6ba8e26f 631 cmd_height = TUI_CMD_WIN->generic.height;
c906108c 632 else
6ba8e26f 633 cmd_height = tui_term_height () / 3;
c906108c 634
6ba8e26f
AC
635 src_height = (tui_term_height () - cmd_height) / 2;
636 asm_height = tui_term_height () - (src_height + cmd_height);
c906108c 637
6d012f14 638 if (TUI_SRC_WIN == NULL)
6ba8e26f 639 make_source_window (&TUI_SRC_WIN, src_height, 0);
c906108c
SS
640 else
641 {
6ba8e26f 642 init_gen_win_info (&TUI_SRC_WIN->generic,
08ef48c5
MS
643 TUI_SRC_WIN->generic.type,
644 src_height,
645 TUI_SRC_WIN->generic.width,
646 TUI_SRC_WIN->detail.source_info.execution_info->width,
647 0);
6d012f14 648 TUI_SRC_WIN->can_highlight = TRUE;
6ba8e26f 649 init_gen_win_info (TUI_SRC_WIN->detail.source_info.execution_info,
08ef48c5
MS
650 EXEC_INFO_WIN,
651 src_height,
652 3,
653 0,
654 0);
6d012f14
AC
655 tui_make_visible (&TUI_SRC_WIN->generic);
656 tui_make_visible (TUI_SRC_WIN->detail.source_info.execution_info);
657 TUI_SRC_WIN->detail.source_info.has_locator = FALSE;;
c906108c 658 }
6d012f14 659 if (TUI_SRC_WIN != NULL)
c906108c 660 {
5b6fe301 661 struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
c906108c 662
6d012f14
AC
663 tui_show_source_content (TUI_SRC_WIN);
664 if (TUI_DISASM_WIN == NULL)
c906108c 665 {
6ba8e26f 666 make_disasm_window (&TUI_DISASM_WIN, asm_height, src_height - 1);
19ba03f4
SM
667 locator
668 = ((struct tui_gen_win_info *)
669 init_and_make_win (locator,
670 LOCATOR_WIN,
671 2 /* 1 */ ,
672 tui_term_width (),
673 0,
674 (src_height + asm_height) - 1,
675 DONT_BOX_WINDOW));
c906108c
SS
676 }
677 else
678 {
6ba8e26f 679 init_gen_win_info (locator,
08ef48c5
MS
680 LOCATOR_WIN,
681 2 /* 1 */ ,
682 tui_term_width (),
683 0,
684 (src_height + asm_height) - 1);
6d012f14 685 TUI_DISASM_WIN->detail.source_info.has_locator = TRUE;
08ef48c5
MS
686 init_gen_win_info (&TUI_DISASM_WIN->generic,
687 TUI_DISASM_WIN->generic.type,
688 asm_height,
689 TUI_DISASM_WIN->generic.width,
690 TUI_DISASM_WIN->detail.source_info.execution_info->width,
691 src_height - 1);
6ba8e26f 692 init_gen_win_info (TUI_DISASM_WIN->detail.source_info.execution_info,
08ef48c5
MS
693 EXEC_INFO_WIN,
694 asm_height,
695 3,
696 0,
697 src_height - 1);
6d012f14
AC
698 TUI_DISASM_WIN->can_highlight = TRUE;
699 tui_make_visible (&TUI_DISASM_WIN->generic);
700 tui_make_visible (TUI_DISASM_WIN->detail.source_info.execution_info);
c906108c 701 }
6d012f14 702 if (TUI_DISASM_WIN != NULL)
c906108c 703 {
6d012f14
AC
704 TUI_SRC_WIN->detail.source_info.has_locator = FALSE;
705 TUI_DISASM_WIN->detail.source_info.has_locator = TRUE;
ec7d9e56 706 tui_make_visible (locator);
47d3492a 707 tui_show_locator_content ();
6d012f14 708 tui_show_source_content (TUI_DISASM_WIN);
c906108c 709
6d012f14 710 if (TUI_CMD_WIN == NULL)
6ba8e26f 711 make_command_window (&TUI_CMD_WIN,
08ef48c5
MS
712 cmd_height,
713 tui_term_height () - cmd_height);
c906108c
SS
714 else
715 {
6ba8e26f 716 init_gen_win_info (&TUI_CMD_WIN->generic,
08ef48c5
MS
717 TUI_CMD_WIN->generic.type,
718 TUI_CMD_WIN->generic.height,
719 TUI_CMD_WIN->generic.width,
720 0,
721 TUI_CMD_WIN->generic.origin.y);
6d012f14
AC
722 TUI_CMD_WIN->can_highlight = FALSE;
723 tui_make_visible (&TUI_CMD_WIN->generic);
c906108c 724 }
6d012f14
AC
725 if (TUI_CMD_WIN != NULL)
726 tui_refresh_win (&TUI_CMD_WIN->generic);
c906108c
SS
727 }
728 }
dd1abb8c 729 tui_set_current_layout_to (SRC_DISASSEM_COMMAND);
c906108c 730 }
6ba8e26f 731}
c906108c
SS
732
733
6ba8e26f
AC
734/* Show the Source/Data/Command or the Dissassembly/Data/Command
735 layout. */
c906108c 736static void
6ba8e26f 737show_data (enum tui_layout_type new_layout)
c906108c 738{
6ba8e26f
AC
739 int total_height = (tui_term_height () - TUI_CMD_WIN->generic.height);
740 int src_height, data_height;
741 enum tui_win_type win_type;
5b6fe301 742 struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
c906108c
SS
743
744
6ba8e26f
AC
745 data_height = total_height / 2;
746 src_height = total_height - data_height;
ec7d9e56
AC
747 tui_make_all_invisible ();
748 tui_make_invisible (locator);
6ba8e26f 749 make_data_window (&TUI_DATA_WIN, data_height, 0);
6d012f14 750 TUI_DATA_WIN->can_highlight = TRUE;
6ba8e26f
AC
751 if (new_layout == SRC_DATA_COMMAND)
752 win_type = SRC_WIN;
c906108c 753 else
6ba8e26f
AC
754 win_type = DISASSEM_WIN;
755 if (tui_win_list[win_type] == NULL)
c906108c 756 {
6ba8e26f
AC
757 if (win_type == SRC_WIN)
758 make_source_window (&tui_win_list[win_type], src_height, data_height - 1);
c906108c 759 else
6ba8e26f 760 make_disasm_window (&tui_win_list[win_type], src_height, data_height - 1);
19ba03f4
SM
761 locator
762 = ((struct tui_gen_win_info *)
763 init_and_make_win (locator,
764 LOCATOR_WIN,
765 2 /* 1 */ ,
766 tui_term_width (),
767 0,
768 total_height - 1,
769 DONT_BOX_WINDOW));
c906108c
SS
770 }
771 else
772 {
6ba8e26f 773 init_gen_win_info (&tui_win_list[win_type]->generic,
08ef48c5
MS
774 tui_win_list[win_type]->generic.type,
775 src_height,
776 tui_win_list[win_type]->generic.width,
777 tui_win_list[win_type]->detail.source_info.execution_info->width,
778 data_height - 1);
6ba8e26f 779 init_gen_win_info (tui_win_list[win_type]->detail.source_info.execution_info,
08ef48c5
MS
780 EXEC_INFO_WIN,
781 src_height,
782 3,
783 0,
784 data_height - 1);
6ba8e26f
AC
785 tui_make_visible (&tui_win_list[win_type]->generic);
786 tui_make_visible (tui_win_list[win_type]->detail.source_info.execution_info);
787 init_gen_win_info (locator,
08ef48c5
MS
788 LOCATOR_WIN,
789 2 /* 1 */ ,
790 tui_term_width (),
791 0,
792 total_height - 1);
c906108c 793 }
6ba8e26f 794 tui_win_list[win_type]->detail.source_info.has_locator = TRUE;
ec7d9e56 795 tui_make_visible (locator);
47d3492a 796 tui_show_locator_content ();
6ba8e26f
AC
797 tui_add_to_source_windows (tui_win_list[win_type]);
798 tui_set_current_layout_to (new_layout);
799}
c906108c 800
ef5eab5a 801/* init_gen_win_info().
c5aa993b 802 */
c906108c 803static void
08ef48c5
MS
804init_gen_win_info (struct tui_gen_win_info *win_info,
805 enum tui_win_type type,
806 int height, int width,
807 int origin_x, int origin_y)
c906108c
SS
808{
809 int h = height;
810
6ba8e26f
AC
811 win_info->type = type;
812 win_info->width = width;
813 win_info->height = h;
c906108c
SS
814 if (h > 1)
815 {
6ba8e26f
AC
816 win_info->viewport_height = h - 1;
817 if (win_info->type != CMD_WIN)
818 win_info->viewport_height--;
c906108c
SS
819 }
820 else
6ba8e26f
AC
821 win_info->viewport_height = 1;
822 win_info->origin.x = origin_x;
823 win_info->origin.y = origin_y;
c906108c
SS
824
825 return;
6ba8e26f 826} /* init_gen_win_info */
c906108c 827
ef5eab5a 828/* init_and_make_win().
c5aa993b 829 */
d5d6fca5 830static void *
08ef48c5
MS
831init_and_make_win (void *opaque_win_info,
832 enum tui_win_type win_type,
833 int height, int width,
834 int origin_x, int origin_y,
d5d6fca5 835 int box_it)
c906108c 836{
5b6fe301 837 struct tui_gen_win_info *generic;
c906108c 838
6ba8e26f 839 if (opaque_win_info == NULL)
c906108c 840 {
6ba8e26f
AC
841 if (tui_win_is_auxillary (win_type))
842 opaque_win_info = (void *) tui_alloc_generic_win_info ();
c906108c 843 else
6ba8e26f 844 opaque_win_info = (void *) tui_alloc_win_info (win_type);
c906108c 845 }
6ba8e26f
AC
846 if (tui_win_is_auxillary (win_type))
847 generic = (struct tui_gen_win_info *) opaque_win_info;
c906108c 848 else
6ba8e26f 849 generic = &((struct tui_win_info *) opaque_win_info)->generic;
c906108c 850
6ba8e26f 851 if (opaque_win_info != NULL)
c906108c 852 {
6ba8e26f
AC
853 init_gen_win_info (generic, win_type, height, width, origin_x, origin_y);
854 if (!tui_win_is_auxillary (win_type))
c906108c
SS
855 {
856 if (generic->type == CMD_WIN)
6ba8e26f 857 ((struct tui_win_info *) opaque_win_info)->can_highlight = FALSE;
c906108c 858 else
6ba8e26f 859 ((struct tui_win_info *) opaque_win_info)->can_highlight = TRUE;
c906108c 860 }
6ba8e26f 861 tui_make_window (generic, box_it);
c906108c 862 }
d5d6fca5 863 return opaque_win_info;
bc712bbf 864}
c906108c
SS
865
866
c906108c 867static void
08ef48c5
MS
868make_source_or_disasm_window (struct tui_win_info **win_info_ptr,
869 enum tui_win_type type,
870 int height, int origin_y)
c906108c 871{
e65b5245 872 struct tui_gen_win_info *execution_info = NULL;
c906108c 873
ef5eab5a 874 /* Create the exeuction info window. */
c906108c 875 if (type == SRC_WIN)
6d012f14 876 execution_info = tui_source_exec_info_win_ptr ();
c906108c 877 else
6d012f14 878 execution_info = tui_disassem_exec_info_win_ptr ();
19ba03f4
SM
879 execution_info
880 = ((struct tui_gen_win_info *)
881 init_and_make_win (execution_info,
882 EXEC_INFO_WIN,
883 height,
884 3,
885 0,
886 origin_y,
887 DONT_BOX_WINDOW));
ef5eab5a
MS
888
889 /* Now create the source window. */
19ba03f4
SM
890 *win_info_ptr
891 = ((struct tui_win_info *)
892 init_and_make_win (*win_info_ptr,
893 type,
894 height,
895 tui_term_width () - execution_info->width,
896 execution_info->width,
897 origin_y,
898 BOX_WINDOW));
c906108c 899
6ba8e26f
AC
900 (*win_info_ptr)->detail.source_info.execution_info = execution_info;
901}
c906108c
SS
902
903
1cc6d956 904/* Show the Source/Command or the Disassem layout. */
c906108c 905static void
6ba8e26f 906show_source_or_disasm_and_command (enum tui_layout_type layout_type)
c906108c 907{
6ba8e26f 908 if (tui_current_layout () != layout_type)
c906108c 909 {
5b6fe301 910 struct tui_win_info **win_info_ptr;
6ba8e26f 911 int src_height, cmd_height;
5b6fe301 912 struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
c906108c 913
6d012f14 914 if (TUI_CMD_WIN != NULL)
6ba8e26f 915 cmd_height = TUI_CMD_WIN->generic.height;
c906108c 916 else
6ba8e26f
AC
917 cmd_height = tui_term_height () / 3;
918 src_height = tui_term_height () - cmd_height;
c906108c 919
6ba8e26f
AC
920 if (layout_type == SRC_COMMAND)
921 win_info_ptr = &TUI_SRC_WIN;
c906108c 922 else
6ba8e26f 923 win_info_ptr = &TUI_DISASM_WIN;
c906108c 924
6ba8e26f 925 if ((*win_info_ptr) == NULL)
c906108c 926 {
6ba8e26f
AC
927 if (layout_type == SRC_COMMAND)
928 make_source_window (win_info_ptr, src_height - 1, 0);
c906108c 929 else
6ba8e26f 930 make_disasm_window (win_info_ptr, src_height - 1, 0);
19ba03f4
SM
931 locator
932 = ((struct tui_gen_win_info *)
933 init_and_make_win (locator,
934 LOCATOR_WIN,
935 2 /* 1 */ ,
936 tui_term_width (),
937 0,
938 src_height - 1,
939 DONT_BOX_WINDOW));
c906108c
SS
940 }
941 else
942 {
6ba8e26f 943 init_gen_win_info (locator,
08ef48c5
MS
944 LOCATOR_WIN,
945 2 /* 1 */ ,
946 tui_term_width (),
947 0,
948 src_height - 1);
6ba8e26f 949 (*win_info_ptr)->detail.source_info.has_locator = TRUE;
08ef48c5
MS
950 init_gen_win_info (&(*win_info_ptr)->generic,
951 (*win_info_ptr)->generic.type,
952 src_height - 1,
953 (*win_info_ptr)->generic.width,
954 (*win_info_ptr)->detail.source_info.execution_info->width,
955 0);
6ba8e26f 956 init_gen_win_info ((*win_info_ptr)->detail.source_info.execution_info,
08ef48c5
MS
957 EXEC_INFO_WIN,
958 src_height - 1,
959 3,
960 0,
961 0);
6ba8e26f
AC
962 (*win_info_ptr)->can_highlight = TRUE;
963 tui_make_visible (&(*win_info_ptr)->generic);
964 tui_make_visible ((*win_info_ptr)->detail.source_info.execution_info);
c906108c 965 }
6ba8e26f 966 if ((*win_info_ptr) != NULL)
c906108c 967 {
6ba8e26f 968 (*win_info_ptr)->detail.source_info.has_locator = TRUE;
ec7d9e56 969 tui_make_visible (locator);
47d3492a 970 tui_show_locator_content ();
6ba8e26f 971 tui_show_source_content (*win_info_ptr);
c906108c 972
6d012f14 973 if (TUI_CMD_WIN == NULL)
c906108c 974 {
6ba8e26f 975 make_command_window (&TUI_CMD_WIN, cmd_height, src_height);
6d012f14 976 tui_refresh_win (&TUI_CMD_WIN->generic);
c906108c
SS
977 }
978 else
979 {
6ba8e26f 980 init_gen_win_info (&TUI_CMD_WIN->generic,
08ef48c5
MS
981 TUI_CMD_WIN->generic.type,
982 TUI_CMD_WIN->generic.height,
983 TUI_CMD_WIN->generic.width,
984 TUI_CMD_WIN->generic.origin.x,
985 TUI_CMD_WIN->generic.origin.y);
6d012f14
AC
986 TUI_CMD_WIN->can_highlight = FALSE;
987 tui_make_visible (&TUI_CMD_WIN->generic);
c906108c
SS
988 }
989 }
6ba8e26f 990 tui_set_current_layout_to (layout_type);
c906108c 991 }
6ba8e26f 992}
This page took 1.910528 seconds and 4 git commands to generate.