1 /* TUI layout window management.
3 Copyright (C) 1998-2017 Free Software Foundation, Inc.
5 Contributed by Hewlett-Packard Company.
7 This file is part of GDB.
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
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
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.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
23 #include "arch-utils.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"
39 #include "tui/tui-layout.h"
40 #include "gdb_curses.h"
42 /*******************************
44 ********************************/
45 static void show_layout (enum tui_layout_type
);
46 static void init_gen_win_info (struct tui_gen_win_info
*,
49 static void *init_and_make_win (void *, enum tui_win_type
,
50 int, int, int, int, int);
51 static void show_source_or_disasm_and_command (enum tui_layout_type
);
52 static void make_source_or_disasm_window (struct tui_win_info
**,
55 static void make_command_window (struct tui_win_info
**, int, int);
56 static void make_source_window (struct tui_win_info
**, int, int);
57 static void make_disasm_window (struct tui_win_info
**, int, int);
58 static void make_data_window (struct tui_win_info
**, int, int);
59 static void show_source_command (void);
60 static void show_disasm_command (void);
61 static void show_source_disasm_command (void);
62 static void show_data (enum tui_layout_type
);
63 static enum tui_layout_type
next_layout (void);
64 static enum tui_layout_type
prev_layout (void);
65 static void tui_layout_command (char *, int);
66 static void extract_display_start_addr (struct gdbarch
**, CORE_ADDR
*);
69 /***************************************
71 ***************************************/
73 #define LAYOUT_USAGE "Usage: layout prev | next | <layout_name> \n"
75 /* Show the screen layout defined. */
77 show_layout (enum tui_layout_type layout
)
79 enum tui_layout_type cur_layout
= tui_current_layout ();
81 if (layout
!= cur_layout
)
83 /* Since the new layout may cause changes in window size, we
84 should free the content and reallocate on next display of
86 tui_free_all_source_wins_content ();
87 tui_clear_source_windows ();
88 if (layout
== SRC_DATA_COMMAND
89 || layout
== DISASSEM_DATA_COMMAND
)
92 tui_refresh_all (tui_win_list
);
96 /* First make the current layout be invisible. */
97 tui_make_all_invisible ();
98 tui_make_invisible (tui_locator_win_info_ptr ());
102 /* Now show the new layout. */
104 show_source_command ();
105 tui_add_to_source_windows (TUI_SRC_WIN
);
107 case DISASSEM_COMMAND
:
108 show_disasm_command ();
109 tui_add_to_source_windows (TUI_DISASM_WIN
);
111 case SRC_DISASSEM_COMMAND
:
112 show_source_disasm_command ();
113 tui_add_to_source_windows (TUI_SRC_WIN
);
114 tui_add_to_source_windows (TUI_DISASM_WIN
);
124 /* Function to set the layout to SRC_COMMAND, DISASSEM_COMMAND,
125 SRC_DISASSEM_COMMAND, SRC_DATA_COMMAND, or DISASSEM_DATA_COMMAND. */
127 tui_set_layout (enum tui_layout_type layout_type
)
129 enum tui_status status
= TUI_SUCCESS
;
131 if (layout_type
!= UNDEFINED_LAYOUT
)
133 enum tui_layout_type cur_layout
= tui_current_layout (),
134 new_layout
= UNDEFINED_LAYOUT
;
135 int regs_populate
= FALSE
;
136 struct gdbarch
*gdbarch
;
138 struct tui_win_info
*win_with_focus
= tui_win_with_focus ();
139 struct tui_layout_def
*layout_def
= tui_layout_def ();
141 extract_display_start_addr (&gdbarch
, &addr
);
143 new_layout
= layout_type
;
145 regs_populate
= (new_layout
== SRC_DATA_COMMAND
146 || new_layout
== DISASSEM_DATA_COMMAND
);
147 if (new_layout
!= cur_layout
)
149 show_layout (new_layout
);
151 /* Now determine where focus should be. */
152 if (win_with_focus
!= TUI_CMD_WIN
)
157 tui_set_win_focus_to (TUI_SRC_WIN
);
158 layout_def
->display_mode
= SRC_WIN
;
159 layout_def
->split
= FALSE
;
161 case DISASSEM_COMMAND
:
162 /* The previous layout was not showing code.
163 This can happen if there is no source
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! */
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
;
175 case SRC_DISASSEM_COMMAND
:
176 /* The previous layout was not showing code.
177 This can happen if there is no source
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! */
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
);
188 tui_set_win_focus_to (TUI_DISASM_WIN
);
189 layout_def
->split
= TRUE
;
191 case SRC_DATA_COMMAND
:
192 if (win_with_focus
!= TUI_DATA_WIN
)
193 tui_set_win_focus_to (TUI_SRC_WIN
);
195 tui_set_win_focus_to (TUI_DATA_WIN
);
196 layout_def
->display_mode
= SRC_WIN
;
197 layout_def
->split
= FALSE
;
199 case DISASSEM_DATA_COMMAND
:
200 /* The previous layout was not showing code.
201 This can happen if there is no source
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! */
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
);
212 tui_set_win_focus_to (TUI_DATA_WIN
);
213 layout_def
->display_mode
= DISASSEM_WIN
;
214 layout_def
->split
= FALSE
;
221 * Now update the window content.
224 && (new_layout
== SRC_DATA_COMMAND
225 || new_layout
== DISASSEM_DATA_COMMAND
))
226 tui_display_all_data ();
228 tui_update_source_windows_with_addr (gdbarch
, addr
);
232 struct reggroup
*group
=
233 TUI_DATA_WIN
->detail
.data_display_info
.current_group
;
234 tui_show_registers (group
);
239 status
= TUI_FAILURE
;
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
248 tui_add_win_to_layout (enum tui_win_type type
)
250 enum tui_layout_type cur_layout
= tui_current_layout ();
255 if (cur_layout
!= SRC_COMMAND
256 && cur_layout
!= SRC_DISASSEM_COMMAND
257 && cur_layout
!= SRC_DATA_COMMAND
)
259 tui_clear_source_windows_detail ();
260 if (cur_layout
== DISASSEM_DATA_COMMAND
)
261 show_layout (SRC_DATA_COMMAND
);
263 show_layout (SRC_COMMAND
);
267 if (cur_layout
!= DISASSEM_COMMAND
268 && cur_layout
!= SRC_DISASSEM_COMMAND
269 && cur_layout
!= DISASSEM_DATA_COMMAND
)
271 tui_clear_source_windows_detail ();
272 if (cur_layout
== SRC_DATA_COMMAND
)
273 show_layout (DISASSEM_DATA_COMMAND
);
275 show_layout (DISASSEM_COMMAND
);
279 if (cur_layout
!= SRC_DATA_COMMAND
280 && cur_layout
!= DISASSEM_DATA_COMMAND
)
282 if (cur_layout
== DISASSEM_COMMAND
)
283 show_layout (DISASSEM_DATA_COMMAND
);
285 show_layout (SRC_DATA_COMMAND
);
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
298 tui_default_win_height (enum tui_win_type type
,
299 enum tui_layout_type layout
)
303 if (tui_win_list
[type
] != (struct tui_win_info
*) NULL
)
304 h
= tui_win_list
[type
]->generic
.height
;
310 case DISASSEM_COMMAND
:
311 if (TUI_CMD_WIN
== NULL
)
312 h
= tui_term_height () / 2;
314 h
= tui_term_height () - TUI_CMD_WIN
->generic
.height
;
316 case SRC_DISASSEM_COMMAND
:
317 case SRC_DATA_COMMAND
:
318 case DISASSEM_DATA_COMMAND
:
319 if (TUI_CMD_WIN
== NULL
)
320 h
= tui_term_height () / 3;
322 h
= (tui_term_height () - TUI_CMD_WIN
->generic
.height
) / 2;
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
338 tui_default_win_viewport_height (enum tui_win_type type
,
339 enum tui_layout_type layout
)
343 h
= tui_default_win_height (type
, layout
);
345 if (tui_win_list
[type
] == TUI_CMD_WIN
)
353 /* Complete possible layout names. TEXT is the complete text entered so
354 far, WORD is the word currently being completed. */
357 layout_completer (struct cmd_list_element
*ignore
,
358 completion_tracker
&tracker
,
359 const char *text
, const char *word
)
361 static const char *layout_names
[] =
362 { "src", "asm", "split", "regs", "next", "prev", NULL
};
364 complete_on_enum (tracker
, layout_names
, text
, word
);
367 /* Function to initialize gdb commands, for tui window layout
370 /* Provide a prototype to silence -Wmissing-prototypes. */
371 extern initialize_file_ftype _initialize_tui_layout
;
374 _initialize_tui_layout (void)
376 struct cmd_list_element
*cmd
;
378 cmd
= add_com ("layout", class_tui
, tui_layout_command
, _("\
379 Change the layout of windows.\n\
380 Usage: layout prev | next | <layout_name> \n\
382 src : Displays source and command windows.\n\
383 asm : Displays disassembly and command windows.\n\
384 split : Displays source, disassembly and command windows.\n\
385 regs : Displays register window. If existing layout\n\
386 is source/command or assembly/command, the \n\
387 register window is displayed. If the\n\
388 source/assembly/command (split) is displayed, \n\
389 the register window is displayed with \n\
390 the window that has current logical focus.\n"));
391 set_cmd_completer (cmd
, layout_completer
);
395 /*************************
396 ** STATIC LOCAL FUNCTIONS
397 **************************/
400 /* Function to set the layout to SRC, ASM, SPLIT, NEXT, PREV, DATA, or
403 tui_set_layout_by_name (const char *layout_name
)
405 enum tui_status status
= TUI_SUCCESS
;
407 if (layout_name
!= (char *) NULL
)
411 enum tui_layout_type new_layout
= UNDEFINED_LAYOUT
;
412 enum tui_layout_type cur_layout
= tui_current_layout ();
413 struct cleanup
*old_chain
;
415 buf_ptr
= (char *) xstrdup (layout_name
);
416 for (i
= 0; (i
< strlen (layout_name
)); i
++)
417 buf_ptr
[i
] = toupper (buf_ptr
[i
]);
418 old_chain
= make_cleanup (xfree
, buf_ptr
);
420 /* First check for ambiguous input. */
421 if (strlen (buf_ptr
) <= 1 && *buf_ptr
== 'S')
423 warning (_("Ambiguous command input."));
424 status
= TUI_FAILURE
;
428 if (subset_compare (buf_ptr
, "SRC"))
429 new_layout
= SRC_COMMAND
;
430 else if (subset_compare (buf_ptr
, "ASM"))
431 new_layout
= DISASSEM_COMMAND
;
432 else if (subset_compare (buf_ptr
, "SPLIT"))
433 new_layout
= SRC_DISASSEM_COMMAND
;
434 else if (subset_compare (buf_ptr
, "REGS"))
436 if (cur_layout
== SRC_COMMAND
437 || cur_layout
== SRC_DATA_COMMAND
)
438 new_layout
= SRC_DATA_COMMAND
;
440 new_layout
= DISASSEM_DATA_COMMAND
;
442 else if (subset_compare (buf_ptr
, "NEXT"))
443 new_layout
= next_layout ();
444 else if (subset_compare (buf_ptr
, "PREV"))
445 new_layout
= prev_layout ();
447 status
= TUI_FAILURE
;
449 if (status
== TUI_SUCCESS
)
451 /* Make sure the curses mode is enabled. */
453 tui_set_layout (new_layout
);
456 do_cleanups (old_chain
);
459 status
= TUI_FAILURE
;
466 extract_display_start_addr (struct gdbarch
**gdbarch_p
, CORE_ADDR
*addr_p
)
468 enum tui_layout_type cur_layout
= tui_current_layout ();
469 struct gdbarch
*gdbarch
= get_current_arch ();
472 struct symtab_and_line cursal
= get_current_source_symtab_and_line ();
477 case SRC_DATA_COMMAND
:
478 gdbarch
= TUI_SRC_WIN
->detail
.source_info
.gdbarch
;
479 find_line_pc (cursal
.symtab
,
480 TUI_SRC_WIN
->detail
.source_info
.start_line_or_addr
.u
.line_no
,
484 case DISASSEM_COMMAND
:
485 case SRC_DISASSEM_COMMAND
:
486 case DISASSEM_DATA_COMMAND
:
487 gdbarch
= TUI_DISASM_WIN
->detail
.source_info
.gdbarch
;
488 addr
= TUI_DISASM_WIN
->detail
.source_info
.start_line_or_addr
.u
.addr
;
495 *gdbarch_p
= gdbarch
;
501 tui_layout_command (char *arg
, int from_tty
)
503 /* Switch to the selected layout. */
504 if (tui_set_layout_by_name (arg
) != TUI_SUCCESS
)
505 warning (_("Invalid layout specified.\n%s"), LAYOUT_USAGE
);
509 /* Answer the previous layout to cycle to. */
510 static enum tui_layout_type
515 new_layout
= tui_current_layout ();
516 if (new_layout
== UNDEFINED_LAYOUT
)
517 new_layout
= SRC_COMMAND
;
521 if (new_layout
== UNDEFINED_LAYOUT
)
522 new_layout
= SRC_COMMAND
;
525 return (enum tui_layout_type
) new_layout
;
529 /* Answer the next layout to cycle to. */
530 static enum tui_layout_type
535 new_layout
= tui_current_layout ();
536 if (new_layout
== SRC_COMMAND
)
537 new_layout
= DISASSEM_DATA_COMMAND
;
541 if (new_layout
== UNDEFINED_LAYOUT
)
542 new_layout
= DISASSEM_DATA_COMMAND
;
545 return (enum tui_layout_type
) new_layout
;
551 make_command_window (struct tui_win_info
**win_info_ptr
,
552 int height
, int origin_y
)
555 = (struct tui_win_info
*) init_and_make_win (*win_info_ptr
,
563 (*win_info_ptr
)->can_highlight
= FALSE
;
567 /* make_source_window().
570 make_source_window (struct tui_win_info
**win_info_ptr
,
571 int height
, int origin_y
)
573 make_source_or_disasm_window (win_info_ptr
, SRC_WIN
, height
, origin_y
);
576 } /* make_source_window */
579 /* make_disasm_window().
582 make_disasm_window (struct tui_win_info
**win_info_ptr
,
583 int height
, int origin_y
)
585 make_source_or_disasm_window (win_info_ptr
, DISASSEM_WIN
, height
, origin_y
);
588 } /* make_disasm_window */
592 make_data_window (struct tui_win_info
**win_info_ptr
,
593 int height
, int origin_y
)
596 = (struct tui_win_info
*) init_and_make_win (*win_info_ptr
,
607 /* Show the Source/Command layout. */
609 show_source_command (void)
611 show_source_or_disasm_and_command (SRC_COMMAND
);
615 /* Show the Dissassem/Command layout. */
617 show_disasm_command (void)
619 show_source_or_disasm_and_command (DISASSEM_COMMAND
);
623 /* Show the Source/Disassem/Command layout. */
625 show_source_disasm_command (void)
627 if (tui_current_layout () != SRC_DISASSEM_COMMAND
)
629 int cmd_height
, src_height
, asm_height
;
631 if (TUI_CMD_WIN
!= NULL
)
632 cmd_height
= TUI_CMD_WIN
->generic
.height
;
634 cmd_height
= tui_term_height () / 3;
636 src_height
= (tui_term_height () - cmd_height
) / 2;
637 asm_height
= tui_term_height () - (src_height
+ cmd_height
);
639 if (TUI_SRC_WIN
== NULL
)
640 make_source_window (&TUI_SRC_WIN
, src_height
, 0);
643 init_gen_win_info (&TUI_SRC_WIN
->generic
,
644 TUI_SRC_WIN
->generic
.type
,
646 TUI_SRC_WIN
->generic
.width
,
647 TUI_SRC_WIN
->detail
.source_info
.execution_info
->width
,
649 TUI_SRC_WIN
->can_highlight
= TRUE
;
650 init_gen_win_info (TUI_SRC_WIN
->detail
.source_info
.execution_info
,
656 tui_make_visible (&TUI_SRC_WIN
->generic
);
657 tui_make_visible (TUI_SRC_WIN
->detail
.source_info
.execution_info
);
658 TUI_SRC_WIN
->detail
.source_info
.has_locator
= FALSE
;;
660 if (TUI_SRC_WIN
!= NULL
)
662 struct tui_gen_win_info
*locator
= tui_locator_win_info_ptr ();
664 tui_show_source_content (TUI_SRC_WIN
);
665 if (TUI_DISASM_WIN
== NULL
)
667 make_disasm_window (&TUI_DISASM_WIN
, asm_height
, src_height
- 1);
669 = ((struct tui_gen_win_info
*)
670 init_and_make_win (locator
,
675 (src_height
+ asm_height
) - 1,
680 init_gen_win_info (locator
,
685 (src_height
+ asm_height
) - 1);
686 TUI_DISASM_WIN
->detail
.source_info
.has_locator
= TRUE
;
687 init_gen_win_info (&TUI_DISASM_WIN
->generic
,
688 TUI_DISASM_WIN
->generic
.type
,
690 TUI_DISASM_WIN
->generic
.width
,
691 TUI_DISASM_WIN
->detail
.source_info
.execution_info
->width
,
693 init_gen_win_info (TUI_DISASM_WIN
->detail
.source_info
.execution_info
,
699 TUI_DISASM_WIN
->can_highlight
= TRUE
;
700 tui_make_visible (&TUI_DISASM_WIN
->generic
);
701 tui_make_visible (TUI_DISASM_WIN
->detail
.source_info
.execution_info
);
703 if (TUI_DISASM_WIN
!= NULL
)
705 TUI_SRC_WIN
->detail
.source_info
.has_locator
= FALSE
;
706 TUI_DISASM_WIN
->detail
.source_info
.has_locator
= TRUE
;
707 tui_make_visible (locator
);
708 tui_show_locator_content ();
709 tui_show_source_content (TUI_DISASM_WIN
);
711 if (TUI_CMD_WIN
== NULL
)
712 make_command_window (&TUI_CMD_WIN
,
714 tui_term_height () - cmd_height
);
717 init_gen_win_info (&TUI_CMD_WIN
->generic
,
718 TUI_CMD_WIN
->generic
.type
,
719 TUI_CMD_WIN
->generic
.height
,
720 TUI_CMD_WIN
->generic
.width
,
722 TUI_CMD_WIN
->generic
.origin
.y
);
723 TUI_CMD_WIN
->can_highlight
= FALSE
;
724 tui_make_visible (&TUI_CMD_WIN
->generic
);
726 if (TUI_CMD_WIN
!= NULL
)
727 tui_refresh_win (&TUI_CMD_WIN
->generic
);
730 tui_set_current_layout_to (SRC_DISASSEM_COMMAND
);
735 /* Show the Source/Data/Command or the Dissassembly/Data/Command
738 show_data (enum tui_layout_type new_layout
)
740 int total_height
= (tui_term_height () - TUI_CMD_WIN
->generic
.height
);
741 int src_height
, data_height
;
742 enum tui_win_type win_type
;
743 struct tui_gen_win_info
*locator
= tui_locator_win_info_ptr ();
746 data_height
= total_height
/ 2;
747 src_height
= total_height
- data_height
;
748 tui_make_all_invisible ();
749 tui_make_invisible (locator
);
750 make_data_window (&TUI_DATA_WIN
, data_height
, 0);
751 TUI_DATA_WIN
->can_highlight
= TRUE
;
752 if (new_layout
== SRC_DATA_COMMAND
)
755 win_type
= DISASSEM_WIN
;
756 if (tui_win_list
[win_type
] == NULL
)
758 if (win_type
== SRC_WIN
)
759 make_source_window (&tui_win_list
[win_type
], src_height
, data_height
- 1);
761 make_disasm_window (&tui_win_list
[win_type
], src_height
, data_height
- 1);
763 = ((struct tui_gen_win_info
*)
764 init_and_make_win (locator
,
774 init_gen_win_info (&tui_win_list
[win_type
]->generic
,
775 tui_win_list
[win_type
]->generic
.type
,
777 tui_win_list
[win_type
]->generic
.width
,
778 tui_win_list
[win_type
]->detail
.source_info
.execution_info
->width
,
780 init_gen_win_info (tui_win_list
[win_type
]->detail
.source_info
.execution_info
,
786 tui_make_visible (&tui_win_list
[win_type
]->generic
);
787 tui_make_visible (tui_win_list
[win_type
]->detail
.source_info
.execution_info
);
788 init_gen_win_info (locator
,
795 tui_win_list
[win_type
]->detail
.source_info
.has_locator
= TRUE
;
796 tui_make_visible (locator
);
797 tui_show_locator_content ();
798 tui_add_to_source_windows (tui_win_list
[win_type
]);
799 tui_set_current_layout_to (new_layout
);
802 /* init_gen_win_info().
805 init_gen_win_info (struct tui_gen_win_info
*win_info
,
806 enum tui_win_type type
,
807 int height
, int width
,
808 int origin_x
, int origin_y
)
812 win_info
->type
= type
;
813 win_info
->width
= width
;
814 win_info
->height
= h
;
817 win_info
->viewport_height
= h
- 1;
818 if (win_info
->type
!= CMD_WIN
)
819 win_info
->viewport_height
--;
822 win_info
->viewport_height
= 1;
823 win_info
->origin
.x
= origin_x
;
824 win_info
->origin
.y
= origin_y
;
827 } /* init_gen_win_info */
829 /* init_and_make_win().
832 init_and_make_win (void *opaque_win_info
,
833 enum tui_win_type win_type
,
834 int height
, int width
,
835 int origin_x
, int origin_y
,
838 struct tui_gen_win_info
*generic
;
840 if (opaque_win_info
== NULL
)
842 if (tui_win_is_auxillary (win_type
))
843 opaque_win_info
= (void *) tui_alloc_generic_win_info ();
845 opaque_win_info
= (void *) tui_alloc_win_info (win_type
);
847 if (tui_win_is_auxillary (win_type
))
848 generic
= (struct tui_gen_win_info
*) opaque_win_info
;
850 generic
= &((struct tui_win_info
*) opaque_win_info
)->generic
;
852 if (opaque_win_info
!= NULL
)
854 init_gen_win_info (generic
, win_type
, height
, width
, origin_x
, origin_y
);
855 if (!tui_win_is_auxillary (win_type
))
857 if (generic
->type
== CMD_WIN
)
858 ((struct tui_win_info
*) opaque_win_info
)->can_highlight
= FALSE
;
860 ((struct tui_win_info
*) opaque_win_info
)->can_highlight
= TRUE
;
862 tui_make_window (generic
, box_it
);
864 return opaque_win_info
;
869 make_source_or_disasm_window (struct tui_win_info
**win_info_ptr
,
870 enum tui_win_type type
,
871 int height
, int origin_y
)
873 struct tui_gen_win_info
*execution_info
= NULL
;
875 /* Create the exeuction info window. */
877 execution_info
= tui_source_exec_info_win_ptr ();
879 execution_info
= tui_disassem_exec_info_win_ptr ();
881 = ((struct tui_gen_win_info
*)
882 init_and_make_win (execution_info
,
890 /* Now create the source window. */
892 = ((struct tui_win_info
*)
893 init_and_make_win (*win_info_ptr
,
896 tui_term_width () - execution_info
->width
,
897 execution_info
->width
,
901 (*win_info_ptr
)->detail
.source_info
.execution_info
= execution_info
;
905 /* Show the Source/Command or the Disassem layout. */
907 show_source_or_disasm_and_command (enum tui_layout_type layout_type
)
909 if (tui_current_layout () != layout_type
)
911 struct tui_win_info
**win_info_ptr
;
912 int src_height
, cmd_height
;
913 struct tui_gen_win_info
*locator
= tui_locator_win_info_ptr ();
915 if (TUI_CMD_WIN
!= NULL
)
916 cmd_height
= TUI_CMD_WIN
->generic
.height
;
918 cmd_height
= tui_term_height () / 3;
919 src_height
= tui_term_height () - cmd_height
;
921 if (layout_type
== SRC_COMMAND
)
922 win_info_ptr
= &TUI_SRC_WIN
;
924 win_info_ptr
= &TUI_DISASM_WIN
;
926 if ((*win_info_ptr
) == NULL
)
928 if (layout_type
== SRC_COMMAND
)
929 make_source_window (win_info_ptr
, src_height
- 1, 0);
931 make_disasm_window (win_info_ptr
, src_height
- 1, 0);
933 = ((struct tui_gen_win_info
*)
934 init_and_make_win (locator
,
944 init_gen_win_info (locator
,
950 (*win_info_ptr
)->detail
.source_info
.has_locator
= TRUE
;
951 init_gen_win_info (&(*win_info_ptr
)->generic
,
952 (*win_info_ptr
)->generic
.type
,
954 (*win_info_ptr
)->generic
.width
,
955 (*win_info_ptr
)->detail
.source_info
.execution_info
->width
,
957 init_gen_win_info ((*win_info_ptr
)->detail
.source_info
.execution_info
,
963 (*win_info_ptr
)->can_highlight
= TRUE
;
964 tui_make_visible (&(*win_info_ptr
)->generic
);
965 tui_make_visible ((*win_info_ptr
)->detail
.source_info
.execution_info
);
967 if ((*win_info_ptr
) != NULL
)
969 (*win_info_ptr
)->detail
.source_info
.has_locator
= TRUE
;
970 tui_make_visible (locator
);
971 tui_show_locator_content ();
972 tui_show_source_content (*win_info_ptr
);
974 if (TUI_CMD_WIN
== NULL
)
976 make_command_window (&TUI_CMD_WIN
, cmd_height
, src_height
);
977 tui_refresh_win (&TUI_CMD_WIN
->generic
);
981 init_gen_win_info (&TUI_CMD_WIN
->generic
,
982 TUI_CMD_WIN
->generic
.type
,
983 TUI_CMD_WIN
->generic
.height
,
984 TUI_CMD_WIN
->generic
.width
,
985 TUI_CMD_WIN
->generic
.origin
.x
,
986 TUI_CMD_WIN
->generic
.origin
.y
);
987 TUI_CMD_WIN
->can_highlight
= FALSE
;
988 tui_make_visible (&TUI_CMD_WIN
->generic
);
991 tui_set_current_layout_to (layout_type
);