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
371 _initialize_tui_layout (void)
373 struct cmd_list_element
*cmd
;
375 cmd
= add_com ("layout", class_tui
, tui_layout_command
, _("\
376 Change the layout of windows.\n\
377 Usage: layout prev | next | <layout_name> \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\
387 the window that has current logical focus.\n"));
388 set_cmd_completer (cmd
, layout_completer
);
392 /*************************
393 ** STATIC LOCAL FUNCTIONS
394 **************************/
397 /* Function to set the layout to SRC, ASM, SPLIT, NEXT, PREV, DATA, or
400 tui_set_layout_by_name (const char *layout_name
)
402 enum tui_status status
= TUI_SUCCESS
;
404 if (layout_name
!= (char *) NULL
)
407 enum tui_layout_type new_layout
= UNDEFINED_LAYOUT
;
408 enum tui_layout_type cur_layout
= tui_current_layout ();
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 ();
415 /* First check for ambiguous input. */
416 if (strlen (buf_ptr
) <= 1 && *buf_ptr
== 'S')
418 warning (_("Ambiguous command input."));
419 status
= TUI_FAILURE
;
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
;
429 else if (subset_compare (buf_ptr
, "REGS"))
431 if (cur_layout
== SRC_COMMAND
432 || cur_layout
== SRC_DATA_COMMAND
)
433 new_layout
= SRC_DATA_COMMAND
;
435 new_layout
= DISASSEM_DATA_COMMAND
;
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 ();
442 status
= TUI_FAILURE
;
444 if (status
== TUI_SUCCESS
)
446 /* Make sure the curses mode is enabled. */
448 tui_set_layout (new_layout
);
453 status
= TUI_FAILURE
;
460 extract_display_start_addr (struct gdbarch
**gdbarch_p
, CORE_ADDR
*addr_p
)
462 enum tui_layout_type cur_layout
= tui_current_layout ();
463 struct gdbarch
*gdbarch
= get_current_arch ();
466 struct symtab_and_line cursal
= get_current_source_symtab_and_line ();
471 case SRC_DATA_COMMAND
:
472 gdbarch
= TUI_SRC_WIN
->detail
.source_info
.gdbarch
;
473 find_line_pc (cursal
.symtab
,
474 TUI_SRC_WIN
->detail
.source_info
.start_line_or_addr
.u
.line_no
,
478 case DISASSEM_COMMAND
:
479 case SRC_DISASSEM_COMMAND
:
480 case DISASSEM_DATA_COMMAND
:
481 gdbarch
= TUI_DISASM_WIN
->detail
.source_info
.gdbarch
;
482 addr
= TUI_DISASM_WIN
->detail
.source_info
.start_line_or_addr
.u
.addr
;
489 *gdbarch_p
= gdbarch
;
495 tui_layout_command (char *arg
, int from_tty
)
497 /* Switch to the selected layout. */
498 if (tui_set_layout_by_name (arg
) != TUI_SUCCESS
)
499 warning (_("Invalid layout specified.\n%s"), LAYOUT_USAGE
);
503 /* Answer the previous layout to cycle to. */
504 static enum tui_layout_type
509 new_layout
= tui_current_layout ();
510 if (new_layout
== UNDEFINED_LAYOUT
)
511 new_layout
= SRC_COMMAND
;
515 if (new_layout
== UNDEFINED_LAYOUT
)
516 new_layout
= SRC_COMMAND
;
519 return (enum tui_layout_type
) new_layout
;
523 /* Answer the next layout to cycle to. */
524 static enum tui_layout_type
529 new_layout
= tui_current_layout ();
530 if (new_layout
== SRC_COMMAND
)
531 new_layout
= DISASSEM_DATA_COMMAND
;
535 if (new_layout
== UNDEFINED_LAYOUT
)
536 new_layout
= DISASSEM_DATA_COMMAND
;
539 return (enum tui_layout_type
) new_layout
;
545 make_command_window (struct tui_win_info
**win_info_ptr
,
546 int height
, int origin_y
)
549 = (struct tui_win_info
*) init_and_make_win (*win_info_ptr
,
557 (*win_info_ptr
)->can_highlight
= FALSE
;
561 /* make_source_window().
564 make_source_window (struct tui_win_info
**win_info_ptr
,
565 int height
, int origin_y
)
567 make_source_or_disasm_window (win_info_ptr
, SRC_WIN
, height
, origin_y
);
570 } /* make_source_window */
573 /* make_disasm_window().
576 make_disasm_window (struct tui_win_info
**win_info_ptr
,
577 int height
, int origin_y
)
579 make_source_or_disasm_window (win_info_ptr
, DISASSEM_WIN
, height
, origin_y
);
582 } /* make_disasm_window */
586 make_data_window (struct tui_win_info
**win_info_ptr
,
587 int height
, int origin_y
)
590 = (struct tui_win_info
*) init_and_make_win (*win_info_ptr
,
601 /* Show the Source/Command layout. */
603 show_source_command (void)
605 show_source_or_disasm_and_command (SRC_COMMAND
);
609 /* Show the Dissassem/Command layout. */
611 show_disasm_command (void)
613 show_source_or_disasm_and_command (DISASSEM_COMMAND
);
617 /* Show the Source/Disassem/Command layout. */
619 show_source_disasm_command (void)
621 if (tui_current_layout () != SRC_DISASSEM_COMMAND
)
623 int cmd_height
, src_height
, asm_height
;
625 if (TUI_CMD_WIN
!= NULL
)
626 cmd_height
= TUI_CMD_WIN
->generic
.height
;
628 cmd_height
= tui_term_height () / 3;
630 src_height
= (tui_term_height () - cmd_height
) / 2;
631 asm_height
= tui_term_height () - (src_height
+ cmd_height
);
633 if (TUI_SRC_WIN
== NULL
)
634 make_source_window (&TUI_SRC_WIN
, src_height
, 0);
637 init_gen_win_info (&TUI_SRC_WIN
->generic
,
638 TUI_SRC_WIN
->generic
.type
,
640 TUI_SRC_WIN
->generic
.width
,
641 TUI_SRC_WIN
->detail
.source_info
.execution_info
->width
,
643 TUI_SRC_WIN
->can_highlight
= TRUE
;
644 init_gen_win_info (TUI_SRC_WIN
->detail
.source_info
.execution_info
,
650 tui_make_visible (&TUI_SRC_WIN
->generic
);
651 tui_make_visible (TUI_SRC_WIN
->detail
.source_info
.execution_info
);
652 TUI_SRC_WIN
->detail
.source_info
.has_locator
= FALSE
;;
654 if (TUI_SRC_WIN
!= NULL
)
656 struct tui_gen_win_info
*locator
= tui_locator_win_info_ptr ();
658 tui_show_source_content (TUI_SRC_WIN
);
659 if (TUI_DISASM_WIN
== NULL
)
661 make_disasm_window (&TUI_DISASM_WIN
, asm_height
, src_height
- 1);
663 = ((struct tui_gen_win_info
*)
664 init_and_make_win (locator
,
669 (src_height
+ asm_height
) - 1,
674 init_gen_win_info (locator
,
679 (src_height
+ asm_height
) - 1);
680 TUI_DISASM_WIN
->detail
.source_info
.has_locator
= TRUE
;
681 init_gen_win_info (&TUI_DISASM_WIN
->generic
,
682 TUI_DISASM_WIN
->generic
.type
,
684 TUI_DISASM_WIN
->generic
.width
,
685 TUI_DISASM_WIN
->detail
.source_info
.execution_info
->width
,
687 init_gen_win_info (TUI_DISASM_WIN
->detail
.source_info
.execution_info
,
693 TUI_DISASM_WIN
->can_highlight
= TRUE
;
694 tui_make_visible (&TUI_DISASM_WIN
->generic
);
695 tui_make_visible (TUI_DISASM_WIN
->detail
.source_info
.execution_info
);
697 if (TUI_DISASM_WIN
!= NULL
)
699 TUI_SRC_WIN
->detail
.source_info
.has_locator
= FALSE
;
700 TUI_DISASM_WIN
->detail
.source_info
.has_locator
= TRUE
;
701 tui_make_visible (locator
);
702 tui_show_locator_content ();
703 tui_show_source_content (TUI_DISASM_WIN
);
705 if (TUI_CMD_WIN
== NULL
)
706 make_command_window (&TUI_CMD_WIN
,
708 tui_term_height () - cmd_height
);
711 init_gen_win_info (&TUI_CMD_WIN
->generic
,
712 TUI_CMD_WIN
->generic
.type
,
713 TUI_CMD_WIN
->generic
.height
,
714 TUI_CMD_WIN
->generic
.width
,
716 TUI_CMD_WIN
->generic
.origin
.y
);
717 TUI_CMD_WIN
->can_highlight
= FALSE
;
718 tui_make_visible (&TUI_CMD_WIN
->generic
);
720 if (TUI_CMD_WIN
!= NULL
)
721 tui_refresh_win (&TUI_CMD_WIN
->generic
);
724 tui_set_current_layout_to (SRC_DISASSEM_COMMAND
);
729 /* Show the Source/Data/Command or the Dissassembly/Data/Command
732 show_data (enum tui_layout_type new_layout
)
734 int total_height
= (tui_term_height () - TUI_CMD_WIN
->generic
.height
);
735 int src_height
, data_height
;
736 enum tui_win_type win_type
;
737 struct tui_gen_win_info
*locator
= tui_locator_win_info_ptr ();
740 data_height
= total_height
/ 2;
741 src_height
= total_height
- data_height
;
742 tui_make_all_invisible ();
743 tui_make_invisible (locator
);
744 make_data_window (&TUI_DATA_WIN
, data_height
, 0);
745 TUI_DATA_WIN
->can_highlight
= TRUE
;
746 if (new_layout
== SRC_DATA_COMMAND
)
749 win_type
= DISASSEM_WIN
;
750 if (tui_win_list
[win_type
] == NULL
)
752 if (win_type
== SRC_WIN
)
753 make_source_window (&tui_win_list
[win_type
], src_height
, data_height
- 1);
755 make_disasm_window (&tui_win_list
[win_type
], src_height
, data_height
- 1);
757 = ((struct tui_gen_win_info
*)
758 init_and_make_win (locator
,
768 init_gen_win_info (&tui_win_list
[win_type
]->generic
,
769 tui_win_list
[win_type
]->generic
.type
,
771 tui_win_list
[win_type
]->generic
.width
,
772 tui_win_list
[win_type
]->detail
.source_info
.execution_info
->width
,
774 init_gen_win_info (tui_win_list
[win_type
]->detail
.source_info
.execution_info
,
780 tui_make_visible (&tui_win_list
[win_type
]->generic
);
781 tui_make_visible (tui_win_list
[win_type
]->detail
.source_info
.execution_info
);
782 init_gen_win_info (locator
,
789 tui_win_list
[win_type
]->detail
.source_info
.has_locator
= TRUE
;
790 tui_make_visible (locator
);
791 tui_show_locator_content ();
792 tui_add_to_source_windows (tui_win_list
[win_type
]);
793 tui_set_current_layout_to (new_layout
);
796 /* init_gen_win_info().
799 init_gen_win_info (struct tui_gen_win_info
*win_info
,
800 enum tui_win_type type
,
801 int height
, int width
,
802 int origin_x
, int origin_y
)
806 win_info
->type
= type
;
807 win_info
->width
= width
;
808 win_info
->height
= h
;
811 win_info
->viewport_height
= h
- 1;
812 if (win_info
->type
!= CMD_WIN
)
813 win_info
->viewport_height
--;
816 win_info
->viewport_height
= 1;
817 win_info
->origin
.x
= origin_x
;
818 win_info
->origin
.y
= origin_y
;
821 } /* init_gen_win_info */
823 /* init_and_make_win().
826 init_and_make_win (void *opaque_win_info
,
827 enum tui_win_type win_type
,
828 int height
, int width
,
829 int origin_x
, int origin_y
,
832 struct tui_gen_win_info
*generic
;
834 if (opaque_win_info
== NULL
)
836 if (tui_win_is_auxillary (win_type
))
837 opaque_win_info
= (void *) tui_alloc_generic_win_info ();
839 opaque_win_info
= (void *) tui_alloc_win_info (win_type
);
841 if (tui_win_is_auxillary (win_type
))
842 generic
= (struct tui_gen_win_info
*) opaque_win_info
;
844 generic
= &((struct tui_win_info
*) opaque_win_info
)->generic
;
846 if (opaque_win_info
!= NULL
)
848 init_gen_win_info (generic
, win_type
, height
, width
, origin_x
, origin_y
);
849 if (!tui_win_is_auxillary (win_type
))
851 if (generic
->type
== CMD_WIN
)
852 ((struct tui_win_info
*) opaque_win_info
)->can_highlight
= FALSE
;
854 ((struct tui_win_info
*) opaque_win_info
)->can_highlight
= TRUE
;
856 tui_make_window (generic
, box_it
);
858 return opaque_win_info
;
863 make_source_or_disasm_window (struct tui_win_info
**win_info_ptr
,
864 enum tui_win_type type
,
865 int height
, int origin_y
)
867 struct tui_gen_win_info
*execution_info
= NULL
;
869 /* Create the exeuction info window. */
871 execution_info
= tui_source_exec_info_win_ptr ();
873 execution_info
= tui_disassem_exec_info_win_ptr ();
875 = ((struct tui_gen_win_info
*)
876 init_and_make_win (execution_info
,
884 /* Now create the source window. */
886 = ((struct tui_win_info
*)
887 init_and_make_win (*win_info_ptr
,
890 tui_term_width () - execution_info
->width
,
891 execution_info
->width
,
895 (*win_info_ptr
)->detail
.source_info
.execution_info
= execution_info
;
899 /* Show the Source/Command or the Disassem layout. */
901 show_source_or_disasm_and_command (enum tui_layout_type layout_type
)
903 if (tui_current_layout () != layout_type
)
905 struct tui_win_info
**win_info_ptr
;
906 int src_height
, cmd_height
;
907 struct tui_gen_win_info
*locator
= tui_locator_win_info_ptr ();
909 if (TUI_CMD_WIN
!= NULL
)
910 cmd_height
= TUI_CMD_WIN
->generic
.height
;
912 cmd_height
= tui_term_height () / 3;
913 src_height
= tui_term_height () - cmd_height
;
915 if (layout_type
== SRC_COMMAND
)
916 win_info_ptr
= &TUI_SRC_WIN
;
918 win_info_ptr
= &TUI_DISASM_WIN
;
920 if ((*win_info_ptr
) == NULL
)
922 if (layout_type
== SRC_COMMAND
)
923 make_source_window (win_info_ptr
, src_height
- 1, 0);
925 make_disasm_window (win_info_ptr
, src_height
- 1, 0);
927 = ((struct tui_gen_win_info
*)
928 init_and_make_win (locator
,
938 init_gen_win_info (locator
,
944 (*win_info_ptr
)->detail
.source_info
.has_locator
= TRUE
;
945 init_gen_win_info (&(*win_info_ptr
)->generic
,
946 (*win_info_ptr
)->generic
.type
,
948 (*win_info_ptr
)->generic
.width
,
949 (*win_info_ptr
)->detail
.source_info
.execution_info
->width
,
951 init_gen_win_info ((*win_info_ptr
)->detail
.source_info
.execution_info
,
957 (*win_info_ptr
)->can_highlight
= TRUE
;
958 tui_make_visible (&(*win_info_ptr
)->generic
);
959 tui_make_visible ((*win_info_ptr
)->detail
.source_info
.execution_info
);
961 if ((*win_info_ptr
) != NULL
)
963 (*win_info_ptr
)->detail
.source_info
.has_locator
= TRUE
;
964 tui_make_visible (locator
);
965 tui_show_locator_content ();
966 tui_show_source_content (*win_info_ptr
);
968 if (TUI_CMD_WIN
== NULL
)
970 make_command_window (&TUI_CMD_WIN
, cmd_height
, src_height
);
971 tui_refresh_win (&TUI_CMD_WIN
->generic
);
975 init_gen_win_info (&TUI_CMD_WIN
->generic
,
976 TUI_CMD_WIN
->generic
.type
,
977 TUI_CMD_WIN
->generic
.height
,
978 TUI_CMD_WIN
->generic
.width
,
979 TUI_CMD_WIN
->generic
.origin
.x
,
980 TUI_CMD_WIN
->generic
.origin
.y
);
981 TUI_CMD_WIN
->can_highlight
= FALSE
;
982 tui_make_visible (&TUI_CMD_WIN
->generic
);
985 tui_set_current_layout_to (layout_type
);