1 /* TUI layout window management.
3 Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007
4 Free Software Foundation, Inc.
6 Contributed by Hewlett-Packard Company.
8 This file is part of GDB.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor,
23 Boston, MA 02110-1301, USA. */
33 #include "tui/tui-data.h"
34 #include "tui/tui-windata.h"
35 #include "tui/tui-wingeneral.h"
36 #include "tui/tui-stack.h"
37 #include "tui/tui-regs.h"
38 #include "tui/tui-win.h"
39 #include "tui/tui-winsource.h"
40 #include "tui/tui-disasm.h"
42 #include "gdb_string.h"
43 #include "gdb_curses.h"
45 /*******************************
47 ********************************/
48 static void show_layout (enum tui_layout_type);
49 static void init_gen_win_info (struct tui_gen_win_info *, enum tui_win_type, int, int, int, int);
50 static void *init_and_make_win (void *, enum tui_win_type, 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 **, enum tui_win_type, int, int);
53 static void make_command_window (struct tui_win_info **, int, int);
54 static void make_source_window (struct tui_win_info **, int, int);
55 static void make_disasm_window (struct tui_win_info **, int, int);
56 static void make_data_window (struct tui_win_info **, int, int);
57 static void show_source_command (void);
58 static void show_disasm_command (void);
59 static void show_source_disasm_command (void);
60 static void show_data (enum tui_layout_type);
61 static enum tui_layout_type next_layout (void);
62 static enum tui_layout_type prev_layout (void);
63 static void tui_layout_command (char *, int);
64 static void tui_toggle_layout_command (char *, int);
65 static void tui_toggle_split_layout_command (char *, int);
66 static CORE_ADDR extract_display_start_addr (void);
67 static void tui_handle_xdb_layout (struct tui_layout_def *);
70 /***************************************
72 ***************************************/
74 #define LAYOUT_USAGE "Usage: layout prev | next | <layout_name> \n"
76 /* Show the screen layout defined. */
78 show_layout (enum tui_layout_type layout)
80 enum tui_layout_type cur_layout = tui_current_layout ();
82 if (layout != cur_layout)
84 /* Since the new layout may cause changes in window size, we
85 should free the content and reallocate on next display of
87 tui_free_all_source_wins_content ();
88 tui_clear_source_windows ();
89 if (layout == SRC_DATA_COMMAND || 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.
126 If the layout is SRC_DATA_COMMAND, DISASSEM_DATA_COMMAND, or
127 UNDEFINED_LAYOUT, then the data window is populated according to
128 regs_display_type. */
130 tui_set_layout (enum tui_layout_type layout_type,
131 enum tui_register_display_type regs_display_type)
133 enum tui_status status = TUI_SUCCESS;
135 if (layout_type != UNDEFINED_LAYOUT || regs_display_type != TUI_UNDEFINED_REGS)
137 enum tui_layout_type cur_layout = tui_current_layout (), new_layout = UNDEFINED_LAYOUT;
138 int regs_populate = FALSE;
139 CORE_ADDR addr = extract_display_start_addr ();
140 struct tui_win_info *win_with_focus = tui_win_with_focus ();
141 struct tui_layout_def *layout_def = tui_layout_def ();
144 if (layout_type == UNDEFINED_LAYOUT &&
145 regs_display_type != TUI_UNDEFINED_REGS)
147 if (cur_layout == SRC_DISASSEM_COMMAND)
148 new_layout = DISASSEM_DATA_COMMAND;
149 else if (cur_layout == SRC_COMMAND || cur_layout == SRC_DATA_COMMAND)
150 new_layout = SRC_DATA_COMMAND;
151 else if (cur_layout == DISASSEM_COMMAND ||
152 cur_layout == DISASSEM_DATA_COMMAND)
153 new_layout = DISASSEM_DATA_COMMAND;
156 new_layout = layout_type;
158 regs_populate = (new_layout == SRC_DATA_COMMAND ||
159 new_layout == DISASSEM_DATA_COMMAND ||
160 regs_display_type != TUI_UNDEFINED_REGS);
161 if (new_layout != cur_layout || regs_display_type != TUI_UNDEFINED_REGS)
163 if (new_layout != cur_layout)
165 show_layout (new_layout);
167 /* Now determine where focus should be. */
168 if (win_with_focus != TUI_CMD_WIN)
173 tui_set_win_focus_to (TUI_SRC_WIN);
174 layout_def->display_mode = SRC_WIN;
175 layout_def->split = FALSE;
177 case DISASSEM_COMMAND:
178 /* The previous layout was not showing code.
179 This can happen if there is no source
182 1. if the source file is in another dir OR
183 2. if target was compiled without -g
184 We still want to show the assembly though! */
186 addr = tui_get_begin_asm_address ();
187 tui_set_win_focus_to (TUI_DISASM_WIN);
188 layout_def->display_mode = DISASSEM_WIN;
189 layout_def->split = FALSE;
191 case SRC_DISASSEM_COMMAND:
192 /* The previous layout was not showing code.
193 This can happen if there is no source
196 1. if the source file is in another dir OR
197 2. if target was compiled without -g
198 We still want to show the assembly though! */
200 addr = tui_get_begin_asm_address ();
201 if (win_with_focus == TUI_SRC_WIN)
202 tui_set_win_focus_to (TUI_SRC_WIN);
204 tui_set_win_focus_to (TUI_DISASM_WIN);
205 layout_def->split = TRUE;
207 case SRC_DATA_COMMAND:
208 if (win_with_focus != TUI_DATA_WIN)
209 tui_set_win_focus_to (TUI_SRC_WIN);
211 tui_set_win_focus_to (TUI_DATA_WIN);
212 layout_def->display_mode = SRC_WIN;
213 layout_def->split = FALSE;
215 case DISASSEM_DATA_COMMAND:
216 /* The previous layout was not showing code.
217 This can happen if there is no source
220 1. if the source file is in another dir OR
221 2. if target was compiled without -g
222 We still want to show the assembly though! */
224 addr = tui_get_begin_asm_address ();
225 if (win_with_focus != TUI_DATA_WIN)
226 tui_set_win_focus_to (TUI_DISASM_WIN);
228 tui_set_win_focus_to (TUI_DATA_WIN);
229 layout_def->display_mode = DISASSEM_WIN;
230 layout_def->split = FALSE;
237 * Now update the window content.
239 if (!regs_populate &&
240 (new_layout == SRC_DATA_COMMAND ||
241 new_layout == DISASSEM_DATA_COMMAND))
242 tui_display_all_data ();
244 tui_update_source_windows_with_addr (addr);
248 tui_show_registers (TUI_DATA_WIN->detail.data_display_info.current_group);
253 status = TUI_FAILURE;
258 /* Add the specified window to the layout in a logical way. This
259 means setting up the most logical layout given the window to be
262 tui_add_win_to_layout (enum tui_win_type type)
264 enum tui_layout_type cur_layout = tui_current_layout ();
269 if (cur_layout != SRC_COMMAND &&
270 cur_layout != SRC_DISASSEM_COMMAND &&
271 cur_layout != SRC_DATA_COMMAND)
273 tui_clear_source_windows_detail ();
274 if (cur_layout == DISASSEM_DATA_COMMAND)
275 show_layout (SRC_DATA_COMMAND);
277 show_layout (SRC_COMMAND);
281 if (cur_layout != DISASSEM_COMMAND &&
282 cur_layout != SRC_DISASSEM_COMMAND &&
283 cur_layout != DISASSEM_DATA_COMMAND)
285 tui_clear_source_windows_detail ();
286 if (cur_layout == SRC_DATA_COMMAND)
287 show_layout (DISASSEM_DATA_COMMAND);
289 show_layout (DISASSEM_COMMAND);
293 if (cur_layout != SRC_DATA_COMMAND &&
294 cur_layout != DISASSEM_DATA_COMMAND)
296 if (cur_layout == DISASSEM_COMMAND)
297 show_layout (DISASSEM_DATA_COMMAND);
299 show_layout (SRC_DATA_COMMAND);
308 /* Answer the height of a window. If it hasn't been created yet,
309 answer what the height of a window would be based upon its type and
312 tui_default_win_height (enum tui_win_type type, enum tui_layout_type layout)
316 if (tui_win_list[type] != (struct tui_win_info *) NULL)
317 h = tui_win_list[type]->generic.height;
323 case DISASSEM_COMMAND:
324 if (TUI_CMD_WIN == NULL)
325 h = tui_term_height () / 2;
327 h = tui_term_height () - TUI_CMD_WIN->generic.height;
329 case SRC_DISASSEM_COMMAND:
330 case SRC_DATA_COMMAND:
331 case DISASSEM_DATA_COMMAND:
332 if (TUI_CMD_WIN == NULL)
333 h = tui_term_height () / 3;
335 h = (tui_term_height () - TUI_CMD_WIN->generic.height) / 2;
347 /* Answer the height of a window. If it hasn't been created yet,
348 answer what the height of a window would be based upon its type and
351 tui_default_win_viewport_height (enum tui_win_type type,
352 enum tui_layout_type layout)
356 h = tui_default_win_height (type, layout);
358 if (tui_win_list[type] == TUI_CMD_WIN)
367 /* Function to initialize gdb commands, for tui window layout
370 _initialize_tui_layout (void)
372 add_com ("layout", class_tui, tui_layout_command, _("\
373 Change the layout of windows.\n\
374 Usage: layout prev | next | <layout_name> \n\
376 src : Displays source and command windows.\n\
377 asm : Displays disassembly and command windows.\n\
378 split : Displays source, disassembly and command windows.\n\
379 regs : Displays register window. If existing layout\n\
380 is source/command or assembly/command, the \n\
381 register window is displayed. If the\n\
382 source/assembly/command (split) is displayed, \n\
383 the register window is displayed with \n\
384 the window that has current logical focus.\n"));
387 add_com ("td", class_tui, tui_toggle_layout_command, _("\
388 Toggle between Source/Command and Disassembly/Command layouts.\n"));
389 add_com ("ts", class_tui, tui_toggle_split_layout_command, _("\
390 Toggle between Source/Command or Disassembly/Command and \n\
391 Source/Disassembly/Command layouts.\n"));
396 /*************************
397 ** STATIC LOCAL FUNCTIONS
398 **************************/
401 /* Function to set the layout to SRC, ASM, SPLIT, NEXT, PREV, DATA,
402 REGS, $REGS, $GREGS, $FREGS, $SREGS. */
404 tui_set_layout_for_display_command (const char *layout_name)
406 enum tui_status status = TUI_SUCCESS;
408 if (layout_name != (char *) NULL)
412 enum tui_layout_type new_layout = UNDEFINED_LAYOUT;
413 enum tui_register_display_type dpy_type = TUI_UNDEFINED_REGS;
414 enum tui_layout_type cur_layout = tui_current_layout ();
416 buf_ptr = (char *) xstrdup (layout_name);
417 for (i = 0; (i < strlen (layout_name)); i++)
418 buf_ptr[i] = toupper (buf_ptr[i]);
420 /* First check for ambiguous input. */
421 if (strlen (buf_ptr) <= 1 && (*buf_ptr == 'S' || *buf_ptr == '$'))
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") ||
435 subset_compare (buf_ptr, TUI_GENERAL_SPECIAL_REGS_NAME) ||
436 subset_compare (buf_ptr, TUI_GENERAL_REGS_NAME) ||
437 subset_compare (buf_ptr, TUI_FLOAT_REGS_NAME) ||
438 subset_compare (buf_ptr, TUI_SPECIAL_REGS_NAME))
440 if (cur_layout == SRC_COMMAND || cur_layout == SRC_DATA_COMMAND)
441 new_layout = SRC_DATA_COMMAND;
443 new_layout = DISASSEM_DATA_COMMAND;
445 /* Could ifdef out the following code. when compile with
446 -z, there are null pointer references that cause a
447 core dump if 'layout regs' is the first layout
448 command issued by the user. HP has asked us to hook
449 up this code. - edie epstein */
450 if (subset_compare (buf_ptr, TUI_FLOAT_REGS_NAME))
452 if (TUI_DATA_WIN->detail.data_display_info.regs_display_type !=
454 TUI_DATA_WIN->detail.data_display_info.regs_display_type !=
456 dpy_type = TUI_SFLOAT_REGS;
459 TUI_DATA_WIN->detail.data_display_info.regs_display_type;
461 else if (subset_compare (buf_ptr,
462 TUI_GENERAL_SPECIAL_REGS_NAME))
463 dpy_type = TUI_GENERAL_AND_SPECIAL_REGS;
464 else if (subset_compare (buf_ptr, TUI_GENERAL_REGS_NAME))
465 dpy_type = TUI_GENERAL_REGS;
466 else if (subset_compare (buf_ptr, TUI_SPECIAL_REGS_NAME))
467 dpy_type = TUI_SPECIAL_REGS;
468 else if (TUI_DATA_WIN)
470 if (TUI_DATA_WIN->detail.data_display_info.regs_display_type !=
473 TUI_DATA_WIN->detail.data_display_info.regs_display_type;
475 dpy_type = TUI_GENERAL_REGS;
478 /* End of potential ifdef.
481 /* If ifdefed out code above, then assume that the user
482 wishes to display the general purpose registers .
485 /* dpy_type = TUI_GENERAL_REGS; */
487 else if (subset_compare (buf_ptr, "NEXT"))
488 new_layout = next_layout ();
489 else if (subset_compare (buf_ptr, "PREV"))
490 new_layout = prev_layout ();
492 status = TUI_FAILURE;
494 tui_set_layout (new_layout, dpy_type);
499 status = TUI_FAILURE;
506 extract_display_start_addr (void)
508 enum tui_layout_type cur_layout = tui_current_layout ();
511 struct symtab_and_line cursal = get_current_source_symtab_and_line ();
516 case SRC_DATA_COMMAND:
517 find_line_pc (cursal.symtab,
518 TUI_SRC_WIN->detail.source_info.start_line_or_addr.u.line_no,
522 case DISASSEM_COMMAND:
523 case SRC_DISASSEM_COMMAND:
524 case DISASSEM_DATA_COMMAND:
525 addr = TUI_DISASM_WIN->detail.source_info.start_line_or_addr.u.addr;
537 tui_handle_xdb_layout (struct tui_layout_def *layout_def)
539 if (layout_def->split)
541 tui_set_layout (SRC_DISASSEM_COMMAND, TUI_UNDEFINED_REGS);
542 tui_set_win_focus_to (tui_win_list[layout_def->display_mode]);
546 if (layout_def->display_mode == SRC_WIN)
547 tui_set_layout (SRC_COMMAND, TUI_UNDEFINED_REGS);
549 tui_set_layout (DISASSEM_DATA_COMMAND, layout_def->regs_display_type);
555 tui_toggle_layout_command (char *arg, int from_tty)
557 struct tui_layout_def *layout_def = tui_layout_def ();
559 /* Make sure the curses mode is enabled. */
561 if (layout_def->display_mode == SRC_WIN)
562 layout_def->display_mode = DISASSEM_WIN;
564 layout_def->display_mode = SRC_WIN;
566 if (!layout_def->split)
567 tui_handle_xdb_layout (layout_def);
572 tui_toggle_split_layout_command (char *arg, int from_tty)
574 struct tui_layout_def *layout_def = tui_layout_def ();
576 /* Make sure the curses mode is enabled. */
578 layout_def->split = (!layout_def->split);
579 tui_handle_xdb_layout (layout_def);
584 tui_layout_command (char *arg, int from_tty)
586 /* Make sure the curses mode is enabled. */
589 /* Switch to the selected layout. */
590 if (tui_set_layout_for_display_command (arg) != TUI_SUCCESS)
591 warning (_("Invalid layout specified.\n%s"), LAYOUT_USAGE);
595 /* Answer the previous layout to cycle to. */
596 static enum tui_layout_type
599 enum tui_layout_type new_layout;
601 new_layout = tui_current_layout ();
602 if (new_layout == UNDEFINED_LAYOUT)
603 new_layout = SRC_COMMAND;
607 if (new_layout == UNDEFINED_LAYOUT)
608 new_layout = SRC_COMMAND;
615 /* Answer the next layout to cycle to. */
616 static enum tui_layout_type
619 enum tui_layout_type new_layout;
621 new_layout = tui_current_layout ();
622 if (new_layout == SRC_COMMAND)
623 new_layout = DISASSEM_DATA_COMMAND;
627 if (new_layout == UNDEFINED_LAYOUT)
628 new_layout = DISASSEM_DATA_COMMAND;
637 make_command_window (struct tui_win_info **win_info_ptr, int height, int origin_y)
639 *win_info_ptr = init_and_make_win (*win_info_ptr,
647 (*win_info_ptr)->can_highlight = FALSE;
651 /* make_source_window().
654 make_source_window (struct tui_win_info **win_info_ptr, int height, int origin_y)
656 make_source_or_disasm_window (win_info_ptr, SRC_WIN, height, origin_y);
659 } /* make_source_window */
662 /* make_disasm_window().
665 make_disasm_window (struct tui_win_info **win_info_ptr, int height, int origin_y)
667 make_source_or_disasm_window (win_info_ptr, DISASSEM_WIN, height, origin_y);
670 } /* make_disasm_window */
674 make_data_window (struct tui_win_info **win_info_ptr, int height, int origin_y)
676 *win_info_ptr = init_and_make_win (*win_info_ptr,
687 /* Show the Source/Command layout. */
689 show_source_command (void)
691 show_source_or_disasm_and_command (SRC_COMMAND);
695 /* Show the Dissassem/Command layout. */
697 show_disasm_command (void)
699 show_source_or_disasm_and_command (DISASSEM_COMMAND);
703 /* Show the Source/Disassem/Command layout. */
705 show_source_disasm_command (void)
707 if (tui_current_layout () != SRC_DISASSEM_COMMAND)
709 int cmd_height, src_height, asm_height;
711 if (TUI_CMD_WIN != NULL)
712 cmd_height = TUI_CMD_WIN->generic.height;
714 cmd_height = tui_term_height () / 3;
716 src_height = (tui_term_height () - cmd_height) / 2;
717 asm_height = tui_term_height () - (src_height + cmd_height);
719 if (TUI_SRC_WIN == NULL)
720 make_source_window (&TUI_SRC_WIN, src_height, 0);
723 init_gen_win_info (&TUI_SRC_WIN->generic,
724 TUI_SRC_WIN->generic.type,
726 TUI_SRC_WIN->generic.width,
727 TUI_SRC_WIN->detail.source_info.execution_info->width,
729 TUI_SRC_WIN->can_highlight = TRUE;
730 init_gen_win_info (TUI_SRC_WIN->detail.source_info.execution_info,
736 tui_make_visible (&TUI_SRC_WIN->generic);
737 tui_make_visible (TUI_SRC_WIN->detail.source_info.execution_info);
738 TUI_SRC_WIN->detail.source_info.has_locator = FALSE;;
740 if (TUI_SRC_WIN != NULL)
742 struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
744 tui_show_source_content (TUI_SRC_WIN);
745 if (TUI_DISASM_WIN == NULL)
747 make_disasm_window (&TUI_DISASM_WIN, asm_height, src_height - 1);
748 locator = init_and_make_win (locator,
753 (src_height + asm_height) - 1,
758 init_gen_win_info (locator,
763 (src_height + asm_height) - 1);
764 TUI_DISASM_WIN->detail.source_info.has_locator = TRUE;
766 &TUI_DISASM_WIN->generic,
767 TUI_DISASM_WIN->generic.type,
769 TUI_DISASM_WIN->generic.width,
770 TUI_DISASM_WIN->detail.source_info.execution_info->width,
772 init_gen_win_info (TUI_DISASM_WIN->detail.source_info.execution_info,
778 TUI_DISASM_WIN->can_highlight = TRUE;
779 tui_make_visible (&TUI_DISASM_WIN->generic);
780 tui_make_visible (TUI_DISASM_WIN->detail.source_info.execution_info);
782 if (TUI_DISASM_WIN != NULL)
784 TUI_SRC_WIN->detail.source_info.has_locator = FALSE;
785 TUI_DISASM_WIN->detail.source_info.has_locator = TRUE;
786 tui_make_visible (locator);
787 tui_show_locator_content ();
788 tui_show_source_content (TUI_DISASM_WIN);
790 if (TUI_CMD_WIN == NULL)
791 make_command_window (&TUI_CMD_WIN,
793 tui_term_height () - cmd_height);
796 init_gen_win_info (&TUI_CMD_WIN->generic,
797 TUI_CMD_WIN->generic.type,
798 TUI_CMD_WIN->generic.height,
799 TUI_CMD_WIN->generic.width,
801 TUI_CMD_WIN->generic.origin.y);
802 TUI_CMD_WIN->can_highlight = FALSE;
803 tui_make_visible (&TUI_CMD_WIN->generic);
805 if (TUI_CMD_WIN != NULL)
806 tui_refresh_win (&TUI_CMD_WIN->generic);
809 tui_set_current_layout_to (SRC_DISASSEM_COMMAND);
814 /* Show the Source/Data/Command or the Dissassembly/Data/Command
817 show_data (enum tui_layout_type new_layout)
819 int total_height = (tui_term_height () - TUI_CMD_WIN->generic.height);
820 int src_height, data_height;
821 enum tui_win_type win_type;
822 struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
825 data_height = total_height / 2;
826 src_height = total_height - data_height;
827 tui_make_all_invisible ();
828 tui_make_invisible (locator);
829 make_data_window (&TUI_DATA_WIN, data_height, 0);
830 TUI_DATA_WIN->can_highlight = TRUE;
831 if (new_layout == SRC_DATA_COMMAND)
834 win_type = DISASSEM_WIN;
835 if (tui_win_list[win_type] == NULL)
837 if (win_type == SRC_WIN)
838 make_source_window (&tui_win_list[win_type], src_height, data_height - 1);
840 make_disasm_window (&tui_win_list[win_type], src_height, data_height - 1);
841 locator = init_and_make_win (locator,
851 init_gen_win_info (&tui_win_list[win_type]->generic,
852 tui_win_list[win_type]->generic.type,
854 tui_win_list[win_type]->generic.width,
855 tui_win_list[win_type]->detail.source_info.execution_info->width,
857 init_gen_win_info (tui_win_list[win_type]->detail.source_info.execution_info,
863 tui_make_visible (&tui_win_list[win_type]->generic);
864 tui_make_visible (tui_win_list[win_type]->detail.source_info.execution_info);
865 init_gen_win_info (locator,
872 tui_win_list[win_type]->detail.source_info.has_locator = TRUE;
873 tui_make_visible (locator);
874 tui_show_locator_content ();
875 tui_add_to_source_windows (tui_win_list[win_type]);
876 tui_set_current_layout_to (new_layout);
879 /* init_gen_win_info().
882 init_gen_win_info (struct tui_gen_win_info *win_info, enum tui_win_type type,
883 int height, int width, int origin_x, int origin_y)
887 win_info->type = type;
888 win_info->width = width;
889 win_info->height = h;
892 win_info->viewport_height = h - 1;
893 if (win_info->type != CMD_WIN)
894 win_info->viewport_height--;
897 win_info->viewport_height = 1;
898 win_info->origin.x = origin_x;
899 win_info->origin.y = origin_y;
902 } /* init_gen_win_info */
904 /* init_and_make_win().
907 init_and_make_win (void *opaque_win_info, enum tui_win_type win_type,
908 int height, int width, int origin_x, int origin_y,
911 struct tui_gen_win_info *generic;
913 if (opaque_win_info == NULL)
915 if (tui_win_is_auxillary (win_type))
916 opaque_win_info = (void *) tui_alloc_generic_win_info ();
918 opaque_win_info = (void *) tui_alloc_win_info (win_type);
920 if (tui_win_is_auxillary (win_type))
921 generic = (struct tui_gen_win_info *) opaque_win_info;
923 generic = &((struct tui_win_info *) opaque_win_info)->generic;
925 if (opaque_win_info != NULL)
927 init_gen_win_info (generic, win_type, height, width, origin_x, origin_y);
928 if (!tui_win_is_auxillary (win_type))
930 if (generic->type == CMD_WIN)
931 ((struct tui_win_info *) opaque_win_info)->can_highlight = FALSE;
933 ((struct tui_win_info *) opaque_win_info)->can_highlight = TRUE;
935 tui_make_window (generic, box_it);
937 return opaque_win_info;
942 make_source_or_disasm_window (struct tui_win_info **win_info_ptr, enum tui_win_type type,
943 int height, int origin_y)
945 struct tui_gen_win_info *execution_info = (struct tui_gen_win_info *) NULL;
947 /* Create the exeuction info window. */
949 execution_info = tui_source_exec_info_win_ptr ();
951 execution_info = tui_disassem_exec_info_win_ptr ();
952 execution_info = init_and_make_win (execution_info,
960 /* Now create the source window. */
961 *win_info_ptr = init_and_make_win (*win_info_ptr,
964 tui_term_width () - execution_info->width,
965 execution_info->width,
969 (*win_info_ptr)->detail.source_info.execution_info = execution_info;
973 /* Show the Source/Command or the Disassem layout. */
975 show_source_or_disasm_and_command (enum tui_layout_type layout_type)
977 if (tui_current_layout () != layout_type)
979 struct tui_win_info **win_info_ptr;
980 int src_height, cmd_height;
981 struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
983 if (TUI_CMD_WIN != NULL)
984 cmd_height = TUI_CMD_WIN->generic.height;
986 cmd_height = tui_term_height () / 3;
987 src_height = tui_term_height () - cmd_height;
990 if (layout_type == SRC_COMMAND)
991 win_info_ptr = &TUI_SRC_WIN;
993 win_info_ptr = &TUI_DISASM_WIN;
995 if ((*win_info_ptr) == NULL)
997 if (layout_type == SRC_COMMAND)
998 make_source_window (win_info_ptr, src_height - 1, 0);
1000 make_disasm_window (win_info_ptr, src_height - 1, 0);
1001 locator = init_and_make_win (locator,
1011 init_gen_win_info (locator,
1017 (*win_info_ptr)->detail.source_info.has_locator = TRUE;
1019 &(*win_info_ptr)->generic,
1020 (*win_info_ptr)->generic.type,
1022 (*win_info_ptr)->generic.width,
1023 (*win_info_ptr)->detail.source_info.execution_info->width,
1025 init_gen_win_info ((*win_info_ptr)->detail.source_info.execution_info,
1031 (*win_info_ptr)->can_highlight = TRUE;
1032 tui_make_visible (&(*win_info_ptr)->generic);
1033 tui_make_visible ((*win_info_ptr)->detail.source_info.execution_info);
1035 if ((*win_info_ptr) != NULL)
1037 (*win_info_ptr)->detail.source_info.has_locator = TRUE;
1038 tui_make_visible (locator);
1039 tui_show_locator_content ();
1040 tui_show_source_content (*win_info_ptr);
1042 if (TUI_CMD_WIN == NULL)
1044 make_command_window (&TUI_CMD_WIN, cmd_height, src_height);
1045 tui_refresh_win (&TUI_CMD_WIN->generic);
1049 init_gen_win_info (&TUI_CMD_WIN->generic,
1050 TUI_CMD_WIN->generic.type,
1051 TUI_CMD_WIN->generic.height,
1052 TUI_CMD_WIN->generic.width,
1053 TUI_CMD_WIN->generic.origin.x,
1054 TUI_CMD_WIN->generic.origin.y);
1055 TUI_CMD_WIN->can_highlight = FALSE;
1056 tui_make_visible (&TUI_CMD_WIN->generic);
1059 tui_set_current_layout_to (layout_type);